汇编求补指令neg
·
1 原码、反码、补码
表示 | 正数 | 负数 |
---|---|---|
原码 | 数据本身的二进制表示(符号位为0) | 数据本身的二进制表示(符号位为1) |
反码 | 和原码一样 | 符号位不变,其余各位按位取反(1变0,0变1) |
补码 | 和原码一样 | 反码加1 |
2 指令详解
指令格式 | 含义 |
---|---|
neg reg/mem | reg/mem
⇐
\Leftarrow
⇐ 0-reg/mem, 即用0减操作数,并将求得的结果存入指定的寄存器或内存单元(把操作数按位取反,末位加1) |
2.1 理解方式一
1 操作数为正数的情况
mov al,64h
neg al ; al=9ch
首先明确一点,在计算机中,数据都是以补码的形式存储的。
1、64h的补码表示:0110 0100
2、按位取反:1001 1011
3、末位加1:1001 1100 = 9ch
2 操作数为负数的情况
mov al,-8
neg al ; al=08h
- -8的原码表示:1000 1000
- -8的反码表示:1111 0111
- -8的补码表示:1111 1000
- 按位取反:0000 0111
- 末位加1:0000 1000 = 8 = 08h
3 总结
当使用neg指令时:
1、先将操作数换成补码表示
2、再将操作数按位取反
3、最后加1。此时就能求出正确结果了。
2.2 理解方式二
当然,还可以从运算的角度计算(推荐使用这种方法),而且相对简单。仍然以上面例子说明:
- 当 al = 64h,neg al ⟺ \Longleftrightarrow ⟺ 0 - al ⟺ \Longleftrightarrow ⟺ 0 - 64h = -64h
- 当 al = -8,neg al ⟺ \Longleftrightarrow ⟺ 0 - al ⟺ \Longleftrightarrow ⟺ 0 - (-8)= 8
依旧要强调的是:在计算机中,数据都是以补码的形式存储的。
1、求 -64h 的补码
- -64h 原码:1110 0100
- -64h 反码:1001 1011
- -64h 补码:1001 1100 = 9ch
2、8的补码。正数的原、反、补码相同
- 8 原码:0000 1000
- 8 反码:0000 1000
- 8 补码:0000 1000 = 8
可以看出,这种方法对于操作数为负数的情况比较简便,相当于直接求绝对值。而操作数为正数时,就是求正数相反数的补码表示
总结:
- 操作数 > 0:加负号,求反码
- 操作数 < 0:直接求绝对值
更多推荐
已为社区贡献6条内容
所有评论(0)