汇编语⾔⾥各种运算指令对标志位的影响
在汇编语⾔中,标志位是很重要的东西,我们查看标志位可以很好的了解当前指令操作带来的变化,那么我们应该怎样来查看标志位呢?
在debug中每次执⾏过相关指令后在右下⾓可以看到⼀些两位英⽂⼤写字母,这就是标志位,从左向右依次为:
有符号溢出标志位OF(Over flow flag)OV(1)NV(0)
⽅向标志位DF(Direction flag)DN(1)UP(0)
中断标志位IF(Interrupt flag)EI(1)DI(0)
符号标志位SF(Sign flag)NG(1)PL(0)
零标志位ZF(Zero flag)ZR(1)NZ(0)
辅助进位标志位AF(Auxiliary carry flag)AC(1)NA(0)
奇偶标志位PF(Parity flag)PE(1)PO(0)
⽆符号进位标志位CF(Carry flag)CY(1)NC(0)
宝马小车后⾯括号⾥的0/1指的是标志位相关状态,为0则代表次标志位没有变化,为1则代表这次执⾏指令产⽣了变化。
标志408图片补充⼀个⽹图:
如在如下debug中的测试(debug安装使⽤在这⾥----->!)这个debug安装指南⾮常简洁,推荐:
**1.**第⼀个r指令是查看当前各寄存器的状态,并未执⾏相关指令,可以看到右下⾓的各个标志位并未发⽣变化
**2.**输⼊t指令,执⾏之前设置好的乘法指令:mul ax,bx 即将ax与bx相乘再将结果存放与ax中,我们可以发现右下⾓的溢出标志位OF 由NV变为OV,OV是“1”,即说明发⽣了溢出,ax只有16位即两个字节,ax与bx的积在ax中放不下,发⽣了溢出,溢出部分存放在了dx当中。再看进位标志位CF,从NC变成了CY,表明发⽣了进位。
**3.**执⾏下⼀条指令(第⼆个t):在执⾏add cx,dx 之后,我们发现溢出标志位回复了正常,进位标志位也回复了正常,但是奇偶标志位发⽣了变化,PE说明发⽣了积偶的变化。
人保汽车保险其他的积偶标志位也会随着相关的操作⽽产⽣变化,下⾯做⼀点下总结:
⼀:数据交换类指令不会引起标志位的变化。一切为车网
⼆:数据传送类指令不会引起标志位的变化。
三:算数运算类指令会影响标志位变化:
(1):加法类指令中add,adc会影响CF,ZF,PF,OF,AF,SF等标志位的变化。但是加法指令⾥的⾃增指令INC在上述标志位中不会影响
cf(⽆符号进位标志)的变化;那么,或许有⼈会说,cf进位标志,我对⼀个寄存器⾃增到要进位的时候,不是会发⽣进位标志的改变吗?请看:
让ax等于FFFF,即最⼤的值的时候,再执⾏⾃增的操作,会发现,进位标志CF并未发⽣变化,反⽽是零标志ZF,辅助标志AF以及积偶标志PF发⽣了变化,这就说明在临界情况下⾃增会成为零(循环变化)对别的通⽤寄存器也没有产⽣影响(没有把ax寄存器的值存在别的寄存器⾥,只是发⽣了清零效果)!
(2)在减法类指令中,sub,sbb,neg(求补指令),cmp(⽐较指令)指令会影响全部的标志位,但是⾃减指令dec不会影响cf(进位借位标志位)。
福特锐界2015最新款和加法⼀样,减法也是对寄存器进⾏循环的处理,ax 0000⾃减后会变成ffff,并未引起cf标志位的变化。
(3)乘法指令只对of、cf标志位造成影响,对其他的标志位的影响不确定(⽆定义)。
(4)除法对标志位没有影响·。
四:逻辑类指令:
图⽚指令执⾏从上向下依次为与(and),或(or),异或(xor),ax,bx,cx初始值都为1010。
起亚k5低配多少钱第⼀次进⾏逻辑与或异或,并未得到结果。
第⼆次分开设置特殊数据查看:已下是先对ax进⾏乘法运算,再进⾏与(and)运算,多次实验发现ax执⾏与运算会使得标志位of、cf置零
已下是对ax先乘法运算再或运算(or),同样发现只会使得标志位cf、of进⾏置零操作。
多次对xor异或操作进⾏运算也是如此,所以得出结论:(1)对寄存器进⾏逻辑运算,每次都会使得of、cf标志位清零。
(2)也会引起pf奇偶标致位的变化
五:移位指令
1.逻辑移动及算数移动
简介逻辑移动及算数移动:(1)左移:逻辑左移和算数左移⼀样,符号位进⼊cf进位标志位保存,其他位整体左移,末尾补零; (2)右移:逻辑右移和左移⼀样,只是换了个放向。但是算数右移则有些不同,算数右移尾部不断进⼊cf标志位保存,但是头部不会补零,⽽是符号位在不断的重复,如图。这是⼀个特例。
标志位变化:
第⼀个命令(t)时我们使得of/cf位发⽣变化;’第⼆个命令(t)是对ax发⽣逻辑左移,我们发现cf、of位发⽣了变化;第三个命令(t)是对bx发⽣逻辑右移,我们发现cf、of位都恢复了正常;第四个命令(t)是最cx进⾏算数右移,cf、of标志位⼜发⽣了变化。
多次实验我发现,每次我们进⾏移动的过程中进⼊cf标志位保存的数是使得cf变化的原因,of和af相应根据数的变化发⽣变化`,of=1 ,移动后最⾼位的值发⽣变化;of=0 ,移动时最⾼位的值未发⽣变化。
2.循环移动
对循环移动的简介:
(1)不带进位的循环移动,每次左循环移动之后,在符号位的数进⼊cf标志位保存;每次循环右移后,在末尾的那个数进⼊标志位保存。例:有个数10010010,现在进⾏不带进位标志的循环左移,移动⼀次后成为00100101,⽽cf变成0;再进⾏不带进位的循环右移,⼜变成10010010,cf置换为1。
(2)带进位循环移动和逻辑算数移动不同的地⽅在于循环移动每次移动加⼊了cf标志位,cf标志位是本来存在的,每次移动带上标志位⼀起移动,⽐如8位就变成了9位,16位变成了17位。
举例:⽐如⼀个8 位数 81H,⼆进制的就是1000 0001,假设最初的进位标志位CF为0 。带进位循环左移后,81H的最⾼位移⼊进位标志位,此时,进位标志位CF为1,数为0000 0010 。再左移⼀次,进位标志位的1移到最低位,此时,进位标志位为0,数为0000 0101。带进位循环右移的话,数为0100 0000,进位位C为1,再移⼀次,则进位位移⼊最⾼位,进位位变成0 ,数为1010 0000
对于标志位变化,和逻辑移动算数移动⼀样,也是cf保存的值影响cf,of判断数据头是否发⽣溢出变化,pf判断数奇偶变化!
六:条件转移指令不会影响标志位。
发布评论