1.指令中的運算元
電腦指令是由
作業碼和
運算元兩部分組成,作業碼用來指出指令要完成的功能,運算元則給出了指令操作處理的對象。
指令中運算元類型劃分如下:
- 按照指令處理過程:源運算元和目的運算元。
- 按照一條指令所包含的運算元:零運算元、單運算元和雙運算元。
- 按照運算元的存放地區:立即運算元、寄存器運算元、儲存空間運算元、IO連接埠運算元。
源運算元:為指令的執行提供運算元,指令執行後其值保持不變。
目的運算元:為指令的執行提供運算元,指令執行後還要存放其結果,因此,目的運算元的原值不被保留。
零運算元:指令中不需要運算元,或者是運算元隱藏了。通常是一些處理器控制指令。
單運算元:指令只需要一個運算元,通常它既是源運算元,也是目的運算元。
雙運算元:指令中含有兩個運算元,一個是源運算元,另一個是目的運算元。兩種運算元的定址方式可以不同。
立即運算元:該運算元作為指令代碼的一部分出現在指令中。在指令中只能做源運算元。立即運算元可以寫成二進位(B)、十進位(D)、十六進位(H)。
寄存器運算元:寄存器運算元是把運算元存放在寄存器中,既可以做源運算元,也可以做目的運算元。
儲存空間運算元:儲存空間運算元是把運算元存放在記憶體中的某個單元中。在彙編指令中,以某種方式給出儲存單元的地址。在程式中使用的是儲存單元的邏輯地址。邏輯地址是由段基址和位移量組成。段基址一般是隱含給出的,也可以用段首碼形式給出。位移量也稱為有效地址,用EA表示。
IO連接埠運算元:這是指運算元存放在輸入輸出連接埠的寄存器中。根據定址方式的不同,在彙編指令中以不同的形式給出連接埠地址。
2定址方式
8086的定址方式如下:
立即數定址方式、寄存器定址方式、儲存空間定址方式。
其中,儲存空間定址方式還包括:
直接定址方式
寄存器間接定址方式
寄存器相對定址方式
基址變址定址方式
相對基址變址定址方式
串操作定址
連接埠定址
//////////////////////////////////////////////////////////////////////////////////////
立即數定址方式:立即數定址的運算元是一個立即數,它直接包含在代碼中,緊跟在作業碼之後,與作業碼一起存放在程式碼片段中。立即數運算元只能作為源運算元,因此當一條指令的源運算元是立即數,目的運算元就必須是寄存器或者儲存空間運算元了。
其彙編指令格式如:
MOV AX, 2000H
MOV [BX], 10
立即數定址主要用於給寄存器或儲存單元賦初值,它可是是一個運算數,也可以是一個地址值。
寄存器定址方式:指令中所需要的運算元在CPU的某個寄存器中。這類運算元的存取完全在CPU內部進行,不需要執行匯流排周期,所以執行速度快。寄存器定址在彙編指令中直接寫出了存放運算元的寄存器名。
其彙編指令格式如下:
MOV AX, BX
MOV CL, BL
儲存空間定址方式:指令中的運算元都在儲存空間中,它又有多種定址方式,定址方式不同,有效地址(EA)的表達方法也不同。儲存空間定址就是根據不同的定址方式確定運算元的有效地址及隱含的段基址,從而形成物理地址,來對儲存單元進行讀寫操作。
直接定址方式:直接定址方式的有效地址在指令中直接給出,預設的段基址是DS段寄存器。用中括弧包含有效地址,表達儲存單元的內容。
有效地址=16位位移量
組合語言格式如下:
MOV AX, [2010H] ;AX <--- DS:[2010H] // DS:[2010H] = DS<<4 + 2010H
MOV [1010H], AL ;DS:[1010H] <--- AL
MOV BX, ES:[3020H] ;BX <--- ES:[3020H]
寄存器間接定址方式:運算元的有效地址都在CPU的寄存器中,由於有效地址是16位,因此這種定址方式必須使用16位的寄存器。8086規定用於間接定址的寄存器為SI,DI,BX,BP。在用SI,DI,BX間接定址時,隱含的基地址在DS,用BP間接定址時,隱含的基地址在SS。可以用加段首碼的方法改變這種隱含關係。
這種定址方式實際上是把位移量事先存放在間接定址的寄存器中。在程式中通過修改寄存器的內容,可以達到訪問不同單元的目的。
有效地址=BX/BP/SI/DI的內容
組合語言格式如下:
MOV AX, [BX] ;源運算元的物理地址=DS<<4+BX
MOV [BP], BL ;目的運算元的物理地址=SS<<4+BP
MOV CL, SS:[SI] ;源運算元的物理地址=SS<<4+SI
寄存器相對定址方式:運算元的有效地址是由指令中指定的一個寄存器的內容和指令中給定的一個8位或者16位的位移量(e)相加後得到。
有效地址=BX/BP/SI/DI的內容+8/16位位移量
寄存器相對定址方式有如下表示格式:
e[BX/BP/SI/DI
], [BX/BP/SI/DI
]e, [BX/BP/SI/DI+e
]
組合語言格式如下:
MOV AX, 5[BX]
MOV BL, VAL[SI]
MOV 10H[BP], 10H
MOV DS:2[BP], AL ;DS<<4+BP+2
基址變址定址方式:運算元的有效地址是由指令指定的一個基底位址暫存器(BX/BP)的內容加上一個變址寄存器(SI/DI)的內容。
有效地址=BX/BP + SI/DI
基址變址定址方式格式如下:
[BX/BP
][SI/DI
], [BX/BP + SI/DI
]
注意:在一條指令中,基底位址暫存器(BX/BP)只能出現一個,變址寄存器(SI/DI)也只能出現一個。段基址的隱含指定只與基底位址暫存器有關。當選用BX時,段基址是DS,當選用BP時,段基址是SS。
彙編指令格式如下:
MOV AX, [BX][DI]
MOV AL, [BP][SI]
相對基址變址定址方式和寄存器相對定址方式類似:
有效地址=BX/BP + SI/DI+
8/16位位移量
串操作定址:串操作定址專門用於串操作指令。串指的是一個字串或一組資料,存放在連續的記憶體單元中。對串地址連續的資料操作時,用專門的串操作指令。定址時隱含的使用變址寄存器SI,DI。
用SI做源串的地址指標,存放來源資料串地址的位移量,段基地址隱含在DS。
用DI做源串的地址指標,存放來源資料串地址的位移量,段基地址隱含在ES。
串操作指令在執行過程中能自動修改變址寄存器SI和DI的內容,使之成為資料串中下一個資料的地址。修改地址時是按照增量還是減量修改取決於標誌寄存器中的方向標誌位DF。DF=0時增量修改,DF=1時減量修改。
由於串是採用的隱含定址方式,因此在串操作指令中只有作業碼的助記符,無運算元。如串操作指令:MOVSB
指令中沒有運算元,但實際是是對DS:[SI]為地址的源運算元和ES:[DI]為地址的目的運算元進行操作。
MOVSB:字串傳送指令,這條指令按位元組傳送資料。通過SI和DI這兩個寄存器控制字元串的源地址和目標地址,比如DS:SI這段地址的N個位元組複製到ES:DI指向的地址,複製後DS:SI的內容保持不變。
連接埠定址:這是CPU對外設連接埠的一種定址方式,這種定址方式只用於輸入輸出指令。CPU與外部裝置的串連要通過輸入輸出介面。CPU可以從輸入裝置接受資訊,也可以向輸出裝置發送資訊。外部裝置與介面中的連接埠直接相連,當CPU要與外設交換資訊或對外設進行某種控制時,是通過訪問連接埠完成的。連接埠定址就是在輸入輸出操作時如何確定連接埠地址。
8086有兩種連接埠定址方式:
(1) 直接連接埠地址:這種定址方式是在指令中以8位立即數的形式直接給出連接埠地址,定址範圍是0~255。
在彙編指令中表示格式為:
輸入指令:
IN AL, 24H ;將24H連接埠的內容送AL
IN AX, 20H ;將20H連接埠的內容送AX
輸出指令:
OUT 21H, AL ;將AL的內容輸出到21H的連接埠
OUT 23H, AX ;將AX的內容輸出到23H的連接埠
注意:1) 輸入輸出指令中連接埠的直接地址不用括弧;
2) 8086隻能用累加器AL/AX與連接埠交換資訊;
3) 連接埠寬度可為8位或16位,8位時與AL交換資訊,16位時與AX交換資訊。
(2) 間接連接埠定址:間接連接埠定址是將連接埠的地址事先送入寄存器DX,在輸入輸出指令連接埠地址由DX給出。由於DX是16位寄存器,因此間接連接埠定址的範圍是0~65535。
在彙編中表示格式如下:
輸入指令:
IN AL, DX
IN AX, DX
輸出指令:
OUT DX, AL
OUT DX, AX
8086提供了比較豐富的定址方式,在編程時,選擇合適定址方式,會增加程式設計的靈活性,提高程式品質和編程效率。