汇编求补指令neg

neg(求补指令)

  1. 指令格式:neg reg/mem
  2. 含义:reg/mem <-- 0-reg/mem,即用0减操作数,并将求得的结果存入指定的寄存器或内存单元(或者说把操作数按位取反,末位加1
  3. 操作数为正数的情况
mov al,64h  
neg al	    ; al=9ch

首先明确一点,在计算机中,数据都是以补码的形式存储的

  • 64h的补码表示:0110 0100(正数的原、反、补码相同)
  • 按位取反:1001 1011
  • 末位加1:1001 1100 = 9ch
  1. 操作数为负数的情况
mov al,-8         
neg al            ; al=08h
  • -8的原码表示:1000 1000
  • -8的反码表示:1111 0111
  • -8的补码表示:1111 1000
  • 按位取反:0000 0111
  • 末位加1:0000 1000 = 8 = 08h
  1. 总结
    当使用neg指令时
  • 先将操作数换成补码表示
  • 再将操作数按位取反
  • 最后加1

  此时就能求出正确结果了。


当然,还可以从运算的角度计算(推荐使用这种方法),而且相对简单。仍然以上面例子说明

  • 当 al = 64h,neg al <=> 0 - al <=> 0 - 64h = -64h
  • 当 al = -8,neg al <=> 0 - al <=> 0 - (-8)= 8

依旧要强调的是:在计算机中,数据都是以补码的形式存储的

  1. 让我们求 -64h 的补码。负数的补码 = 反码 + 1,负数的反码 :符号位不变,其余各位按位取反
  • -64h 原码:1110 0100
  • -64h 反码:1001 1011
  • -64h 补码:1001 1100 = 9ch
  1. 8的补码。正数的原、反、补码相同
  • 8 原码:0000 1000
  • 8 反码:0000 1000
  • 8 补码:0000 1000 = 8

可以看出,这种方法对于操作数为负数的情况比较简便,相当于直接求绝对值。而操作数为正数时,就是求正数相反数的补码表示

总结:

  1. 操作数 > 0:加负号,求反码
  2. 操作数 < 0:直接求绝对值
发布了50 篇原创文章 · 获赞 38 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42250302/article/details/103432850