关于这个问题百度查了半天,都没有比较全面的解释,所以我来了!
-
首先我们需要知道,al是用两位16进制的数来保存数据的, 所以正数最多保存0~255(十进制),FFH
-
处理器内部以补码表示有符号数,8个二进制位能够表达的整数范围是:+127 ~ -128
那么补码怎么求呢?
如下:
-
正数的补码就是其本身
-
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补 [-1] = [10000001]原 = [11111110]反 = [11111111]补
一定要注意,正数的补码是他本身,我身边很多人搞不懂下面这玩意,都是因为忘了正数的补码就是本身,然后傻乎乎的用负数方法去求正数补码
例1:
3AH + 7CH=B6H
无符号数运算:58+124=182,范围内,无进位(<255)
有符号数运算: 58+124=182 ,范围外,有溢出(>127)
例2:AAH + 7CH=(1)26H
无符号数运算:170+124=294,范围外,有进位(>255)
有符号数运算:-86+124=28 ,范围内,无溢出(-128<28<127)
上面有符号运算里,58和-86不知道怎么来的同学不要急,
接着往下看:
再来说说书上的例子:
这里是王爽的《汇编语言(第三版)》P218
- mov al,0F0H 240(十进制)
- add al,88H 136(十进制)
- 无符号运算:al=240+136=376>255 所以有进位,CF=1
有符号运算:al=-16-120=-136<-128所以有溢出,OF=1 - mov al,0F0H 240(十进制)
- add al,78H 120(十进制)
- 无符号运算:al=240+120=360>255 所以有进位,CF=1
有符号运算:al=-16+120=104,-128<104<127 所以无溢出,OF=0
具体的计算过程如下:
看懂书上这个例子就差不多了,
然后我们再带入之前的那个例子根据步骤计算,不难得到58和-86的值
就是这么简单