汇编求补问题

来源:百度知道 编辑:UC知道 时间:2024/06/28 19:45:30
存放在DX:AX中的双字求补(负数)的指令段.
一共可以写出多少种?

1、NEG DX
NEG AX
SBB DX,0
解释:(ax)=0ffffh-(ax)+1;32位的求补是:0ffffffffh-32位的数+1。
而分别对dx,ax求补我们知道其实dx多加了一个"1";
因此(dx)=(dx)-1才是我们要的;
当ax!=0时,求补时CF=1;
sbb dx,0即为(dx)=(dx)-CF-0(CF=1)即为真实的dx。
(ax)=0时,neg ax;结果是:(ax)=0;且CF=0;
而32位的低16位为0时,求补的情况是:0ffffffffh-dx(高16位数)00000000h(低16位数)+1
可知低16位的情况为:ffffffffh+1=0, 且向高16位进位了,这时满足dx求补的情况了,所以(dx)=(dx);
而此时sbb dx,0:(dx)=(dx)-CF-0(CF=0)是符合条件的;
所以要多一条sbb dx,0,主要是真实的32位求补和分别对16位求补是有区别的。

2、
MOV BX,0
SUB BX,AX
MOV AX,BX
MOV BX,0
SBB BX,DX
MOV DX,BX
利用0-原码=补码 这个原理
3、
NOT DX
NOT AX
ADD AX,1
ADC DX,0 利用取反加1的方法