8086cpu的指令,可以處理兩種尺寸的資料,
byte
和word
。所以在機器指令中要指明,指令進行的是字操作還是位元組操作。對於這個問題,組合語言中用一下方法處理。
(1)通過暫存器名指明要處理的資料的尺寸。
例如:下面的指令中,暫存器指明了指令進行的是字操作:
mov ax,1
mov bx,ds:[0]
mov ds,ax
mov ds:[0],ax
inc ax
add ax,1000
下面的指令中,暫存器指明了指令進行的是位元組操作:
mov al,1
mov al,bl
mov al,ds:[0]
mov ds:[0],al
inc al
add al,100
(2)在沒有暫存器名存在的情況下,用操作符
x ptr
指明記憶體單元的長度,
x在彙編指令中可以為
word
或byte
。例如:
下面的指令中,用word ptr
指明了指令訪問的記憶體單元是乙個字單元:
mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2
下面的指令中,用byte ptr
指明了指令訪問的記憶體單元是乙個字單元:
mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2
在沒有暫存器參與的記憶體單元訪問指令中,用word prt
或byte ptr
顯性地指明所要訪問的記憶體單元的長度是很必要的。否則,
cpu無法得知所要訪問的單元,還是位元組單元。
假如我們用debug
檢視記憶體的結果如下:
2000:1000 ff ff ff ff ff ff ......
那麼指令:
mov ax,2000h
mov ds,ax
mov byte ptr [1000h],1
將使記憶體中的內容變為:
2000: 1000 01 ff ff ff ff ff ......
而指令:
mov ax,2000h
mov ds,ax
mov word ptr [1000h],1
將使記憶體中的內容變為:
2000:
1000 01 00 ff ff ff ff ......
這是因為 mov byte ptr [1000h],1
訪問的是位址為
ds:1000h
的位元組單元,修改的是
ds:1000h
單元的內容;而
mov word ptr [1000h],1
訪問的是位址為
ds:1000h
的字單元,修改的是
ds:1000h
和 ds:1001h
兩個單元的內容。
ptr用來指出運算元的型別或尺寸
,通常用在跳轉
/調子程式或定址。定址時用來指明是
byte
、word
還是dword,
跳轉時則是
far或
near。(3
) 其他方法
有些指令預設了訪問的是字單元還是位元組單元,比如:push [1000h]
就不用指明訪問的是字單元還是位元組單元,因為
push
指令只進行字操作。
1 關於dword ptr 指令
8086cpu的指令,可以處理兩種尺寸的資料,byte 和word 所以在機器指令中要指明,指令進行的是字操作還是位元組操作。對於這個問題,組合語言中用一下方法處理。1 通過暫存器名指明要處理的資料的尺寸。例如 下面的指令中,暫存器指明了指令進行的是字操作 mov ax,1 mov bx,ds 0 ...
關於dword ptr 指令的意思
dword 雙字 就是四個位元組 ptr pointer縮寫 即指標 裡的資料是乙個位址值,這個位址指向乙個雙字型資料 比如mov eax,dword ptr 12345678 把記憶體位址12345678中的雙字型 32位 資料賦給eax贊同 5 指令要處理的資料有多長?cpu的指令,可以處理兩種...
關於編譯指令
自定義條件識別符號 define 下面例子中自定義了條件識別符號 bbbbb 識別符號和定義它的指令都不區分大小寫,但大家一般慣用大寫.begin showmessage 識別符號 bbbbb 已定義 showmessage 識別符號 bbbbb 未定義 end 測試預定義的 debug 和 rel...