0

考虑以下标签:

foo:
    dw 0
    dd 0

现在如何从另一个标签访问标签dd下的双字或(字?) ?foo

bar: ;Subroutine
    mov eax, [foo] ;Now how can I move the value stored in foo's dw into eax for example?
                   ;I assume this isn't the correct way?
    add eax, 01h   ;Do something with the value
    mov [foo], eax ;Store it back into foo's dw
    ret

我知道在文档等中可能有对此的答案,但我缺乏正确的术语来使用谷歌找到任何好的结果。

4

2 回答 2

3

dw声明一个word,在 x86 平台上是 16 位。的大小eax为 32 位(一个双字)。因此,使用mov eax,[foo]通常是一个坏主意。

想象一下,您有以下内容:

foo: dw 0x1122
     dd 0x33445566

eax如果你这样做,你会得到mov eax,[foo]什么0x55661122。CPU 只是读取它在给定地址找到的任何内容,就好像它是一个双字一样(只要您不尝试访问未分配给您的程序的数据),而不关心该数据可能是什么。

如果你想得到只是0x1122你可以把它读成ax(低位词eaxmov ax,[foo]:。请注意,上面的单词eaxwill 保持不变。

如果你想0x1122进入,你应该使用:eax的零扩展变体。这将只读取位于 的第一个字,将其零扩展为双字,并将结果放入.movmovzx eax,word [foo]fooeax

如果你想阅读你声明的双字(0x33445566在我的例子中),你会使用mov eax,[foo+2].

于 2014-08-06T08:32:03.270 回答
1

数据段:

foo dw 0
    dd 0
    db 0,0

代码段:

bar:
xor eax, eax  ; set eax to zero
mov ax, [foo] ; get a word from DS:foo into ax (low word of EAX)

add eax, 01h
mov [foo], ax ; Store it back into foo's dw
ret

更多的访问变体。

访问一个双字:

mov eax, [foo+2] ; get a dword word from DS:foo+2 into eax
mov [foo+2], eax ; Store it back

访问一个字节:

mov al, [foo+6] ; get a byte from DS:foo+6 into al (low byte of ax)
于 2014-08-06T08:42:32.660 回答