这可能是简单和愚蠢的,但我仍然会问它,因为我似乎不能弄明白它。
一个简单的代码片段:
assume cs:code, ds:data
data segment
b dd 256
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,word ptr b -> the result of this operation will be ax:= 256 (100h)
mov bx,word ptr b+1 -> while this is going to be bx:= 1
我猜它与地址有关,它被一个字节或其他什么东西移动了,但我不是很确定,我真的需要理解。
提前感谢!
发布于 2013-02-08 12:35:01
这
mov ax,word ptr b
格式如下时更容易理解:
mov ax, word ptr [b]
其具有将地址b
处的字复制到ax中的效果。所以这就是
mov bx,word ptr b+1
其实就是
mov bx,word ptr [b+1]
其具有将地址b+1
处的字复制到bx中的效果。
现在,dd
指示分配一个双字,并将256赋给它。十六进制的256表示为00000100h
。双字将像这样被分配在存储器中- 00010000h
- bytes 00h
,01h
,00h
,00h
,因为在x86上,较低的字节存储在较低的地址(所谓的低端)。
当内存被读入寄存器时,字节顺序被改变,使得低位字节占据寄存器中的低位(“自然”,即所谓的高字节顺序)。因此,内存中的00h
,01h
被转换为寄存器内的0100h
,而内存中的01h
,00h
被转换为寄存器内的0001h
。
因此,第一个mov
从b
(00h
,01h
)获得前两个字节,并使ax
==0100h
,第二个从b
(01h
,00h
)获得后两个字节,使bx
==0001h
。
发布于 2014-01-07 10:43:58
只有当我们想要将立即值写入ram位置时,我们才需要指定字节数。否则,我们的汇编程序使用registersize for来确定我们想要访问的字节数。
除了使用MASM使用dword访问之外,我们还需要DWORD PTR的声明,如果我们想要dword访问,例如将EAX的内容写入到ram位置,或者从ram位置读取dword到EAX。与所有其他32位寄存器相同。
我认为,如果我们想要一个字节、字和/或双字访问的多路访问,最好使用定义字节(DB)表示法来声明一个命名的ram位置。
b DB 0, 1, 0, 0
寄存器大小是众所周知的,我们不需要指定:
mov al, [b]
mov [b], al
mov bl, [b+1]
mov [b+1], bl
mov ax, [b]
mov [b], ax
mov bx, [b+1]
mov [b+1], bx
除MASM外:
mov eax, dword ptr[b]
mov dword ptr[b], eax
使用imediate值:
mov byte ptr[b], 0
mov word ptr[b], 256
mov dword ptr[b], 256
德克
https://stackoverflow.com/questions/14772656
复制