小谈16位汇编NEG求补指令

16位汇编,看到别人写的3行代码对一个32位数求补,举例子论证

NEG是求补指令,把他之后的操作数求补(先求反再加1)
本指令影响标志位CF、OF、SF、PF、ZF及AF.

有一个32位的数
高16位存储在Dx
低16位存储在Ax,写出指令对其求反

NEG DX
NEG AX
SBB DX,0

NEG后面的操作数,如果值不为0,CF就总为1
让我死都不明白的是为什么NEG指令要这样设置,为什么如果NEG后面操作数不为0就让那个CF等于1?当操作数为0时,取反加1还是0进了一位,当操作数为0的时候CF才应该等于1啊,而其他数求补都没有进位,为什么CF就等于1了呢?
后来发现在这道题中就可以看出这样设置非常正确
举个例子,假如DX和Ax中的数都不为0,
设Dx= 0000 0000 0000 1000
AX= 0000 0000 0000 0010
这个数完整的是
0000 0000 0000 1000 0000 0000 0000 0010
求补
1111 1111 1111 0111 1111 1111 1111 1110

分别求反两个数
则DX=1111 1111 1111 1000
AX=1111 1111 1111 1101
这个数完整写出来
1111 1111 1111 1000 1111 1111 1111 1101
对比正确求反结果,DX多加了一个1(注:求反与求补不同)


NEG指令设置的是后面的操作数只要不为0则CF为1
所以在SBB(sub with borrow)的时候,把CF减了进去


我们再来看当其中DX和AX其中一个为0的时候
我们就设DX= 0000 0000 0000 1000
AX=0000 0000 0000 0000 0000
NEG DX
则dx=1111 1111 1111 1000
NEG AX
AX仍然为0,且CF=0
SBB DX,0
DX<- DX-0-CF
即:DX<- DX-0-0
DX的值不变
得到1111 1111 1111 1000 0000 0000 0000 0000
我们来求补0000 0000 0000 1000 0000 0000 0000 0000 这个数
先求反1111 1111 1111 0111 1111 1111 1111 1111
加1
1111 1111 1111 1000 0000 0000 0000 0000
得出的结果是正确的

其实现在看这个问题不是很难,不过我们知道了为什么NEG指令对后面操作数如果不是0,CF就等于1,和平常的无符号数溢出有点不一样

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值