日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言随笔(3)-条件转移指令和标志寄存器

發布時間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言随笔(3)-条件转移指令和标志寄存器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

標志寄存器

??????標志寄存器通常具有以下三種作用:
??????1,用來存儲相關指令的某些執行效果
??????2,用來為CPU執行相關指令提供行為依據
??????3,用來控制CPU的相關工作方式
??????8086CPU的flag寄存器結構如下圖所示:

1514131211109876543210
OFDFIFTFSFZFAFPFCF

??????在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標志位的值的變化情況。

sub al,alzf=1pf=1sf=0cf=0of=0結果為0,0個1,未進位,正數,未溢出
mov al,10Hzf=1pf=1sf=0cf=0of=0-
add al,90Hzf=0pf=1sf=1cf=0of=0結果非0,有2個1,未進位,有符號數結果為負,未溢出
mov al,80Hzf=0pf=1sf=1cf=0of=0-
add al,80Hzf=1pf=1sf=0cf=1of=1結果為0,0個1,正數,產生進位,兩負數相加結果為0,(十進制結果-256<-128)溢出
mov al,oFCHzf=1pf=1sf=0cf=1of=1-
add al,05Hzf=0pf=0sf=0cf=1of=0結果非0,1個1,正數,產生進位,正數加負數不可能溢出,結果為01H,未溢出
mov al,7DHzf=0pf=0sf=0cf=1of=0-
add al,0BHzf=0pf=1sf=1cf=0of=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]的數據的個數。

mov ax,of000hmov ds,axmov,bx,0mov dx,0mov cx,32s: mov al,[bx]cmp al,32jb s0cmp al,128ja s0inc dxs0:inc bxloop s

總結

以上是生活随笔為你收集整理的汇编语言随笔(3)-条件转移指令和标志寄存器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。