8086CPU中的標號與變量


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,?表示開始定義時沒有具體的數據,實際數據是隨機的,開機是多少就是多少。

上面語句中,語句由三部分組成,而分號后還可以加注釋,所以語句最多由四部分組成

  1. 變量名
  2. 助記符
  3. 操作數
  4. 注釋
NEXT:mov AX,BX 
     ...
     ADD AX,DAT
     JZ NEXT

執行過程:將BX的值送給AX,再將AX和DAT相加后結果送給AX,如果和為0,就跳到mov AX,BX這條語句重新執行。JZ后面是目的地的地址。對於程序員來說,這個地址很難的出來,我們可以將其符號化。

NEXT為mov AX,BX這條語句在存儲器中的地址的符號名字,必須以冒號結尾,我們稱為標號名。

可以看出,標號是對指令的地址取一個別名,而變量是對存儲單元的地址取一個別名。

標號

標號一旦定義了,就具有三個屬性:

  1. 段地址屬性
  2. 段內偏移地址屬性
  3. 類型:NEAR和FAR

類型分為兩種,如果 JZ 轉移指令和目的地地址在同一個代碼段,就是段內轉移,段內轉移類型就是NEAR,近程轉移,標號在8086里面被賦予-1的值。

不在同一個代碼段就是段間轉移,也叫遠程轉移,類型是FAR,8086中被賦予-2的值。

但是獲取一個標號的類型屬性是沒有意義的。

可以使用 屬性表達式 獲取標號的屬性

  1. 段地址屬性:SEG
  2. 段內偏移地址屬性:OFFSET
  3. 類型:TYPE

mov BX,OFFSET NEXT

OFFSET NEXT獲取標號所代表的段內偏移地址,是個常數,標號一旦定義就無法更改,是不變的。

變量及其定義偽指令

變量是CPU可操作的一段存儲空間,可以讀寫,而標號不行。

DB:定義字節型變量

DW:定義字型變量

DD:定義雙字型變量

一般變量定義在數據段DS,如

data1 DB 12H,12

變量一旦定義了,就具有5個屬性

  1. 段地址屬性
  2. 段內偏移地址屬性
  3. 類型
  4. 長度
  5. 大小

8086對變量類型的值,等於其所占存儲單元,比如DB類型就是1,DW類型就是2

可以使用 屬性表達式 獲取標號的屬性

  1. 段地址屬性:SEG
  2. 段內偏移地址屬性:OFFSET
  3. 類型:TYPE
  4. 長度:LENGTH
  5. 大小: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

這條就對了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM