溢出问题
本帖最后由 hosoo 于 2015-1-23 19:32 编辑mov al,10h
add al,90h
al进行有符号运算结果OF为多少?
楼主,这问题有点看不懂,前两句我想你是肯定明白什么意思的,你说的有符号运算是关于正负的问题?
在cpu只有或和与运算,他不管你是什么加减乘除,至于到底翻译出什么是编译器说的算吧? 他会进行一个
转换,比如C++中 +号等本身也算是一个函数,底层有换算。 Lyk 发表于 2015-1-23 22:13
楼主,这问题有点看不懂,前两句我想你是肯定明白什么意思的,你说的有符号运算是关于正负的问题?
在cpu ...
这是汇编第十一章的内容监测11.2的问题,我知道怎么算,但是就这一个算出来的OF结果和答案不一致,所以问问论坛里的前辈,怎么计算的。 本帖最后由 hosoo 于 2015-1-26 09:33 编辑
hosoo 发表于 2015-1-26 09:22
这是汇编第十一章的内容监测11.2的问题,我知道怎么算,但是就这一个算出来的OF结果和答案不一致,所以问 ...
我是这样计算的
无符号运算:10H+90H=A0H (1010 0000B) 从二进制上看 CF是等于0的
有符号运算:(-10H)+(-90H)=F0H+70H=160H (0001 0110 0000B)
因为AL为1字节 那么无符号AL=A0H 有符号AL=60H 从二进制看出结果已经溢出了所以OF=1的
但是答案给出的OF值却为0,所以不明白。知道的前辈指点一下,谢谢!
符号位我也一直搞不明白,MARK一下。 同求解释,☆⌒(*^-゜)v THX!! 有点忘记了那个标记寄存器的知识了,不过楼主我给你讲一下我自己学这个的时候所总结出来的东西,希望对你有帮助。
首先呢,你上面说的是al也就是说是8位的,我们知道8位的范围应该是0到FF(无符号的)也就是十进制的0到255共256个数字,而256/2=128,所以呢就分给了正数和负数,这样就有了8位的负数范围为【-128,0)正数的范围为(0,127】如果是十六进制的话就是【80,FF】和【1,7F】(注意十六进制的我没有算0)
这样一来,如果两个8位的十六进制的数想家的和超过7F,那么就是负数了,这样OF位应该就是,额,什么来着忘记了,应该是1吧没记错的话。。。。。
希望可以帮到你 比冲一下,多用微软的计算器 擅用论坛的搜索功能,这种问题之前我有过详细的解答。 8位的有符号数是-128到+127,10H就是16,不可能是负值,90H是144超过了127,所以应该是负的112,所以相加应该还是负值,就是+16+(-122),结果为-96也就是A0,所以溢出标志位应该为0,也就是说没有溢出。 按有符号数算,10H是16 90H是-16相加等于0. 溢出指的是超出八位所能表示的范围,意思就是如果计算结果小于-128 大于127(内存中数据都是以补码形式存放的)就会产生溢出,有点像CF是第九位,溢出的那位被放在了第九位。 比如-126 - 5 = -131 在内存中的存放形式是(1)00000011,则溢出,结果取反。
看看而已 10H:0001 0000B,最高位(符号位)是0,表示这个数是正数,次高位(符号数的数值最高位)为0
90H:1001 0000B,最高位(符号位)是1,表示这个数是负数,次高位(符号数的数值最高位)为0
0001 0000B+1001 0000B=1010 0000B,相加的结果是次高位没有向符号位(最高位)进位,所以没有溢出。 楼上正解,顺便说一句都是补码
页:
[1]