8086汇编,关于PTR运营商

时间:2013-02-08 12:31:10

标签: assembly x86 x86-16

这可能是简单而愚蠢的,但无论如何我都会问它,因为我似乎无法弄明白。

一个简单的代码段:

 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

我认为它与地址有关,它被一个字节或其他东西移动但我不太确定,我真的需要理解。

提前致谢!

2 个答案:

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

当存储器被读入寄存器时,字节顺序被改变,使得较低的字节占据寄存器中的较低位(“自然”,即所谓的大端)。因此,内存中的00h01h会在寄存器中变为0100h并且01h,内存中的00h会在寄存器中变为0001h

因此,第一个movb00h01h)获取前两个字节,并使ax == 0100h和第二个来自b01h00h)的中间两个字节,并使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

德克