8086 组件,关于 PTR 操作员


这可能

简单而愚蠢,但我还是会问它,因为我似乎无法弄清楚。

一个简单的代码片段:

 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 - 字节00h01h00h00h因为在 x86 上,较低的字节存储在较低的地址(所谓的小字节序(。

当内存被读入寄存器时,字节顺序被改变,使得较低的字节占据寄存器中的较低位("自然",所谓的大端序(。所以00h,内存中的01h在寄存器内被转换成0100h01h,内存中的00h被转换成寄存器内部的0001h

所以第一个movb(00h01h(获取前两个字节,并产生ax==0100h,第二个从b(01h00h(获取中间的两个字节,并产生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

最新更新