匯編語言指令由操作碼和操作數兩部分組成。
操作碼說明指令的功能,即計算機要執行的具體操作
如:傳送、移位、運算等,是指令中不可缺少的組成部分
操作數是指令執行的參與者,即各種操作的對象。
有些指令不需要操作數,有些指令有一個或兩個操作數。
有一個操作數的叫單操作數,有兩個操作數的叫雙操作數。
~~~
操作碼 目的操作數,源操作數
MOV EAX,00401000
~~~
要指令執行,就要找到指令中的操作數,
要找到操作數,就要找到存放操作數的地址,
尋找指令中的操作數地址的方式叫做尋址方式;
**全七類尋址方式:**
**1.立即尋址**
操作數以字節形式緊跟在操作碼后邊
常用于給CPU中的寄存器或存儲單元賦值
立即數只能用作源操作數,不能作為目的操作數。
例子:
~~~
MOV AL,56H 將立即數56H,送入8位寄存器AL
MOV AX,1234H 將16位立即數1234H,送16位寄存器AX
~~~
**2.寄存器尋址**
操作數存放在CPU的寄存器中,寄存器可以是16位也可以是8位
不用執行尋找操作數的總線周期,執行速度最快。
`MOV AX,BX`
**3.存儲器尋址**
操作數放在存儲器中,除代碼段之外的所有段數據。
這種存儲方式中,指令給出的是存放該操作數的存儲單元的地址
或產生該存儲單元地址的表達試。
CPU執行指令時,首先根據操作數字段提供的地址信息,由
執行單元EU計算出有效地址EA,再由總線接口單元BIU
根據物理地址公式"PA=段首地址X10H+有效地址"計算出物理地址
然后到物理地址對應的內存單元取出操作數,執行對該數的操作
存儲器尋址根據計算偏移地址的方法不同分為以下5種
**(1)直接尋址**
這種尋址方式是從存儲器中尋找操作數最簡單的一種,
指令中直接給出的是該操作數在存儲器中的有效地址;其物理地址為:
PA=段首地址X10H+EA(段首地址默認使用DS段寄存器,EA為指令中給出的有效地址)
例子:
`MOV AX,[2000H]`
若操作數不在數據段,則應在指令中使用段跨越前綴,指明使用的數據在哪一個段
例如:
`MOV AX,ES:[2000H]`
該指令將物理地址為PA=(ES)X10H+2000H單元的值送AX
**(2)寄存器間接尋址**
操作數的有效地址由指令中指定的寄存器BX,BP,SI或DI的內容指定。
可分為下面兩種情況
①SI,DI或BX寄存器間接尋址,通常操作數實在數據段DS中,因此,
他們的物理地址是PA=(DS)X10H+EA
例:
`MOV AX,[BX]`
設(DS)=2000H,(BX)=1000H,則該操作數的物理地址為:
`PA=2000HX10H+1000H=21000H`
這條指令的執行結果是把內存單元21000H中的數據送到AX寄存器中
②若是寄存器間接尋址,則該操作數在堆棧段SS中,即以堆棧段寄存器SS
與BP組合形成操作數的物理地址:PA=(SS)X10H+(BP)
例:
`MOV BX,[BP]`
設(SS)=1000H,(BP)=1500H,則`PA=1000Hx10H+1500H=11500H`
該操作數把11500H存儲單元的內容送到BX寄存器
**(3)寄存器相對尋址**
這種尋址方式的操作數存放在存儲器中的內存單元中,
是以基址寄存器(BX或BP)或變址寄存器(DI或SI)的內容為基地址
然后在這個地址上加上8位或16位的位移量Disp,形成真正操作數的有效地址EA
當寄存器為BX、SI、DI時,用段寄存器DS的內容作為段基地址,則物理地址:
`PA=(DS)X10H+(BX)/(SI)/(DI)+Disp8/Disp16`
若寄存器為BP,則段寄存器SS的內容作為段首地址,則物理地址為:
`PA=(SS)X10H+(BP)+Disp8/Disp16`
例:
`MOV DI,[BX+2]`
**(4)基址變址尋址**
操作數存放在內存單元中,其偏移地址是基址寄存器的內容加上變址寄存器的內容之和。
> 若基址寄存器為BX,則段寄存器為DS;
> 若基址寄存器為BP,則段寄存器為SS;
則操作數物理地址為:
~~~
PA=(DS)X10H+(BX)+(SI)/(DI)
或
PA=(SS)X10H+(BP)+(SI)/(DI)
MOV DX,[BP][SI]
~~~
**(5)相對基址變址尋址**
操作數存放在內存單元中,其中有效地址由指令指定的基址寄存器加變址寄存器的內容在加上指令中的8位或16位偏移量Disp得到,
其中物理地址為:
~~~
PA=(DS)X10H+(BX)+(SI)/(DI)+Disp
或
PA=(SS)X10H+(BP)+(SI)/(DI)+Disp
~~~
例:
~~~
MOV AX,MAS[BX][SI] ;MAS為符號地址
MOV DX,5[BX][DI] ;將偏移地址為5+(BX)+(DI)所指的單元的值送DX
~~~