2015-02-24 42 views
0

我试图理解这个指令:试图在上下文w中理解这个指令。段寄存器

0x80496fa <yellow_preflight+18>:  mov eax,ds:0x804c220 

,这些都是在运行时的寄存器值:

EAX: 0x000000D2 EBX: 0xB7FB6FF4 ECX: 0xBFFFF438 EDX: 0xBFFFF3A4 o d I t S z A P c 
    ESI: 0x00000000 EDI: 0x00000000 EBP: 0xBFFFF468 ESP: 0xBFFFF450 EIP: 0x080496FF 
    CS: 0073 DS: 007B ES: 007B FS: 0000 GS: 0033 SS: 007B 

所以对我的理解,如果这只是一个普通的MOV指令W/O源地址中的前缀 'ds:'。然后eax应该保持'0x0804c220' 值。但是当我进一步执行时,eax的值变为

EAX: 0xB7FB7440 

而不是预期值。所以我试图找到这种行为的解释。提前致谢。

+1

这是x86汇编,对不对? – 2015-02-24 18:24:13

+0

@ScottHunter jap那 – Dirk 2015-02-24 18:26:48

回答

1

ds:是所谓的段超驰前缀

例如,假设你写下这在你的源代码(NASM语法):

mov eax, [0x804c220] 

您没有使用段前缀,但是汇编器将使用默认段为这样的记忆访问,ds(数据段)。它会改变你的代码,这对自己:

 mov eax, [ds:0x804c220]

这就是为什么在源代码中使用ds:前缀将使您的示例中没有什么区别。但是,当您使用不同的段覆盖前缀时,它会有所作为。例如,在这种情况下,汇编器将使用fs,而不是默认ds段:

 mov eax, [fs:0x804c220]

0

ds:0x804c220是一个地址;该指令将该地址处的值移动到eax

+0

哈哈谢谢* g *。但是这意味着ds:前缀对地址没有任何影响?那么为什么你会写这样的代码,而不是简单地跳过'ds:'前缀? – Dirk 2015-02-24 18:35:01