日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

標志寄存器

??????標志寄存器通常具有以下三種作用:
??????1,用來存儲相關(guān)指令的某些執(zhí)行效果
??????2,用來為CPU執(zhí)行相關(guān)指令提供行為依據(jù)
??????3,用來控制CPU的相關(guān)工作方式
??????8086CPU的flag寄存器結(jié)構(gòu)如下圖所示:

1514131211109876543210
OFDFIFTFSFZFAFPFCF

??????在8086的指令集中,運算指令的執(zhí)行如:add、sub、mul、div、inc、or、and等都會影響標志寄存器;而傳送指令的執(zhí)行如:mov、push、pop都不會影響標志寄存器。
??????1,ZF標志
??????flag的第6位是ZF,零標志位。它記錄了相關(guān)指令執(zhí)行后,其結(jié)果是否為0,如果為0,那么ZF=1,否則,ZF=0。比如當:sub ax,ax執(zhí)行后,結(jié)果為0,就會置ZF為1。
??????2,PF標志
??????flag的第2位是PF,奇偶標志位。它記錄了相關(guān)指令執(zhí)行后,其結(jié)果的所有bit位中1的個數(shù)是否為偶數(shù)。如果1的個數(shù)為偶數(shù),PF=1,否則PF=0。如:sub ax,ax執(zhí)行后,結(jié)果一共有0個1,0為偶數(shù),因此會置ZF為1。
??????3,SF標志
??????flag的第7位是SF,符號標志位。它記錄了相關(guān)指令執(zhí)行后,其結(jié)果是否為負,如果為負,那么SF=1,否則,ZF=0。它會將操作數(shù)看作為有符號數(shù)(補碼表示)的運算來記錄結(jié)果的正負。如:mov al,10000001B???add al,1 執(zhí)行后,結(jié)果為10000010B,SF為1。而:mov al,10000001B???add al,01111111B 執(zhí)行后,-127+127=0,結(jié)果為0,它并不是一個負數(shù),故SF為0。
??????4,CF標志位
??????flag的第0位是CF,進位標志位。一般情況下,在進行無符號數(shù)運算時,它記錄了運算結(jié)果的最高有效位向更高位的進位值,或從更高位的借位值。
??????如:mov al,98H???add al,al???add al,al中第二條指令執(zhí)行結(jié)果為98H+98H=130H,所以(al)=30H,CF=1,CF記錄了從最高有效位向更高位的進位值。第三條指令執(zhí)行結(jié)果為30H+30H=60H,所以(al)=60H,CF=0。
??????而當兩個數(shù)據(jù)做減法時,有可能向更高位借位。
??????如:兩個8位數(shù)據(jù)97H和98H做減法時,將產(chǎn)生借位,借位(置CF為1)后,97H-98H等價于197H-98H。
??????5,OF標志位
??????flag的第11位是OF,溢出標志位。一般情況下,OF記錄了有符號數(shù)運算的結(jié)果是否發(fā)生了溢出,如果發(fā)生了溢出,OF=1,否則OF=0。
??????在進行有符號數(shù)運算的時候,如果結(jié)果超過了機器所能表示的范圍稱為溢出。8位有符號數(shù)補碼的表示范圍位-128-127。
??????對于 mov al,98???add al,99執(zhí)行后,無符號數(shù)的結(jié)果為197,所以它不產(chǎn)生進位;但作為有符號數(shù)的運算,結(jié)果為197,它不在8位有符號數(shù)的表示范圍內(nèi),故產(chǎn)生了溢出,其實它是-59的補碼。所以O(shè)F=1,CF=0。
??????對于 mov al,0F0H???add al,88H執(zhí)行后,無符號數(shù)的結(jié)果為178H(376D),它大于255D,所以它產(chǎn)生進位;但作為有符號數(shù)的運算,結(jié)果為-136,它不在8位有符號數(shù)的表示范圍內(nèi),(且78H為正數(shù),兩個負數(shù)相加的結(jié)果得到了一個正數(shù))故產(chǎn)生了溢出。所以O(shè)F=1,CF=1。
??????下面指令執(zhí)行后,ZF、PF、SF、CF、OF標志位的值的變化情況。

sub al,alzf=1pf=1sf=0cf=0of=0結(jié)果為0,0個1,未進位,正數(shù),未溢出
mov al,10Hzf=1pf=1sf=0cf=0of=0-
add al,90Hzf=0pf=1sf=1cf=0of=0結(jié)果非0,有2個1,未進位,有符號數(shù)結(jié)果為負,未溢出
mov al,80Hzf=0pf=1sf=1cf=0of=0-
add al,80Hzf=1pf=1sf=0cf=1of=1結(jié)果為0,0個1,正數(shù),產(chǎn)生進位,兩負數(shù)相加結(jié)果為0,(十進制結(jié)果-256<-128)溢出
mov al,oFCHzf=1pf=1sf=0cf=1of=1-
add al,05Hzf=0pf=0sf=0cf=1of=0結(jié)果非0,1個1,正數(shù),產(chǎn)生進位,正數(shù)加負數(shù)不可能溢出,結(jié)果為01H,未溢出
mov al,7DHzf=0pf=0sf=0cf=1of=0-
add al,0BHzf=0pf=1sf=1cf=0of=1結(jié)果非0,2個1,負數(shù),未產(chǎn)生進位,負數(shù)加負數(shù)結(jié)果為正,(十進制結(jié)果136大于127)溢出

比較指令和條件轉(zhuǎn)移指令

比較指令 cmp

??????比較指令 cmp,它的功能相當于減法指令,只是不保存結(jié)果。cmp指令的執(zhí)行結(jié)果將對標志寄存器產(chǎn)生影響。其他相關(guān)指令(如條件轉(zhuǎn)移指令)通過識別這些被影響的標志寄存器來得知比較結(jié)果。
??????cmp指令格式:cmp op1,op2,效果為:計算op1-op2,但不保存結(jié)果,僅影響標志寄存器。如:cmp ax,ax指令執(zhí)行后:zf=1,pf=1,sf=0,cf=0,of=0。
??????對于cmp ax,bx,當進行無符號數(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)不會產(chǎn)生借位,所以:cf=0;
??????若(ax)>(bx),則(ax)-(bx)不會產(chǎn)生借位,且不為0,所以:cf=0且zf=0;
??????若(ax)<=(bx),則(ax)-(bx)可能會借位,可能會等于0,所以:zf=1或者zf=1;

??????當進行有符號數(shù)運算時:
??????若(ax)=(bx),則(ax)-(bx)=0,所以:zf=1;
??????若(ax)!=(bx),則(ax)-(bx)!=0,所以:zf=0;
??????若(ax)<(bx),如果沒有發(fā)生溢出的話,那么實際存儲的結(jié)果就是真實運算的結(jié)果,即of=0且sf=1;如果溢出的話,那么實際存儲的結(jié)果與真實運算的結(jié)果相反,即of=1且sf=0;
??????若(ax)>(bx),如果沒有發(fā)生溢出的話,那么實際存儲的結(jié)果就是真實運算的結(jié)果,即of=0且sf=0(當然of=0且sf=0時ax與bx也可能相等);如果溢出的話,那么實際存儲的結(jié)果與真實運算的結(jié)果相反,即of=1且sf=1;

條件轉(zhuǎn)移指令

??????首先上一篇博文中的jcxz就是一個條件轉(zhuǎn)移指令。
??????下面是常用的根據(jù)無符號數(shù)的比較結(jié)果進行轉(zhuǎn)移的條件轉(zhuǎn)移指令:

指令含義檢測的相關(guā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進行的操作是zf=1時轉(zhuǎn)移,但是我們一般是將cmp和je等條件轉(zhuǎn)移指令聯(lián)合起來使用,效果為:兩數(shù)相等則轉(zhuǎn)移。
??????有符號數(shù)的比較和進行條件轉(zhuǎn)移與無符號數(shù)的原理相同。這里主要是將cmp、標志寄存器的相關(guān)位、條件轉(zhuǎn)移指令進行配合使用。
??????例:計算F000:0處32個字節(jié)中,大小在[32,128]的數(shù)據(jù)的個數(shù)。

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。