写出对存放在DX和AX中双字长数求补的指令序列
写出对存放在DX和AX中双字长数求补的指令序列:
答案:
NEG DX
NEG AX
SBB DX,0
为啥还要跟个 sbb dx,0?
[解决办法]
检查是否有借位
[解决办法]
这个,看指令的介绍,NEG 是 0 减去源操作数得到结果。这个是运算逻辑,和 cpu 的具体实现上不一定一致。
NEG (DX:AX) -> 00000000 - (DX:AX) -> (0000 - DX) 和 (0000 - AX) 两组。(0000-DX) 就是 NEG DX;(0000-AX) 就是 NEG AX。但 (0000-AX) 在 AX 非 0 时,就需要从高位字 (即 NEG DX 后的 DX) 借位;怎么借位呢,最简单的自然就是 SBB DX, 0 了。
[解决办法]
检测carry flag?
[解决办法]
经过百度得知 NEG指令是取反指令. NEG AX 等于 0减去AX 所以喃运算出来的结果比实际结果大一, 再因为这个指令要影响标志寄存器.所以用带进位的减法减去标志位..SBB AX,0 就相当于AX-0-CF.就是这样的..