2013-02-08 60 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 

德克