第十一章 标志寄存器(flag)
8086cpu的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW-program state word)
flag寄存器是按位起作用的。
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
0 0 0 0 of df if tf sf zf 0 af 0 pf 0 cf
flag的第2位是PF,奇偶标志位。其结果最低有效字节中的所有bit位中1的个数是否为偶数,为偶数pf=1,为奇数pf=0
flag的第6位是ZF(zero flag),零标志位。如果结果为0,那么zf=1;如果结果不为0,那么zf=0。
flag的第7位是SF(sign flag),符号标志位。有符号数,如果结果为负,sf=1;如果非负,sf=0。
flag的第10位是DF(direction flag),方向标志位。在处理串指令中,控制每次操作后si、di的增减。
df=0 每次操作后si、di递增
df=1 每次操作后si、di递减
flag的第0 位是CF(carry flag),进位标志位。在进行 无符号数 运算的时候,运算结果有进/借位,CF=1
flag的第11位是OF(overflow flag),溢出标志位。在进行 有符号数 运算的时候,运算结果溢出,of=1
PS:以上英文全称扩展是自己猜的,不保证正确性!!
在计算机中1表示逻辑真,表示肯定;0表示逻辑假,表示否定。当然,是什么的决定权还是在编写者手里。
在8086cpu指令集中,有的指令(大多是进行逻辑或运算的运算指令)的执行是影响标志寄存器的,有的指令(大多是传送指令)的执行对标志寄存器没有影响。
add、sub、mul、div 、inc、or、and等运算指令影响flag
mov、push、pop等传送指令对flag没影响
inc 和loop指令不影响CF位。
某些指令将影响标志寄存器中的多个标记位,这些被影响的标记位比较全面的记录了指令的执行结果,为相关的指令提供的了所需的依据。
对于位数为N的无符号数来说,其对应的二进制信息的最高位,即N-1位,就是他们的最高有效位,而假象存在的N位,就是相对于最高有效位的更高位。
adc指令,是带进位加法指令,它利用了CF位上记录的进位值。
指令格式:adc 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2+CF
加法可以分为两步来进行:①低位相加;②高位相加再加上低位相加产生的进位值。
sbb指令,是带进位加法指令,它利用了CF位上记录的借位值。
指令格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF
cmp(compare)是比较指令,cmp的功能相当于减法指令,只是不保存结果,将对标志寄存器产生影响。
cmp指令格式:cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2但不保存结果,仅仅根据计算结果对标志寄存器进行设置。
cmp ax,bx 如果(ax)=(bx),则zf=1
如果(ax)≠(bx),则zf=0
如果(ax)<(bx),则cf=1
如果(ax)≥(bx),则cf=0
如果(ax)>(bx),则cf=0并且zf=0
如果(ax)≤(bx),则cf=1或zf=1
cpu在执行cmp指令的时候,也包含两种含义:进行无符号数运算和进行有符号数运算。所以利用cmp可以对无符号数进行比较,也可以对有符号数进行比较。
在cmp指令执行过程中,结果暂存在cpu内部的暂存器中。
我们应该在考查sf(得知实际结果的正负)的同时考查of(得知有没有溢出),就可以得知逻辑上真正结果的正负。
如果没有溢出,逻辑上真正结果的正负=实际结果的正负
cmp ah,bh
sf=1,而of=0,则ah<bh
sf=1,而of=1,则ah>bh
sf=0,而of=1,则ah<bh
sf=0,而of=0,则ah≥bh
所有条件转移指令的位移都是[-128,127]
根据’无’符号数的比较结果进行转移的条件转移指令。
指令 含义 检测的相关标志位
je (jump equal)/jz 等于则转移 zf=1
jne (jump not equal)/jnz 不等于则转移 zf=0
jb (jump below)/jnae 低于则转移 cf=1
jnb (jump not below)/jae 不低于则转移 cf=0
ja (jump above)/jnbe 高于则转移 cf=0且zf=0
jna (jump not above)/jbe 不高于则转移 cf=1或zf=1
条件转移指令
CF:
jc JC为根据标志位CF进行转移的指令 cf=1
jnc JNC为根据标志位CF进行转移的指令 cf=0
SF:
js JS是根据符号标志位SF进行转移的指令 sf=1
jns JNS是根据符号标志位SF进行转移的指令 sf=0
OF:
jo JO是根椐溢出标志位OF进行转移的指令 of=1
jno JNO是根椐溢出标志位OF进行转移的指令of=0
PF:
jp/jpe 指令JP与JPE,它们是根据奇偶标志位PF进行转移的指令 pf=1
jnp/jpo指令JNP与JPO,它们是根据奇偶标志位PF进行转移的指令 pf=0
根据’有’符号数的比较结果进行转移的条件转移指令。
指令 含义 检测的相关标志位
jg/jnle 大于则转移 (ZF=0 且 SF=OF)
jge/jnl 大于或等于时短跳转 (SF=OF)
jl/jnge 小于时短跳转 (SF< >OF)
jle/jng 小于或等于时短跳转 (ZF=1 或 SF< >OF)
循环控制指令
loop (CX)<--(CX)-1,(CX)< >0,则转移至标号处循环执行,直至(CX)=0,继续执行后继指令
loopz/loope (CX)<--(CX)-1,(CX)< >0 且ZF=1时,转至标号处循环
loopnz/loopne (CX)<--(CX)-1,(CX)< >0 且ZF=0时,转至标号处循环
只要是zf=1,就可以使得je指令发生转移
其他同理。
串传送指令(通常和rep指令做搭档)
格式:movsb(move string byte),(字节,串传送指令)
功能:将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器df位的值,将si和di递增1或递减1
格式:movsw(move string word),(字,串传送指令)
功能:将ds:si指向的内存单元中的字送入es:di中,然后根据标志寄存器df位的值,将si和di递增2或递减2
rep的作用是根据cx的值重复执行后面的串传送指令。由于每执行一次movsb指令si和di都会递增或递减指向后一个单元或前一个单元,则rep movsb就可以循环实现(cx)个字符的传送
cld指令:将标志寄存器的df位置0
std指令:将标志寄存器的df位置1
使用串传送指令进行数据的传送,需要给它提供一些必要的信息:
①传送的原始位置:ds:si;
②传送的目的位置:es:di;
③传送的长度:cx;
④传送的方向:df。
pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器。
pushf和popf,为直接访问标志寄存器提供了一种方法。
标志位在debug中的表示
flag of df sf zf pf cf
值为1的标记 OV DN NG ZR PE CY
值为0的标记 NV UP PL NZ PO NC
[…]是闭区间,包括两端点的值
(…)是开区间,不包括两端点的值
- [kanwangxue] 如果是文字的,不是特别好啊,体力活,如果文字还加点动画,那就必须顶了。 01/15 01:10
- [kanwangxue] 必须顶啊。 01/15 00:54
- [ltoiii] 既然是实现loop功能,是否要考虑s和se标号? mov bx,offset s - offset 12/09 12:09
- [xiaoyao2012] 正确 11/01 15:33
- [xuer2016] 又找到2条被我忽视的地方: 1.PUSH 和 POP 针对字单元 2.POP 不能是CS 10/26 10:57
- [xuer2016] 学习了 我书写不规范,16进制字母前不加0,后面不加H,以后要注意了。。。 10/26 10:51
- [xuer2016] 来老师这学习下 10/26 10:31
- [youthangel] 不妙,CPU的利用率一下子就上去了。还好我的处理器不是太弱,35%左右的利用率。建议博主在修改一下 10/20 08:23
- [fpamc] 在我心里她就是我的女神。 10/02 08:58
- [newpeople] 你女朋友用得了简直就是一个女神…… 10/01 08:10
- [99998888] 请您指点一下如何找到会ASSEMBLER 语言的翻译,翻译成中文或英文。我的QQ ; 9097815 07/25 09:56
- [jeremy] 我觉得你学习的挺好,可以加你扣扣吗?我的469614823 08/07 14:46
- [zhangbo0805] 哈哈, 你好呀!很希望认识你呀!我发现你学习的积极性很高!正想向您学习呢! 07/31 23:31
- [tomato] 知道了,排得还挺满。 05/29 16:35
- [tomato] 现在学习情况怎么样?在做课设二还是什么? 05/29 10:41
- [tomato] 你的留言收到了。 05/05 23:51
- [fpamc] 开始学习c咯! 05/03 21:40
- [fpamc] 居然不能发博客了……! 04/22 21:03
- [tomato] 你相册中的游戏界面我看过了,非常好,界面很漂亮,很有创造力。博主,很有潜力。加油,一定能把这个游戏做 04/20 23:46
- [fpamc] 忙了半个月,不在家,没时间学习汇编。 但是在途中想到了一个有史以来最难的程序。对于刚学完9章的我。 04/13 20:56