大西洋1912 发表于 2013-1-3 17:41:24

王爽汇编语言程序设计第十一章检测点问题

本帖最后由 大西洋1912 于 2013-1-3 17:45 编辑

1、写出下面每条指令执行后ZF、PF、SF标志位的值   Subal,al   Moval,1   Pushax   Popbx   Addal,bl   Addal,10      Mul   al         ZF=0PF=0    SF=0其中SF=0是因为最后的结果是保存在ax中吗注:ax=0090h=00000000 1001 0000B?2、写出下面每条指令执行后,ZF、PF、SF、CF、OF标志位的值。①Sub   al,al       CF=0OF=0SF=0ZF=1PF=1②Moval,10h    CF=0OF=0SF=0ZF=1PF=1③Add   al,90h    CF=0OF=0SF=1ZF=0PF=1④Mov   al,80h   CF=1OF=1SF=0ZF=1PF=1⑤Add   al,80h⑥Moval,0fch   CF=1OF=0SF=0ZF=0PF=0⑦Add   al,05h⑧Moval,7dh    CF=0OF=1SF=1ZF=0PF=1⑨Addal,0bh上面两个题红色部分是怎么计算出来的呢?mov指令对PF不影响吗?为什么第二句前面几个标志和前一句一样,而④⑥⑧句就不相同了?

小新110 发表于 2013-1-3 17:41:25

监测点11.1Subal,al      ZF=1 PF=1 SF=0(AL=0)
Moval,1      无影响
Pushax          无影响
Popbx         无影响    (BL=AL=1)
Addal,bl    ZF=0 PF=0 SF=0(AL=010B)
Addal,10 ZF=0 PF=1 SF=0(AL=1100B)
Mul   al   ZF=0 PF=1 SF=1
注:ax=0090h=00000000 1001 0000B兄弟,答案是对的,不过标志位标错了
ZF 零标志/Zero Flag结果为0,ZF=1。
PF 奇偶标志/Parity Flag结果为偶数PF=1最后我们的结果是两个1,偶数
SF 符号标志/Sign Flag 结果为负数 SF=1   我们的结果是 AL=1001 0000B 负数

以上结果经由debug和vs2010调试过
关键在最后一个mul上面,sf的值我也迷茫过,究竟是看ax还是看al,调试结果证明还是看al的,估计因为我们的mul 的操作是针对al的。
现学现卖,见笑了。
后面的题,回头有空继续

小新110 发表于 2013-1-4 11:27:03

哦,对了,调试看结果的时候记得在代码前加上一句mov ah,0将ah清零,不然标志位结果可能会不一样。

小新110 发表于 2013-1-4 15:17:37

汗颜,监测点11.2自己算的基本都算错了,唉
以下是vs2008调试的结果:(同样,需要将ah清0,否则结果会不一致)sub al,alCF=0 OF=0 SF=0 ZF=1 PF=1add al,90Hal=10H+90H=A0H=1010 0000B   CF=0 OF=0 SF=1 ZF=0 PF=1add al,80H80H对于有符号数是-128,那al=-128-128=-256 所以溢出了,此时:OF=1
对于无符号数:al=80H+80H=100HCF=1 SF=0 ZF=1 PF=1add al,05H0FCH的有符号数是-4,那al=-4+5=1 ,没有溢出,OF=0
对于无符号数的运算:al=0FCH+05H=101H=0001 0000 0001B CF=1 SF=0 ZF=0 PF=0add al,0BHal=7DH+0BH=88H=1000 1000H
CF=0 OF=1 SF=1 ZF=0 PF=1
虽然是正数,但是超出了有符号数的表达范围(-80H ~ 7FH),所以溢出了。

小新110 发表于 2013-1-4 15:21:07

果然比较难,这次算是比较深入的学习了一下标志寄存器了。
参考资料:
http://baike.baidu.com/view/1845107.htm
http://blog.csdn.net/masefee/article/details/4094183
补码的知识也需要,因为对于有符号数的转换
http://blog.fishc.com/442.html
页: [1]
查看完整版本: 王爽汇编语言程序设计第十一章检测点问题