焦作网站建设,dw做网站基础,做网站 南京,十大app软件下载条件码#xff1a;
① OF(Overflow Flag)溢出标志#xff0c;溢出时为1#xff0c;否则置0.标明一个溢出了的计算#xff0c;如:结构和目标不匹配.② SF(Sign Flag)符号标志#xff0c;结果为负时置1#xff0c;否则置0.③ ZF(Zero Flag)零标志#xff0c;运算结果为0时… 条件码
① 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中ax0000h’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 Beginners 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中的显示子程序(属第十章内容),在调用时注意相关参数的传递。