什么" movl $ 0x4050,(%eax)"做?

时间:2014-11-26 21:23:19

标签: assembly x86

让我们说寄存器%eax包含地址0x100,在地址0x100处有一个值0x3999。

根据我的理解"%eax"返回地址,例如movl $ 0x4050,%eax,在地址0x100处移动值0x4050。

但"(%eax)"返回地址处的值,即0x3999。那么movl $ 0x4050,(%eax)做什么呢?是否将常量0x3999视为地址?

2 个答案:

答案 0 :(得分:2)

如果您熟悉C,请按照以下方式考虑:

movl $0x100, %eax     // int* eax = (int*)0x100;
movl $0x4050, (%eax)  // *eax = 0x4050;

movl $0x4050, %eax只需使用值%eax覆盖0x4050。在这种情况下,没有任何东西被解释为地址。

答案 1 :(得分:1)

一般不要考虑包含地址的寄存器,想一想包含值的寄存器。如果在某些情况下使用这些值,则可将这些值视为地址。

%eax只是一个表达式,它引用了名为eax的寄存器。即使我开始以不同的方式编写此段落,%eax也与0x100不同,即使寄存器%eax包含值0x100也是如此。它取决于您为寄存器命名的上下文,该寄存器的值是否相关。

现在,您将括号括在表达式周围,表示您正在讨论内存位置,其地址是表达式的。在仅使用表达式的值的上下文中,命名寄存器的表达式可以由具有与寄存器相同的值的常量表达式替换。在这种情况下,(%eax)等同于($0x100)(如果您可以这样写),即地址0x100处的内存位置。默认情况下,GNU汇编器使用的AT& T语法允许您只编写0x100而不是($0x100)来引用地址0x100处的内存位置。如果指令要访问内存,则需要告诉该指令,它应该访问哪个位置。请注意,我没有谈到访问内存的方式,因为这取决于具体的指令。

现在,你在谈论movl $0x4050, (%eax)。因此,移动指令的第二个操作数中提到了内存位置。在AT& T语法中,这是移动指令的目标操作数。在这种情况下,移动指令的目标是:" 内存位置位于%eax"中存储的所指示的地址处。 ,所以如果%eax是0x100,那么移动的目标是内存位置,地址为0x100"。请注意,到目前为止,我们还没有谈到该内存位置的内容,只是关于位置本身。 mov指令(您必须了解任何指令的这些细节)不关心存储在目标操作数指示的位置的值,但它将存储值的副本由第二个操作数指示的 location 处的源操作数的值,覆盖先前的值。因此存储在地址0x100的0x3999根本不重要,但在执行之后,它已被0x4050替换。