高級(jí)語言支持,條件字節(jié)設(shè)置指令 AA.高級(jí)語言支持指令,開始于80186,主要是用來簡(jiǎn)化高級(jí)語言的某些特征,總共有3條指令:ENTER,LEAVE,BOUND a.ENTER,LEAVE,建立與釋放堆??蚣苊?。在C語言中,棧不僅用來向函數(shù)傳遞入口參數(shù),而且在函數(shù)內(nèi)部的局部變量也存放在棧中。為了準(zhǔn)確地存取這些這些局變量和準(zhǔn)確地獲得入口參數(shù),就需要建立堆??蚣?,先看一個(gè)小程序: //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;建立堆??蚣?br> 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;釋放??蚣?br> pop bp ret _sum endp 此時(shí)棧頂?shù)氖疽鈭D是: |----------------------| | BP |<====SP |----------------------| | 函數(shù)返回地址 |<====BP+2 |----------------------| | 參數(shù)x |<====BP+4 |----------------------| | 參數(shù)y |<====BP+6 |----------------------| | ...... |<====BP+8 |----------------------| | ........ |<====BP+n,n是一能被2整除的數(shù) |----------------------| 如果用建立和釋放堆棧框架指令,那么對(duì)應(yīng)的匯編程序應(yīng)該是: _sum proc near enter 2,0;建立??蚣?br> 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ù),表示子程序嵌套級(jí)別,即從調(diào)用框架復(fù)制到當(dāng)前框架的指針數(shù)。在立即數(shù)CNT2為0時(shí),ENTER指令的實(shí)過程是: PUSH BP SP=>BP SP<=SP-CNT1 c.釋放??蚣苤噶頛EAVE,其具體實(shí)現(xiàn)過程: 8086: BP=>SP POP BP 80386: EBP=>ESP POP EBP d.ENTER和LEAVE指令均不影響標(biāo)志寄存器中的各標(biāo)志位,同時(shí)LEAVE指令只負(fù)責(zé)釋放??蚣?,并不負(fù)責(zé)函數(shù)返回。因此,要在LEAVE指令后安排一條返回指令。
BB.條件字節(jié)設(shè)置指令 這是80386新增的一組指令集,將會(huì)在后面全部列表出來。條件字節(jié)設(shè)置指令的格式: SETxx OPRD xx是助記符的一部分,OPRD只能是8位的寄存器或存儲(chǔ)單元。 eg: SETO AL;表示當(dāng)溢出標(biāo)志位為1時(shí),即OF=1,將AL置1,否則AL清0 SETNC CH;表示當(dāng)CF=0時(shí),將CH置1,否則將CH清0 SETNA BYTE PTR [100];表示當(dāng)AF=0,將DS:[100]這一個(gè)字置1,否則將它清0 a.SETZ OPRD;等于0時(shí)(ZF=1),置OPRD為1,否則清0 b.SETE OPRD;同a c.SETNZ OPRD;不等于0時(shí)(ZF=0),置OPRD為1,否則清0 d.SETNE OPRD;同c e.SETS OPRD;為負(fù)數(shù)時(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,這是針對(duì)無符號(hào)數(shù)的 n.SETNAE OPRD;不高于即低于或等于時(shí)置OPRD為1,否則清0,這是針對(duì)無符號(hào)數(shù)的 o.SETC OPRD;CF=1,置OPRD為1,否則清0 p.SETNB OPRD;高于或等于時(shí),置OPRD為1,否則清0,這是針對(duì)無符號(hào)數(shù)的 q.SETAE OPRD;高于時(shí)置OPRD為1,否則清0,這是針對(duì)無符號(hào)數(shù)的 r.SETNC OPRD;CF=0時(shí),置OPRD為1,否則清0,這是針對(duì)無符號(hào)數(shù)的 s.SETBE OPRD;低于或等于時(shí),置OPRD為1,否則清0,這是針對(duì)無符號(hào)數(shù)的,CF|ZF=1 t.SETNA OPRD;同s,這是針對(duì)無符號(hào)數(shù)的,CF|ZF=1 u.SETNBE OPRD;高于時(shí)置OPRD為1,否則清0,這是針對(duì)無符號(hào)數(shù)的,CF OR ZF=0 v.SETA OPRD;同u,這是針對(duì)無符號(hào)數(shù)的,CF OR ZF=0 w.SETL OPRD;小于時(shí),置OPRD為1,否則清0,這是針對(duì)有符號(hào)數(shù)的 x.SETNGE OPRD;同w,這是針對(duì)有符號(hào)數(shù)的 y.SETNL OPRD;大于或等于時(shí),置OPR為1,否則清0,這是針對(duì)有符號(hào)數(shù)的 z.SETGE OPRD;同y,這是針對(duì)有符號(hào)數(shù)的 a1.SETLE OPRD;小于或等于時(shí),置OPRD為1,否則清0,這是針對(duì)有符號(hào)數(shù)的 a2.SETNG OPRD;同a1,這是針對(duì)有符號(hào)數(shù)的 a3.SETNLE;大于時(shí),置OPRD為1,否則清0,這是針對(duì)有符號(hào)數(shù)的 a4.SETG;同a3,這是針對(duì)有符號(hào)數(shù)的
|