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