这是刚才的一个贴子,正确的答案是:
两条连续的指令同时设置进位标记和溢出标记, 这样的?
mov al, 80h
add al, 80h
我的问题是这样的:进位标志是对于无符号算术运算来说的,溢出标志是对于有符号运算来说的.执行add al, 80h指令后,由于两个负数相加的和为正数,所以设置溢出标志.即然CPU已经将80h当作是有符号数来处理.为什么还可以设置进位标志?
是不是CPU在设置进位标志的时候是将最高有效位向高位的进位值放到进位标志中,而设置溢出位,是将进位标志和目的操作数的符号位进行比较,不相等就设置溢出标志.它们的设置是一种机械的方式,根本不考虑是有符号数还是无符号数(因为CPU并不知道一个数字是有符号的还是无符号的,这是由程序员自己来选择解释哪些标志和忽略哪些标志).
初学,不对之处请原谅!谢谢
------解决方案--------------------------------------------------------
是的,CPU确实不知道一个MSB为1的数到底是正还是负,只有程序员才知道。
------解决方案--------------------------------------------------------
这是我对那个帖子的回复,节选一下:
其实关于有符号数与无符号数的问题,需要深刻理解书上的一句经典描述:“CPU并不知道一个数字是有符号的还是无符号的,它只是在操作之后机械地设置各种状态标志...程序员自己来选择解释哪些标志和忽略哪些标志”,这也就成为我们要使用“机器”思维的原因。
对于一个数,CPU在操作SF符号位时总把其当作是有符号数,而在处理CF符号位时总视其为无符号数,故而在处理各种标志位时,CPU采用的其实是不同的判断前提,把符号位割裂了开来处理的,所以才会让“程序员自己来选择解释哪些标志和忽略哪些标志”,因为只有程序员自己才知道究竟是想处理无符号数还是有符号数。