2013-02-08 62 views
1

这可能是简单而愚蠢的,但我会问它,因为我似乎无法弄清楚。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 

我想这事做的地址,它是由一个字节或东西感动,但我不是很确定,我真的需要理解。

在此先感谢!

+0

那么,你的问题是什么? – 2013-02-08 12:33:05

+0

这与C – Ulterior 2013-02-08 12:33:44

+0

中的指针解引用相同我很抱歉模糊不清。我的问题是为什么bx:= 1?由于b的内容是256,而b + 1是257?考虑到mov应该处理内容而不是地址。为什么mov bx,word ptr b + 1导致bx:= 1? – 2013-02-08 12:34:37

回答

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得到的前两个字节从b00h01h)并且使得ax == 0100h,第二个从b01h00h)得到的中间两个字节并使得bx == 0001h

+0

是的,这的确是它!非常感谢您的耐心 – 2013-02-08 12:41:26

0

只有当我们想立即写入ram位置时,我们才需要指定字节数。 否则,我们的汇编程序使用寄存器大小来确定我们想要访问的字节数。

除了使用使用MASM的dword访问外,我们还需要声明DWORD PTR,如果我们需要dword访问,例如将EAX的内容写入ram位置或从ram位置读取dword进入EAX。与所有其他32位寄存器相同。

我认为如果我们想要使用字节,单词和/或dword访问的多重访问,最好使用定义字节(DB)表示法声明一个命名的ram位置。

b DB 0, 1, 0, 0 

的registersize是众所周知的,我们并不需要指定:

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 

德克