条件码:

  • ① OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明一个溢出了的计算,如:结构和目标不匹配.
  • ② SF(Sign Flag)符号标志,结果为负时置1,否则置0.
  • ③ ZF(Zero Flag)零标志,运算结果为0时置1,否则置0.
  • ④ CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位.
  • ⑤ AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。有进位时1,否则置0.
  • ⑥ PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0.

控制标志位:

  • ⑦ DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。
  • ⑧ IF(Interrupt Flag)中断标志。
  • ⑨ TF(Trap Flag)陷井标志。

11.1 ZF 标志( 0 标志位 )

11.2 PF 标志( 奇偶 标志位 )

11.3 SF 标志 ( 结果正负标志。0 表示 正,1 表示 负 )

https://blog.csdn.net/zhangjiuding/article/details/79133961

写出下面每条指令执行后,ZF、PF、SF等标志位的值。

ZF标志:是否为0 
PF标志:结果中是否有偶数个为 1 的 bit位。 
SF标志:结果是否为负,仅有符号运算有用。

提示:传送指令不影响标志位。至于为什么是这样,我估计是因为更改标志位会费时间,CPU的资源很宝贵,而且转移指令的标志位并没有什么实际意义

  1. sub al,al 结果为0,有0个为1的bit位,非负。
  2. mov al,1 传送指令不影响标志位。
  3. push ax 传送指令不影响标志位。
  4. pop bx 传送指令不影响标志位。
  5. add al,bl 结果为00000010B,结果不为0,有1个为1的bit位,非负。
  6. add al,10 结果为00001100B,结果不为0,有2个为1的bit位,非负。
  7. mul al 结果为10010000B,结果不为0,有2个为1的bit位,非负。

11.4 CF 标志 ( 进位 标志位 )

11.5 OF 标志 ( 溢出 标志位 )

11. 6 adc 指令

11.7 sbb 指令

11.8 cmp 指令

11.9 检测比较结果的条件转移指令

11.10 DF 标志 和 串传送指令

11.11 pushf 和 popf

题目:下面的程序执行后,ax的值是多少?

assume cs:codesg
datasg segmentdb 16 dup(0)
datasg ends
codesg segmentstart:mov ax,0push axpopfmov ax,0fff0hadd ax,0010hpushfpop axand al,11000101band ah,00001000bmov ax,4c00hint 21hcodesg endsend start

这题是对第十一章标志寄存器的更好理解。
先上个图:

本题关键在于 OF  标志的判断。另一个关键点是 and 0000 0100 1100 0101 起到了屏蔽未学习位的作用!

一步一步来分析:

mov ax,0     将ax置0
push ax ax   入栈
popf         将栈中的数据弹出到psw(标志寄存器)中
此时 psw 中数据为:0000 0000 0000 0000b

mov ax, 0fff0h
add ax, 0010h
这两句的作用是(ax) = fff0h + 0010h,显然,psw中的数据会发生改变,问题是:如何改变呢?

CF: 假设这里是无符号运算,则1111 1111 1111 0000b(fff0h) + 0000 0000 0001 0000b(0010h) = 1 0000 0000 0000 0000b,已经发生了进位,所以CF = 1
PF: 结果保存在ax中,ax=0000h,’1’的个数是0,是偶数,所以PF标志=1

AF: AF没学,先不管,假设它是个不确定值,AF = ?
ZF: 结果是0,显然ZF = 1

SF: 结果是0,不是负数,所以SF = 1
TF: TF没学,先不管,假设它是个不确定值,AF = ?

IF: IF没学,先不管,假设它是个不确定值,AF = ?
DF: DF为方向标志位,add指令不会影响DF,前面已经将psw置0,所以DF = 0

OF: OF(溢出标志位)对初学者来说是最难的了,OF记录了有符号数运算结果是否溢出。那么,如何判断是否溢出呢?

假设是有符合运算,fff0h(1111 1111 1111 0000b)对应的原码是1000 0000 0001 000b(即十进制-16),这是如何算出来的?很简单:先看符号位1,说明是个负数,然后所有位取反再加1(即0000 0000
0001 0000b)得绝对值,前面确定是负数,所以符号位应该是1,则原码为1000 0000 0001 000b,同样,0010h的源码(正数的补码和原码相同)是0000 0000 0001 0000b(即十进制的16),

显然,结果是0,一个正数一个负数相加,结果肯定不会溢出!!!下面给出一个tip,用来快速判断运算是否溢出:
tip: 正加正得负,负加负得正,肯定溢出

一正一负相加肯定不会溢出

(进行正加正,负加负运算时,可以全部转为十进制来看,如果得到正加正得正,负加负得负,则需看他们结果是否在可表示范围内)

通过说明的tip,立刻可以判断出未溢出,所以OF = 0;

所以:运行完上面两条语句后,psw值为: 0000 00?? 010? 0101b

pushf 将psw的值入栈
pop ax 此时ax即: 0000 00?? 010? 0101b

and al,11000101b
and ah,00001000b

and 的是按位与,运算法则是:有0则0,我们写对齐来看

0000 00?? 010? 0101b
0000 1000 1100 0101b
显然 and 以后 ax = 0000 0000 0100 0101b = 45h

11.12 标志寄存器在 debug 中的表示

实验 11: 编写子程序

示例代码:

assume cs:codesgdatasg segmentdb "Beginner's All-purpose Symbolic Instruction Code.",0
datasg endscodesg segment
begin:mov ax,datasgmov ds,axmov si,0call lettercmov ax,4c00hint 21hletterc: ;子程序部分[开始]push si
s0:     mov al,[si]cmp al,0je exitsubcmp al,61h  ; 61h为'a'的ASCII码jb nextcmp al,7ah  ; 7ah为'z'的ASCII码ja nextand al,11011111B    ;或使用sub al,20hmov [si],al
next:   inc sijmp short s0
exitsub:pop siret        ;子程序部分[结束]
codesg ends
end begin; 提示:
; 1.相当于将字符串中的每个字符在闭区间['a','z']内进行比较;
; 2.欲显示相关字符串,可调用实验10中的"显示子程序"(属第十章内容),在调用时注意相关参数的传递。

王爽 汇编语言第三版 第11章 标志寄存器相关推荐

  1. 王爽 汇编语言第三版 第10章 call 和 ret 指令 以及 子程序设计

    第10章 call 和 ret 指令 10.1 ret 和 reft 指令 call 和 ret 指令都是转移指令,他们都修改 IP,或同事修改 CS 和 IP .他们经常被共同来实现子程序的设计. ...

  2. 王爽 汇编语言第三版 第7章 --- 更灵活的定位内存地址的方法(可以理解为 数组形式的内存定位)

    汇编语言(第三版)王爽著 的十二个实验:https://blog.csdn.net/OrangeHap/article/details/89791064 大小端 字节对齐 对于 arm,intel 这 ...

  3. 王爽 汇编语言第三版 第9章 转移指令的原理

    第九章  转移指令的原理 汇编代码: assume cs:codesgcodesg segments: mov ax,bx ; mov ax,bx 的机器码占两个字节mov si, offset sm ...

  4. 王爽 汇编语言第三版 第8章( 寻址方式 ) --- 数据处理的两个问题

    第八章    数据处理的两个基本问题 8.6 综合应用 示例代码 1: assume cs:codesg,ds:datasgdatasg segmentdb 1024 dup (0) datasg e ...

  5. 王爽汇编语言第三版答案

    转载自 https://blog.csdn.net/modiz/article/details/88776695 部分加上自己的分析,感谢 Modiz 汇编语言答案(王爽) 检测点1.1 (1)1个C ...

  6. 王爽 汇编语言第三版 课程设计 1

    From:https://www.cnblogs.com/Since-natural-ran/p/6938133.html 汇编语言-课程设计1: https://www.cnblogs.com/ts ...

  7. 王爽 汇编语言第三版 问题 7.9 将 datasg 段中前4个字母变成大写(汇编中的双重循环)

    问题 7.9: 将 datasg 段中前 4 个字母变成大写 汇编代码: assume cs:codesg,ss:stacksg,ds:datasgstacksg segmentdb 0,0,0,0, ...

  8. 王爽 汇编语言第三版 监测点9.2 监测点9.3 补全编程,利用jcxz指令,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,

    补全编程,利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中. 而且,截图中给出了是字节.是8位,占通用寄存器的一半空间!区分出CL,CH! 为了区分 ...

  9. 汇编语言答案(王爽)第三版

    汇编语言答案王爽第三版 检测点11 检测点21 检测点22 检测点23 检测点31 检测点32 检测点32 检测点61 检测点61 检测点91 检测点91 检测点92 检测点93 检测点101 检测点 ...

最新文章

  1. 对时序逻辑电路采用不同描述方式,ISE综合出来的电路(RTL Schematic)比较(以模5计数器为例)
  2. C# 文件/文件夹压缩解压缩
  3. 人生苦短,我用python,为什么选择python,python简介
  4. Spring再次涵盖了您:继续进行消费者驱动的消息传递合同测试
  5. python ctypes 回调函数_如何用Python中的ctypes创建回调函数?
  6. 付款更方便了?腾讯接入!微信支持数字人民币支付
  7. 微信公布9月朋友圈十大谣言:包括接通电话手机的钱就会被转走
  8. 【Flink】Flink Remote Shuffle 开源:面向流批一体与云原生的 Shuffle 服务
  9. paip.asp 项目流程及管理工具总结
  10. rdkit GetAtoms获取化合物每个位置的索引;rdkit FindMCS大公共相同结构 找不同化合物之间的差异
  11. 论文中三线式表格的快速插入(word)
  12. 保护模式 80386
  13. 软件测试基础:白盒测试方法:用基本路径覆盖法设计测试用例,基本路径覆盖测试技术设计测试用例的步骤
  14. 如何快速编写一个汇编软件
  15. 只有程序员才能读懂的三国演义(一)
  16. Oracle:ORA-00054 资源正忙
  17. 第四届橙瓜网络文学奖评选仙侠排行,辰东《遮天》竟然不是排第一?
  18. linux spec 脚本,RPM包制作之Spec文件详解
  19. LaTex排版时track changes
  20. 罗振宇向左,吴晓波向右

热门文章

  1. All in Linux:一个算法工程师的IDE断奶之路
  2. 工程实践:基于规则模式的军事和医药领域知识图谱问答快速实现
  3. 德勤发布《 2020 亚太四大半导体市场的崛起》报告,美国收入占比达到47%,中国大陆仅占 5%
  4. 国科大prml15-BP
  5. 浅谈多重背包及其优化
  6. LUOGU P4016 负载平衡问题
  7. 循环,函数,指针作业
  8. Java的for-each循环
  9. Python shutil.md
  10. (六)Spark-Eclipse开发环境WordCount-JavaPython版Spark