8086中匯編語句的種類
指令語句
凡是CPU能執行的語句,或者說能匯編成指令代碼的語句。
偽指令語句
CPU不能執行的語句,或者說不能匯編成指令代碼的語句。
如前面提到過的偽指令 \(DB\),只是告訴masm.exe在匯編的過程中執行的操作:在匯編時定義一個字節數據。而不是告訴CPU要去執行什么。
宏指令語句
本身是8086指令系統沒有的語句,是用戶用 宏定義偽指令 定義的一條新的語句。
匯編語言中語句的組成
如
data1 DW 1234H,5678H
data1是將存儲單元的地址符號化,起一個符號名字,方便程序設計。data1表示的就是定義的這段存儲空間的首地址,稱為變量名。和標號名不同。
DW表示的是定義的是字變量,其后的每個逗號隔開的為一個字數據,也就是占兩個存儲單元.data1表示這兩個字數據的首地址,(1234H/5678H各占用一個字空間,所以12/34/56/78各占用一個字節)低位數據放在低地址,用字低字節所對應的地址當作整個字的地址,存放情況如下圖所示:
data1-------->34H
data1+1----->12H
data1+2----->78H
data1+3----->56H
如果按字訪問第二個數據,可以MOV AX,data1+2
data2 DW ?
data2 DW ?定義了一個字空間,首地址變量名為data2,?表示開始定義時沒有具體的數據,實際數據是隨機的,開機是多少就是多少。
上面語句中,語句由三部分組成,而分號后還可以加注釋,所以語句最多由四部分組成
- 變量名
- 助記符
- 操作數
- 注釋
NEXT:mov AX,BX
...
ADD AX,DAT
JZ NEXT
執行過程:將BX的值送給AX,再將AX和DAT相加后結果送給AX,如果和為0,就跳到mov AX,BX這條語句重新執行。JZ后面是目的地的地址。對於程序員來說,這個地址很難的出來,我們可以將其符號化。
NEXT為mov AX,BX這條語句在存儲器中的地址的符號名字,必須以冒號結尾,我們稱為標號名。
可以看出,標號是對指令的地址取一個別名,而變量是對存儲單元的地址取一個別名。
標號
標號一旦定義了,就具有三個屬性:
- 段地址屬性
- 段內偏移地址屬性
- 類型:NEAR和FAR
類型分為兩種,如果 JZ 轉移指令和目的地地址在同一個代碼段,就是段內轉移,段內轉移類型就是NEAR,近程轉移,標號在8086里面被賦予-1的值。
不在同一個代碼段就是段間轉移,也叫遠程轉移,類型是FAR,8086中被賦予-2的值。
但是獲取一個標號的類型屬性是沒有意義的。
可以使用 屬性表達式 獲取標號的屬性
- 段地址屬性:SEG
- 段內偏移地址屬性:OFFSET
- 類型:TYPE
如
mov BX,OFFSET NEXT
OFFSET NEXT獲取標號所代表的段內偏移地址,是個常數,標號一旦定義就無法更改,是不變的。
變量及其定義偽指令
變量是CPU可操作的一段存儲空間,可以讀寫,而標號不行。
DB:定義字節型變量
DW:定義字型變量
DD:定義雙字型變量
一般變量定義在數據段DS,如
data1 DB 12H,12
變量一旦定義了,就具有5個屬性
- 段地址屬性
- 段內偏移地址屬性
- 類型
- 長度
- 大小
8086對變量類型的值,等於其所占存儲單元,比如DB類型就是1,DW類型就是2
可以使用 屬性表達式 獲取標號的屬性
- 段地址屬性:SEG
- 段內偏移地址屬性:OFFSET
- 類型:TYPE
- 長度:LENGTH
- 大小:SIZE
長度是在變量定義語句中,所定義的變量的個數(DUP重復次數,沒有DUP長度屬性就是1)
大小就是所有變量所占的總的字節數。
data1 DB 12H
mov AL,TYPE data1
AL值就是1
操作數表達式是在匯編過程完成,等效於mov AL,1
data2 DB ?
data3 DW data2
data3代表的存儲空間里面放的是data2的單字屬性,段內偏移地址
data4 DD data2
data4放的是data2的雙字屬性,段地址加段內偏移地址屬性
后面尋址方式詳解。
data5 DB 4 DUP(?)
DUP是重復操作符,DUP左邊數字表示重復4次,開拓了4個字節空間,初始放入的是隨機的數據,第一個字節地址可以用data5表示。
匯編語言允許DUP嵌套操作。
data5 DB 7 DUP(4 DUP(?))
將4 DUP(?)操作又重復7次。
data1 DB 12,12H,-12
...
mov AX,data1
將data1地址中的內容送給AX。
但這條語句匯編會出錯,因為AX是16位,data1是字節數據,前后類型不一致。需要類型轉換。
在8086匯編語言中,提供了 \(PTR\) 強制轉換。
可以改為
data1 DB 12,12H,-12
...
mov AX,WORD PTR data1
AX中內容就為120CH, 但是data1離開這條語句后仍然是字節型變量。
PTR是屬性臨時修改操作符。在實際匯編語言中用的很多。
mov [BX],10H
將10H送給按BX內容間接尋址的一個存儲空間,但是[BX]無法推斷出該空間的類型(字節/字/雙字?),后面的10H是個常數,顯然也沒有類型,所以這條語句是有問題的,匯編錯誤——類型不明確。
假如這個單元是字節單元,我們可以用PTR說明:
mov BYTE PTR [BX],10H
這條就對了。