?? 匯編004.txt
字號:
高級語言支持,條件字節(jié)設(shè)置指令
AA.高級語言支持指令,開始于80186,主要是用來簡化高級語言的某些特征,總共有3條指令:ENTER,LEAVE,BOUND
a.ENTER,LEAVE,建立與釋放堆棧框架命令。在C語言中,棧不僅用來向函數(shù)傳遞入口參數(shù),而且在函數(shù)內(nèi)部的局部變量也存放在棧中。為了準(zhǔn)確地存取這些這些局變量和準(zhǔn)確地獲得入口參數(shù),就需要建立堆棧框架,先看一個小程序:
//C Programming-Language
int sum(int x,int y)
{
int sum;
sum=x+y;
return sum;
}
//The corresponding ASM codes lists below
_sum proc near;注意C語言中函數(shù)參數(shù)的入棧方式是從右向左,即先是參數(shù)y入棧,再是x入棧,再是函數(shù)的返回地址入棧
push bp
mov bp,sp;建立堆棧框架
sub sp,2
mov ax,word ptr [bp+4];取參數(shù)x
add ax,word ptr [bp+6];加參數(shù)y
mov word ptr [bp-2],ax
mov ax,word ptr [bp-2]
mov sp,bp;釋放??蚣? pop bp
ret
_sum endp
此時棧頂?shù)氖疽鈭D是:
|----------------------|
| BP |<====SP
|----------------------|
| 函數(shù)返回地址 |<====BP+2
|----------------------|
| 參數(shù)x |<====BP+4
|----------------------|
| 參數(shù)y |<====BP+6
|----------------------|
| ...... |<====BP+8
|----------------------|
| ........ |<====BP+n,n是一能被2整除的數(shù)
|----------------------|
如果用建立和釋放堆??蚣苤噶睿敲磳?yīng)的匯編程序應(yīng)該是:
_sum proc near
enter 2,0;建立??蚣? mov ax,word ptr [bp+4];取參數(shù)x
add ax,word ptr [bp+6];加參數(shù)y
mov word ptr [bp-2],ax
mov ax,word ptr [bp-2]
leave;釋放??蚣? ret
_sum endp
b.建立??蚣苤噶頔NTER,格式如下:ENTER CNT1,CNT2。其中CNT1表示框架的大小,即子程序中需要放在棧中局部變量的字節(jié)數(shù);CNT2是立即數(shù),表示子程序嵌套級別,即從調(diào)用框架復(fù)制到當(dāng)前框架的指針數(shù)。在立即數(shù)CNT2為0時,ENTER指令的實過程是:
PUSH BP
SP=>BP
SP<=SP-CNT1
c.釋放??蚣苤噶頛EAVE,其具體實現(xiàn)過程:
8086:
BP=>SP
POP BP
80386:
EBP=>ESP
POP EBP
d.ENTER和LEAVE指令均不影響標(biāo)志寄存器中的各標(biāo)志位,同時LEAVE指令只負責(zé)釋放??蚣埽⒉回撠?zé)函數(shù)返回。因此,要在LEAVE指令后安排一條返回指令。
BB.條件字節(jié)設(shè)置指令
這是80386新增的一組指令集,將會在后面全部列表出來。條件字節(jié)設(shè)置指令的格式:
SETxx OPRD
xx是助記符的一部分,OPRD只能是8位的寄存器或存儲單元。
eg:
SETO AL;表示當(dāng)溢出標(biāo)志位為1時,即OF=1,將AL置1,否則AL清0
SETNC CH;表示當(dāng)CF=0時,將CH置1,否則將CH清0
SETNA BYTE PTR [100];表示當(dāng)AF=0,將DS:[100]這一個字置1,否則將它清0
a.SETZ OPRD;等于0時(ZF=1),置OPRD為1,否則清0
b.SETE OPRD;同a
c.SETNZ OPRD;不等于0時(ZF=0),置OPRD為1,否則清0
d.SETNE OPRD;同c
e.SETS OPRD;為負數(shù)時(SF=1)置OPRD為1,否則清0
f.SETNS OPRD;同e正好相反(SF=0)
g.SETO OPRD;OF=1,置OPRD為1,否則清0
h.SETNO OPRD;同g正好相反
i.SETP OPRD;偶(PF=1)置1
j.SETPE OPRD;同i
k.SETNP OPRD;奇(PF=0)置1
l.SETPO OPRD;同k
m.SETB OPRD;低于置OPRD為1,否則清0,這是針對無符號數(shù)的
n.SETNAE OPRD;不高于即低于或等于時置OPRD為1,否則清0,這是針對無符號數(shù)的
o.SETC OPRD;CF=1,置OPRD為1,否則清0
p.SETNB OPRD;高于或等于時,置OPRD為1,否則清0,這是針對無符號數(shù)的
q.SETAE OPRD;高于時置OPRD為1,否則清0,這是針對無符號數(shù)的
r.SETNC OPRD;CF=0時,置OPRD為1,否則清0,這是針對無符號數(shù)的
s.SETBE OPRD;低于或等于時,置OPRD為1,否則清0,這是針對無符號數(shù)的,CF|ZF=1
t.SETNA OPRD;同s,這是針對無符號數(shù)的,CF|ZF=1
u.SETNBE OPRD;高于時置OPRD為1,否則清0,這是針對無符號數(shù)的,CF OR ZF=0
v.SETA OPRD;同u,這是針對無符號數(shù)的,CF OR ZF=0
w.SETL OPRD;小于時,置OPRD為1,否則清0,這是針對有符號數(shù)的
x.SETNGE OPRD;同w,這是針對有符號數(shù)的
y.SETNL OPRD;大于或等于時,置OPR為1,否則清0,這是針對有符號數(shù)的
z.SETGE OPRD;同y,這是針對有符號數(shù)的
a1.SETLE OPRD;小于或等于時,置OPRD為1,否則清0,這是針對有符號數(shù)的
a2.SETNG OPRD;同a1,這是針對有符號數(shù)的
a3.SETNLE;大于時,置OPRD為1,否則清0,這是針對有符號數(shù)的
a4.SETG;同a3,這是針對有符號數(shù)的
位操作指令,處理器控制指令
AA.位操作指令,8086新增的一組指令,包括位測試,位掃描。BT,BTC,BTR,BTS,BSF,BSR
a.BT(Bit Test),位測試指令,指令格式:
BT OPRD1,OPRD2,規(guī)則:操作作OPRD1可以是16位或32位的通用寄存器或者存儲單元。操作數(shù)OPRD2必須是8位立即數(shù)或者是與OPRD1操作數(shù)長度相等的通用寄存器。如果用OPRD2除以O(shè)PRD1,假設(shè)商存放在Divd中,余數(shù)存放在Mod中,那么對OPRD1操作數(shù)要進行測試的位號就是Mod,它的主要功能就是把要測試位的值送往CF,看幾個簡單的例子:
b.BTC(Bit Test And Complement),測試并取反用法和規(guī)則與BT是一樣,但在功能有些不同,它不但將要測試位的值送往CF,并且還將該位取反。
c.BTR(Bit Test And Reset),測試并復(fù)位,用法和規(guī)則與BT是一樣,但在功能有些不同,它不但將要測試位的值送往CF,并且還將該位復(fù)位(即清0)。
d.BTS(Bit Test And Set),測試并置位,用法和規(guī)則與BT是一樣,但在功能有些不同,它不但將要測試位的值送往CF,并且還將該位置位(即置1)。
e.BSF(Bit Scan Forward),順向位掃描,指令格式:BSF OPRD1,OPRD2,功能:將從右向左(從最低位到最高位)對OPRD2操作數(shù)進行掃描,并將第一個為1的位號送給操作數(shù)OPRD1。操作數(shù)OPRD1,OPRD2可以是16位或32位通用寄存器或者存儲單元,但OPRD1和OPRD2操作數(shù)的長度必須相等。
f.BSR(Bit Scan Reverse),逆向位掃描,指令格式:BSR OPRD1,OPRD2,功能:將從左向右(從最高位到最低位)對OPRD2操作數(shù)進行掃描,并將第一個為1的位號送給操作數(shù)OPRD1。操作數(shù)OPRD1,OPRD2可以是16位或32位通用寄存器或存儲單元,但OPRD1和OPRD2操作數(shù)的長度必須相等。
g.舉個簡單的例子來說明這6條指令:
AA DW 1234H,5678H
BB DW 9999H,7777H
MOV EAX,12345678H
MOV BX,9999H
BT EAX,8;CF=0,EAX保持不變
BTC EAX,8;CF=0,EAX=12345778H
BTR EAX,8;CF=0,EAX=12345678H
BTS EAX,8;CF=0,EAX=12345778H
BSF AX,BX;AX=0
BSR AX,BX;AX=15
BT WORD PTR [AA],4;CF=1,[AA]的內(nèi)容不變
BTC WORD PTR [AA],4;CF=1,[AA]=1223H
BTR WORD PTR [AA],4;CF=1,[AA]=1223H
BTS WORD PTR [AA],4;CF=1,[AA]=1234H
BSF WORD PTR [AA],BX;[AA]=0;
BSR WORD PTR [AA],BX;[AA]=15(十進制)
BT DWORD PTR [BB],12;CF=1,[BB]的內(nèi)容保持不變
BTC DWORD PTR [BB],12;CF=1,[BB]=76779999H
BTR DWORD PTR [BB],12;CF=1,[BB]=76779999H
BTS DWORD PTR [BB],12;CF=1,[BB]=77779999H
BSF DWORD PTR [BB],12;[BB]=0
BSR DWORD PTR [BB],12;[BB]=31(十進制)
BB.處理器控制指令
處理器控制指令主要是用來設(shè)置/清除標(biāo)志,空操作以及與外部事件同步等。
a.CLC,將CF標(biāo)志位清0。
b.STC,將CF標(biāo)志位置1。
c.CLI,關(guān)中斷。
d.STI,開中斷。
e.CLD,清DF=0。
f.STD,置DF=1。
g.NOP,空操作,填補程序中的空白區(qū),空操作本身不執(zhí)行任何操作,主要是為了保持程序的連續(xù)性。
h.WAIT,等待BUSY引腳為高。
i.LOCK,封鎖前綴可以鎖定其后指令的操作數(shù)的存儲單元,該指令在指令執(zhí)行期間一直有效。在多任務(wù)環(huán)境中,可以用它來保證獨占其享內(nèi)存,只有以下指令才可以用LOCK前綴:
XCHG,ADD,ADC,INC,SUB,SBB,DEC,NEG,OR,AND,XOR,NOT,BT,BTS,BTR,BTC
j.說明處理器類型的偽指令
.8086,只支持對8086指令的匯編
.186,只支持對80186指令的匯編
.286,支持對非特權(quán)的80286指令的匯編
.286C,支持對非特權(quán)的80286指令的匯編
.286P,支持對80286所有指令的匯編
.386,支持對80386非特權(quán)指令的匯編
.386C,支持對80386非特權(quán)指令的匯編
.386P,支持對80386所有指令的匯編
只有用偽指令說明了處理器類型,匯編程序才知道如何更好去編譯,連接程序,更好地去檢錯。
在后續(xù)的幾篇里將詳細介紹80386的段頁管理機制及控制寄存器,調(diào)試寄存器,以及如何在386實模下和保護模式下編程。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -