【问题标题】:What does 0x4 do in "movl $0x2d, 0x4(%esp)"?0x4 在 "movl $0x2d, 0x4(%esp)" 中做了什么?
【发布时间】:2011-01-24 02:34:56
【问题描述】:

我正在研究 GCC 生成的汇编代码。但我不明白:

movl $0x2d, 0x4(%esp)

在第二个操作数中,0x4 代表什么?偏移地址?以及寄存器EAX有什么用?

【问题讨论】:

  • 表示内存[ESP_REG + 4] = 0x2d;

标签: c assembly x86 gnu-assembler


【解决方案1】:

movl $0x2d, 0x4(%esp) 表示获取堆栈指针的当前值 (%esp),加 4 (0x4) 然后将长(32 位)值 0x2d 存储到该位置。

eax 寄存器是通用 32 位寄存器之一。 x86 架构指定以下 32 位寄存器:

eax  Accumulator Register
ebx  Base Register
ecx  Counter Register
edx  Data Register
esi  Source Index
edi  Destination Index
ebp  Base Pointer
esp  Stack Pointer

其中一些的名称和用途可以追溯到 Intel 8080 的时代。

This page 很好地概述了 Intel 类型的寄存器。上面列表中的前四个也可以作为 16 位或两个 8 位值访问。例如:

3322222222221111111111
10987654321098765432109876543210
<-             eax            ->
                <-     ax     ->
                <- ah -><- al ->

指针和索引寄存器不允许使用 8 位部分,但您可以使用例如 16 位 bp

【讨论】:

  • +1 - 'AT&T' 表示法不是 Intel 表示法,这是 gcc 输出的,即源和目标从 Intel 表示法交换
  • 并且英特尔表示法不需要运算符的字段长度,即 mov,而不是 movl。但是,非常有用的答案 - +1。
【解决方案2】:

0x4(%esp) 表示 *(%esp + 4) 其中* 表示取消引用。

该语句表示将立即数 0x2d 存储到某个局部变量中,该变量占用堆栈的第 4 个偏移量。

(您显示的代码采用 AT&T 语法。在 Intel 语法中,它将是 mov [esp, 4], 2dh

【讨论】:

    【解决方案3】:

    第二个操作数中的0x4 是括号中寄存器值的偏移量。 EAX 是用于汇编编码(计算、存储临时值等)的通用寄存器。正式名称为“累加器寄存器”,但它的历史意义大于相关性。

    您可以阅读this page 关于 x86 架构的信息。与您的问题最相关的是关于寻址模式通用寄存器

    的部分

    【讨论】:

      【解决方案4】:

      GCC 汇编操作数跟在字节 (b)、字 (w)、长 (l) 等之后,例如:

      移动 电影 移动

      寄存器以百分号 (%) 为前缀。

      常量以美元符号 ($) 为前缀。

      在您问题的上述示例中,这意味着距堆栈指针 (esp) 的第四个偏移量。

      希望这会有所帮助, 最好的祝福, 汤姆。

      【讨论】:

        【解决方案5】:

        您正在访问从堆栈指针所在的位置删除四个字节的内容。在 GCC 中,这表示一个参数(如果我没记错的话,我认为正偏移是参数,负是局部变量)。换句话说,您正在将值 0x2D 写入参数。如果您提供更多上下文,我可能会告诉您整个过程中发生了什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-18
          • 1970-01-01
          • 2011-07-24
          • 2011-01-31
          • 2021-07-02
          相关资源
          最近更新 更多