求教溢出标志位
本帖最后由 superbe 于 2020-10-2 15:35 编辑《汇编语言 基于x86处理器》第7版 P105页的一个小题,题目如下:
7. 下面的代码中,AL为一字节有符号数。说明,在判断AL最终结果是否在有符号数的有效范围内时,溢出标志位是否有用,若有用,是如何起作用的?
mov al,-1
add al,130
此题我本来的想法是这两行代码计算 -1+130 = 129,超出了AL中有符号数的范围(-128~127),所以溢出标志位应该置1。
但实际我在VS中单步调试,执行完这两行代码后溢出标志位为0。所以就不明白了,求教前辈此题应该如何解答。
听说过吗?正+负永远不会溢出… 书上说“如果两个加数的符号相反,则不会发生溢出”,可能是我没理解吧。
是不是可以这样理解,没有溢出说明计算结果就是有效的。但AL中计算结果是81h,做为有符号数来看就是-127(按补码存储),这也不等于129啊,
新手很糊涂,不好意思。 mov al,-1 -1->0xFFFFFFFF->0xFF ;debug里面 mov al,-1 AX=00FF
add al,130 130->0x82->1000 0010B(第七位为1,有符号数)->(补码 取反加一 绝对值)0111 1101B +1=0111 1110B=0x7e=-126
-1+-126=-127=0xFFFF FF81=0x81;debug里面测试最后为add al,130 AX=0x81
以上都是瞎说,因为我也不懂, 狗头...
本帖最后由 无闻无问 于 2020-9-24 09:15 编辑
superbe 发表于 2020-9-23 21:52
书上说“如果两个加数的符号相反,则不会发生溢出”,可能是我没理解吧。
是不是可以这样理解,没有溢出说 ...
81是-127,也是129啊,计算机是不区分正负的,你当它是正它就是正,当它负就是负…溢出与否,看符号位是否变化,正+正=负,负+负=正,溢出,正+负,永远不会溢出,of位溢出了结果就不正确…
-1………FF…11111111
+ 130…82…10000010
------------------------------
1 10000001
结果:10000001=129即 -127
进位,cf为1
最高位符号位未变,of为0
在汇编里,没有正负数区分,所谓正负数是编程人员或编译器决定的……
10000001,0x81,129,如果编程人员定义变量输出,按有符号输出,显示-127,按无符号输入显示129,在内存中它不管你有无符号,反正给你存储81,你想按什么输出是你编程人员决定的……
浅显理解,可能不对… 在汇编里,没有正负数区分,所谓正负数是编程人员或编译器决定的……
10000001,0x81,129,如果编程人员定义变量输出,按有符号输出,显示-127,按无符号输入显示129,在内存中它不管你有无符号,反正给你存储81,你想按什么输出是你编程人员决定的……
二进制补码和加法我是知道的,有一点不明白的是,在计算-1+130时, 应把-1和130看作是有符号数吧,那输出计算结果时也应该按有符号数输出吧,但这样输出-127是不对的。
反而是按无符号数输出129才是正确的。那么我怎么确定该用哪种方式(有符号还是无符号)输出呢? superbe 发表于 2020-9-24 11:19
二进制补码和加法我是知道的,有一点不明白的是,在计算-1+130时, 应把-1和130看作是有符号数吧,那输出 ...
这里没有正负,没有-127,也没有130,它就是0x81,你看成负数,它就是-127,看成正数就是129,究竟是正是负,取于程序编程时,是如何定义输出的…即按有符号还是无符号…
就像-1,它在内存中就是FF,在内存里,你说它是负,或正都是不当的,因为计算机不管你正负,只管它自己的方式存储与计算,你编程输出时,按unsigned char输出它就是正数255,按char有符号输出它就是-1…
计算机内部不分正负,这个我已经明白了。只是不知道编程时输出到底是用"unsigned char"还是"char"?
对于-1+130来说,可能能看出来应该用"unsigned char",但假如让用户输入任意的两个数呢,程序中输出应该用"unsigned char"还是"char"呢 感谢 无闻无问 褚殇梦 的耐心解答
mov al,-1
add al,130
这种情况下,有没有什么方法能判断计算结果已经超出了有符号数的范围呢。 JGE 不知道行不行
页:
[1]
2