汇编语言随笔(3)-条件转移指令和标志寄存器
標(biāo)志寄存器
??????標(biāo)志寄存器通常具有以下三種作用:
??????1,用來存儲(chǔ)相關(guān)指令的某些執(zhí)行效果
??????2,用來為CPU執(zhí)行相關(guān)指令提供行為依據(jù)
??????3,用來控制CPU的相關(guān)工作方式
??????8086CPU的flag寄存器結(jié)構(gòu)如下圖所示:
| OF | DF | IF | TF | SF | ZF | AF | PF | CF |
??????在8086的指令集中,運(yùn)算指令的執(zhí)行如:add、sub、mul、div、inc、or、and等都會(huì)影響標(biāo)志寄存器;而傳送指令的執(zhí)行如:mov、push、pop都不會(huì)影響標(biāo)志寄存器。
??????1,ZF標(biāo)志
??????flag的第6位是ZF,零標(biāo)志位。它記錄了相關(guān)指令執(zhí)行后,其結(jié)果是否為0,如果為0,那么ZF=1,否則,ZF=0。比如當(dāng):sub ax,ax執(zhí)行后,結(jié)果為0,就會(huì)置ZF為1。
??????2,PF標(biāo)志
??????flag的第2位是PF,奇偶標(biāo)志位。它記錄了相關(guān)指令執(zhí)行后,其結(jié)果的所有bit位中1的個(gè)數(shù)是否為偶數(shù)。如果1的個(gè)數(shù)為偶數(shù),PF=1,否則PF=0。如:sub ax,ax執(zhí)行后,結(jié)果一共有0個(gè)1,0為偶數(shù),因此會(huì)置ZF為1。
??????3,SF標(biāo)志
??????flag的第7位是SF,符號標(biāo)志位。它記錄了相關(guān)指令執(zhí)行后,其結(jié)果是否為負(fù),如果為負(fù),那么SF=1,否則,ZF=0。它會(huì)將操作數(shù)看作為有符號數(shù)(補(bǔ)碼表示)的運(yùn)算來記錄結(jié)果的正負(fù)。如:mov al,10000001B???add al,1 執(zhí)行后,結(jié)果為10000010B,SF為1。而:mov al,10000001B???add al,01111111B 執(zhí)行后,-127+127=0,結(jié)果為0,它并不是一個(gè)負(fù)數(shù),故SF為0。
??????4,CF標(biāo)志位
??????flag的第0位是CF,進(jìn)位標(biāo)志位。一般情況下,在進(jìn)行無符號數(shù)運(yùn)算時(shí),它記錄了運(yùn)算結(jié)果的最高有效位向更高位的進(jìn)位值,或從更高位的借位值。
??????如:mov al,98H???add al,al???add al,al中第二條指令執(zhí)行結(jié)果為98H+98H=130H,所以(al)=30H,CF=1,CF記錄了從最高有效位向更高位的進(jìn)位值。第三條指令執(zhí)行結(jié)果為30H+30H=60H,所以(al)=60H,CF=0。
??????而當(dāng)兩個(gè)數(shù)據(jù)做減法時(shí),有可能向更高位借位。
??????如:兩個(gè)8位數(shù)據(jù)97H和98H做減法時(shí),將產(chǎn)生借位,借位(置CF為1)后,97H-98H等價(jià)于197H-98H。
??????5,OF標(biāo)志位
??????flag的第11位是OF,溢出標(biāo)志位。一般情況下,OF記錄了有符號數(shù)運(yùn)算的結(jié)果是否發(fā)生了溢出,如果發(fā)生了溢出,OF=1,否則OF=0。
??????在進(jìn)行有符號數(shù)運(yùn)算的時(shí)候,如果結(jié)果超過了機(jī)器所能表示的范圍稱為溢出。8位有符號數(shù)補(bǔ)碼的表示范圍位-128-127。
??????對于 mov al,98???add al,99執(zhí)行后,無符號數(shù)的結(jié)果為197,所以它不產(chǎn)生進(jìn)位;但作為有符號數(shù)的運(yùn)算,結(jié)果為197,它不在8位有符號數(shù)的表示范圍內(nèi),故產(chǎn)生了溢出,其實(shí)它是-59的補(bǔ)碼。所以O(shè)F=1,CF=0。
??????對于 mov al,0F0H???add al,88H執(zhí)行后,無符號數(shù)的結(jié)果為178H(376D),它大于255D,所以它產(chǎn)生進(jìn)位;但作為有符號數(shù)的運(yùn)算,結(jié)果為-136,它不在8位有符號數(shù)的表示范圍內(nèi),(且78H為正數(shù),兩個(gè)負(fù)數(shù)相加的結(jié)果得到了一個(gè)正數(shù))故產(chǎn)生了溢出。所以O(shè)F=1,CF=1。
??????下面指令執(zhí)行后,ZF、PF、SF、CF、OF標(biāo)志位的值的變化情況。
| mov al,10H | zf=1 | pf=1 | sf=0 | cf=0 | of=0 | - |
| add al,90H | zf=0 | pf=1 | sf=1 | cf=0 | of=0 | 結(jié)果非0,有2個(gè)1,未進(jìn)位,有符號數(shù)結(jié)果為負(fù),未溢出 |
| mov al,80H | zf=0 | pf=1 | sf=1 | cf=0 | of=0 | - |
| add al,80H | zf=1 | pf=1 | sf=0 | cf=1 | of=1 | 結(jié)果為0,0個(gè)1,正數(shù),產(chǎn)生進(jìn)位,兩負(fù)數(shù)相加結(jié)果為0,(十進(jìn)制結(jié)果-256<-128)溢出 |
| mov al,oFCH | zf=1 | pf=1 | sf=0 | cf=1 | of=1 | - |
| add al,05H | zf=0 | pf=0 | sf=0 | cf=1 | of=0 | 結(jié)果非0,1個(gè)1,正數(shù),產(chǎn)生進(jìn)位,正數(shù)加負(fù)數(shù)不可能溢出,結(jié)果為01H,未溢出 |
| mov al,7DH | zf=0 | pf=0 | sf=0 | cf=1 | of=0 | - |
| add al,0BH | zf=0 | pf=1 | sf=1 | cf=0 | of=1 | 結(jié)果非0,2個(gè)1,負(fù)數(shù),未產(chǎn)生進(jìn)位,負(fù)數(shù)加負(fù)數(shù)結(jié)果為正,(十進(jìn)制結(jié)果136大于127)溢出 |
比較指令和條件轉(zhuǎn)移指令
比較指令 cmp
??????比較指令 cmp,它的功能相當(dāng)于減法指令,只是不保存結(jié)果。cmp指令的執(zhí)行結(jié)果將對標(biāo)志寄存器產(chǎn)生影響。其他相關(guān)指令(如條件轉(zhuǎn)移指令)通過識(shí)別這些被影響的標(biāo)志寄存器來得知比較結(jié)果。
??????cmp指令格式:cmp op1,op2,效果為:計(jì)算op1-op2,但不保存結(jié)果,僅影響標(biāo)志寄存器。如:cmp ax,ax指令執(zhí)行后:zf=1,pf=1,sf=0,cf=0,of=0。
??????對于cmp ax,bx,當(dāng)進(jìn)行無符號數(shù)運(yùn)算時(shí):
??????若(ax)=(bx),則(ax)-(bx)=0,所以:zf=1;
??????若(ax)!=(bx),則(ax)-(bx)!=0,所以:zf=0;
??????若(ax)<(bx),則(ax)-(bx)將產(chǎn)生借位,所以:cf=1;
??????若(ax)>=(bx),則(ax)-(bx)不會(huì)產(chǎn)生借位,所以:cf=0;
??????若(ax)>(bx),則(ax)-(bx)不會(huì)產(chǎn)生借位,且不為0,所以:cf=0且zf=0;
??????若(ax)<=(bx),則(ax)-(bx)可能會(huì)借位,可能會(huì)等于0,所以:zf=1或者zf=1;
??????當(dāng)進(jìn)行有符號數(shù)運(yùn)算時(shí):
??????若(ax)=(bx),則(ax)-(bx)=0,所以:zf=1;
??????若(ax)!=(bx),則(ax)-(bx)!=0,所以:zf=0;
??????若(ax)<(bx),如果沒有發(fā)生溢出的話,那么實(shí)際存儲(chǔ)的結(jié)果就是真實(shí)運(yùn)算的結(jié)果,即of=0且sf=1;如果溢出的話,那么實(shí)際存儲(chǔ)的結(jié)果與真實(shí)運(yùn)算的結(jié)果相反,即of=1且sf=0;
??????若(ax)>(bx),如果沒有發(fā)生溢出的話,那么實(shí)際存儲(chǔ)的結(jié)果就是真實(shí)運(yùn)算的結(jié)果,即of=0且sf=0(當(dāng)然of=0且sf=0時(shí)ax與bx也可能相等);如果溢出的話,那么實(shí)際存儲(chǔ)的結(jié)果與真實(shí)運(yùn)算的結(jié)果相反,即of=1且sf=1;
條件轉(zhuǎn)移指令
??????首先上一篇博文中的jcxz就是一個(gè)條件轉(zhuǎn)移指令。
??????下面是常用的根據(jù)無符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令:
| je | 等于則轉(zhuǎn)移 | zf=1 |
| jne | 不等于則轉(zhuǎn)移 | zf=0 |
| jb | 低于則轉(zhuǎn)移 | cf=1 |
| jnb | 不低于則轉(zhuǎn)移 | cf=0 |
| ja | 高于則轉(zhuǎn)移 | cf=0且zf=0 |
| jna | 不高于則轉(zhuǎn)移 | cf=1或zf=1 |
??????其中e:equal,b:below,a,above。
??????雖然je進(jìn)行的操作是zf=1時(shí)轉(zhuǎn)移,但是我們一般是將cmp和je等條件轉(zhuǎn)移指令聯(lián)合起來使用,效果為:兩數(shù)相等則轉(zhuǎn)移。
??????有符號數(shù)的比較和進(jìn)行條件轉(zhuǎn)移與無符號數(shù)的原理相同。這里主要是將cmp、標(biāo)志寄存器的相關(guān)位、條件轉(zhuǎn)移指令進(jìn)行配合使用。
??????例:計(jì)算F000:0處32個(gè)字節(jié)中,大小在[32,128]的數(shù)據(jù)的個(gè)數(shù)。
總結(jié)
以上是生活随笔為你收集整理的汇编语言随笔(3)-条件转移指令和标志寄存器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言随笔(2)-CPU指令周期和无条
- 下一篇: 汇编语言随笔(5)-and、or指令,串