简单而愚蠢,但我还是会问它,因为我似乎无法弄清楚。
一个简单的代码片段:
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
我想它与地址有关,它被一个字节或其他东西移动了,但我并不完全确定,我真的需要了解。
提前感谢!
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
。
想将一个即时值写入 ram 位置时,我们才需要指定字节数。否则,我们的汇编程序使用 registersize 来确定我们要访问多少字节。
除了使用 MASM 使用 dword 访问之外,我们还需要 DWORD PTR 的声明,如果我们想要 dword 访问,例如将 EAX 的内容写入 ram 位置,或将 dword 从 ram 位置读取到 EAX 中。与所有其他 32 位寄存器相同。
我认为最好使用定义字节 (DB( 表示法声明一个命名的 ram 位置,如果我们想要具有字节、单词和/或 dword 访问的多重访问。
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
使用即时值:
mov byte ptr[b], 0
mov word ptr[b], 256
mov dword ptr[b], 256
dagger