考虑以下标签:
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
我知道在文档等方面可能会有这方面的答案,但我缺乏使用Google找到任何好结果的正确术语。
答案 0 :(得分:2)
dw
声明字,在x86平台上是16位。 eax
的大小为32位(双字)。因此,使用mov eax,[foo]
通常是一个坏主意。
想象一下,你有以下几点:
foo: dw 0x1122
dd 0x33445566
如果eax
mov eax,[foo]
0x55661122
0x1122
,您ax
所获得的内容。 CPU只是读取它在给定地址找到的任何内容,就像它是双字一样(只要你不尝试访问未分配给你程序的数据),而不关心那些数据可能是什么。
如果您想只获得eax
,可以将其读入mov ax,[foo]
(eax
的低位字):0x1122
。请注意,eax
的高位字将保持不变。
如果您希望mov
进入movzx eax,word [foo]
,则应使用foo
:eax
的零扩展变体。这将只读取位于0x33445566
的第一个单词,将其展开为双字,并将结果放在mov eax,[foo+2]
中。
如果您想阅读您已声明的双字(我的示例中为{{1}}),您可以使用{{1}}。
答案 1 :(得分: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
更多访问变体。
访问dword:
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)