王爽 汇编语言第三版 第11章 标志寄存器
条件码:
- ① 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的资源很宝贵,而且转移指令的标志位并没有什么实际意义
- sub al,al 结果为0,有0个为1的bit位,非负。
- mov al,1 传送指令不影响标志位。
- push ax 传送指令不影响标志位。
- pop bx 传送指令不影响标志位。
- add al,bl 结果为00000010B,结果不为0,有1个为1的bit位,非负。
- add al,10 结果为00001100B,结果不为0,有2个为1的bit位,非负。
- 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章 标志寄存器相关推荐
- 王爽 汇编语言第三版 第10章 call 和 ret 指令 以及 子程序设计
第10章 call 和 ret 指令 10.1 ret 和 reft 指令 call 和 ret 指令都是转移指令,他们都修改 IP,或同事修改 CS 和 IP .他们经常被共同来实现子程序的设计. ...
- 王爽 汇编语言第三版 第7章 --- 更灵活的定位内存地址的方法(可以理解为 数组形式的内存定位)
汇编语言(第三版)王爽著 的十二个实验:https://blog.csdn.net/OrangeHap/article/details/89791064 大小端 字节对齐 对于 arm,intel 这 ...
- 王爽 汇编语言第三版 第9章 转移指令的原理
第九章 转移指令的原理 汇编代码: assume cs:codesgcodesg segments: mov ax,bx ; mov ax,bx 的机器码占两个字节mov si, offset sm ...
- 王爽 汇编语言第三版 第8章( 寻址方式 ) --- 数据处理的两个问题
第八章 数据处理的两个基本问题 8.6 综合应用 示例代码 1: assume cs:codesg,ds:datasgdatasg segmentdb 1024 dup (0) datasg e ...
- 王爽汇编语言第三版答案
转载自 https://blog.csdn.net/modiz/article/details/88776695 部分加上自己的分析,感谢 Modiz 汇编语言答案(王爽) 检测点1.1 (1)1个C ...
- 王爽 汇编语言第三版 课程设计 1
From:https://www.cnblogs.com/Since-natural-ran/p/6938133.html 汇编语言-课程设计1: https://www.cnblogs.com/ts ...
- 王爽 汇编语言第三版 问题 7.9 将 datasg 段中前4个字母变成大写(汇编中的双重循环)
问题 7.9: 将 datasg 段中前 4 个字母变成大写 汇编代码: assume cs:codesg,ss:stacksg,ds:datasgstacksg segmentdb 0,0,0,0, ...
- 王爽 汇编语言第三版 监测点9.2 监测点9.3 补全编程,利用jcxz指令,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,
补全编程,利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中. 而且,截图中给出了是字节.是8位,占通用寄存器的一半空间!区分出CL,CH! 为了区分 ...
- 汇编语言答案(王爽)第三版
汇编语言答案王爽第三版 检测点11 检测点21 检测点22 检测点23 检测点31 检测点32 检测点32 检测点61 检测点61 检测点91 检测点91 检测点92 检测点93 检测点101 检测点 ...
最新文章
- 对时序逻辑电路采用不同描述方式,ISE综合出来的电路(RTL Schematic)比较(以模5计数器为例)
- C# 文件/文件夹压缩解压缩
- 人生苦短,我用python,为什么选择python,python简介
- Spring再次涵盖了您:继续进行消费者驱动的消息传递合同测试
- python ctypes 回调函数_如何用Python中的ctypes创建回调函数?
- 付款更方便了?腾讯接入!微信支持数字人民币支付
- 微信公布9月朋友圈十大谣言:包括接通电话手机的钱就会被转走
- 【Flink】Flink Remote Shuffle 开源:面向流批一体与云原生的 Shuffle 服务
- paip.asp 项目流程及管理工具总结
- rdkit GetAtoms获取化合物每个位置的索引;rdkit FindMCS大公共相同结构 找不同化合物之间的差异
- 论文中三线式表格的快速插入(word)
- 保护模式 80386
- 软件测试基础:白盒测试方法:用基本路径覆盖法设计测试用例,基本路径覆盖测试技术设计测试用例的步骤
- 如何快速编写一个汇编软件
- 只有程序员才能读懂的三国演义(一)
- Oracle:ORA-00054 资源正忙
- 第四届橙瓜网络文学奖评选仙侠排行,辰东《遮天》竟然不是排第一?
- linux spec 脚本,RPM包制作之Spec文件详解
- LaTex排版时track changes
- 罗振宇向左,吴晓波向右