这个是intel汇编语言程序设计(第四版)上面的一道题,实在是不会啊。
书上说,只有无符号数之间的计算才会有可能产生进位值,只有有符号数之间的运算才有可能产生溢出,这个,脑子转不过来。
其实就是有符号数和无符号数还是搞不明白,比如有一道题是这样的:
.data
val2 WORD 8000h 如果使用add指令对val2加1,那么进位标志和符号标志的值分别是什么? 我原来想当然的就认为都是零,因为我觉得不产生进位阿,也没有符号变化啊,可是事实证明我的理解是错误的,我放到程序里面一验证,符号标志是1,后来我想了想,改加1为加0,符号标志位也是1,现在是似懂非懂状态,朦朦胧胧。所以发个帖子问问大家,请大家指点阿,谢谢!
------解决方案--------------------------------------------------------
两条连续的指令同时设置进位标记和溢出标记, 这样的?
mov al, 80h
add al, 80h
标记寄存器中的符号位的设置, 是根据运算结果作为符号数来说是否为负数来进行设置的, 并不是数据的符号是否发生了变化而进行设置
------解决方案--------------------------------------------------------
mov al,0c0h
add al,80h
既然是学习CPU指令,就要以机器的思维来考虑一切问题,不能带有人的先入为主的思想。
书上P86页说得很清楚:OF标志位是根据位6的进位和位7的进位来进行异或的结果。那么这就是满足题目要求的操作数的构造条件。由此可知,想要造成溢出,则位6与位7的进位值必须相反(位6进位7不进,或位7进位6不进),所以满足该原则的两操作数(二进制表示)格式应该是:
01xx xxxx
+ 01xx xxxx
-----------
或
10xx xxxx
+ 1xxx xxxx
-----------
同时题目又要求设置CF,则较易判断出之后第二种格式可以同时设计CF和OF。
对于LZ的第二个问题,首先看80h的二进制表示,即1000 0000,其最高位(作有符号数时也就是符号位)为1,SF当然=1了,即便你加1(结果是1000 0001)还是加0(结果不变),最高位都为1,SF自然总为1。
其实关于有符号数与无符号数的问题,需要深刻理解书上的一句经典描述:“CPU并不知道一个数字是有符号的还是无符号的,它只是在操作之后机械地设置各种状态标志...程序员自己来选择解释哪些标志和忽略哪些标志”,这也就成为我们要使用“机器”思维的原因。
对于一个数,CPU在操作SF符号位时总把其当作是有符号数,而在处理CF符号位时总视其为无符号数,故而在处理各种标志位时,CPU采用的其实是不同的判断前提,也就割裂了符号位之间的关系,所以才会让“程序员自己来选择解释哪些标志和忽略哪些标志”,因为只有程序员自己才知道究竟是想处理无符号数还是有符号数。