《零基础入门学习汇编语言》第五十七讲
本帖最后由 shuiyu 于 2017-10-18 22:03 编辑越努力,越幸运。欢迎大家来看我的笔记{:10_297:},不对的请各位大佬指正,谢谢{:10_254:}
一、对于cmp指令的深入学习
(1)回顾一下cmp指令:功能相当于减法指令,只是不保存结果。模拟执行减法命令,减法命令后会导致标志寄存器发生什么变化;而这个标志寄存器的变化会保存下来,但是其它的都不会发生变化,所以说是模拟咯
(2)我们以cmp ah,bh为例进行说明:
如果(ah)=(bh) 则(ah)-(bh)=0,所以:ZF=1;
如果(ah)≠(bh) 则(ah)-(bh) ≠0,所以:ZF=0;
所以,我们根据cmp指令执行后ZF的值,就可以知道两个数据是否相等。 以此类推,可以得到很多信息。
(3)但是在有符号数的计算中,对于这个问题:cmp 操作对象1,操作对象2 指令执行后,SF=1,就说明操作对象1<操作对象2?当然不是。因为有一些数它在无符号数的情况下是正数,但是在无符号数是负数,所以造成了这个结论的不正确。(例如:0A0H在有符号数中他就是-20)
(4)总结:所得到的相应结果的正负,并不能说明,运算所应该得到的结果的正负。这是因为在运算的过程中可能发生溢出。如果有这样的情况发生,那么,SF的值就不能说明任何问题。 如果没有溢出发生的话,那么,实际结果的正负和逻辑上真正结果的正负就一致了。所以,我们应该在考察SF(得知实际结果的正负)的同时考察OF(得知有没有溢出),就可以得知逻辑上真正结果的正负,同时就可以知道比较的结果
(5)即:
如果SF=1,而OF=0
OF=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;(ah<bh)
如果SF=1,而OF=1
OF=1 ,说明有溢出,逻辑上真正结果的正负≠实际结果的正负;(相反ah>bh)
如果SF=0,而OF=1
OF=1 ,说明有溢出,逻辑上真正结果的正负≠实际结果的正负;(与逻辑真正结果相同ah<bh)
如果SF=0,而OF=0
OF=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;(ah≥bh)
二、检测比较结果的条件转移指令(这一讲是对于无符号数的)
(1)下面的内容中我们将学习一些根据cmp指令的比较结果(即,cmp指令执行后,相关标志位的值)进行工作的指令。
根据无符号数的比较结果进行转移的条件转移指令,它们检测ZF、CF的值;
和根据有符号数的比较结果进行转移的条件转移指令,它们检测 SF、OF和 ZF的值。
(2)条件转移指令小结:
(3)这些指令比较常用,它们都很好记忆,它们的第一个字母都是j,表示jump;后面的:
e:表示equal;
ne:表示not equal;
b:表示below;
nb:表示not below;
a:表示above;
na:表示not above。
编程训练
编程实现如下功能:
如果(ah)=(bh)则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)。
解:很简单的一个程序,看下面的图:
谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:},不对的请各位大佬指教,谢谢{:10_254:}
页:
[1]