Nasm如何在特定标签下访问dds和dws?

时间:2014-08-06 07:00:34

标签: assembly x86 nasm addressing

考虑以下标签:

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找到任何好结果的正确术语。

2 个答案:

答案 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],则应使用fooeax的零扩展变体。这将只读取位于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)