这可能是简单而愚蠢的,但无论如何我都会问它,因为我似乎无法弄明白。
一个简单的代码段:
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
我认为它与地址有关,它被一个字节或其他东西移动但我不太确定,我真的需要理解。
提前致谢!
答案 0 :(得分:9)
此
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
。 dword将在内存中分配,如00010000h
- 字节00h
,01h
,00h
,00h
,因为在x86较低的字节存储在较低的地址(所谓的小端。)。
当存储器被读入寄存器时,字节顺序被改变,使得较低的字节占据寄存器中的较低位(“自然”,即所谓的大端)。因此,内存中的00h
,01h
会在寄存器中变为0100h
并且01h
,内存中的00h
会在寄存器中变为0001h
。
因此,第一个mov
从b
(00h
,01h
)获取前两个字节,并使ax
== 0100h
和第二个来自b
(01h
,00h
)的中间两个字节,并使bx
== 0001h
。
答案 1 :(得分:0)
只有当我们想要将一个立即值写入ram位置时,我们才需要指定字节数。 否则我们的汇编器使用registersize来确定我们想要访问的字节数。
除了使用MASM使用双字访问之外,我们还需要声明DWORD PTR,如果我们想要一个双字访问,例如将EAX的内容写入ram位置,或者从ram位置读取dword EAX。与所有其他32位寄存器相同。
我认为如果我们想要一个带字节,字和/或双字访问的多重访问,最好使用define bytes(DB)表示法声明一个命名的ram位置。
b DB 0, 1, 0, 0
registerize是众所周知的,我们不需要指定:
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
使用中级值:
mov byte ptr[b], 0
mov word ptr[b], 256
mov dword ptr[b], 256
德克