Assembly 奇怪的汇编语言加法
我最近一直在学习汇编语言,我遇到了一个我不懂的add语句Assembly 奇怪的汇编语言加法,assembly,binary,hex,add,cpu-registers,Assembly,Binary,Hex,Add,Cpu Registers,我最近一直在学习汇编语言,我遇到了一个我不懂的add语句 ebx=00000003; esi=0FFFFFFFFh; add ebx,esi The Result was: ebx=00000002 这怎么可能? 有人能给我解释一下加法是怎么发生的吗?这是一个伪装成加法的减法。 指令add ebx,esi将esi中的-1值添加到ebx中的3值,从而得到值2 这是可能的,因为这是一个复杂的问题 减法是通过从0FFFFFFFFh(-1)溢出到00000000 h(0)来实现的。如果是有符号的数字,
ebx=00000003;
esi=0FFFFFFFFh;
add ebx,esi
The Result was: ebx=00000002
这怎么可能?
有人能给我解释一下加法是怎么发生的吗?这是一个伪装成加法的减法。
指令
add ebx,esi
将esi中的-1
值添加到ebx中的3
值,从而得到值2
这是可能的,因为这是一个复杂的问题
减法是通过从0FFFFFFFFh(
-1
)溢出到00000000 h(0
)来实现的。如果是有符号的数字,则为-1
。如果是和无符号数字,则值为UINT\u MAX
。(是的,这两个恭维词的计算是正确的)@Ramesh:将所有0翻转为1,反之亦然,称为1的补码(x86)。将所有0翻转为1,反之亦然,添加一个被称为两个补码,就像在链接(x86)中一样。你越老,你在大脑中收集的信息就越多。。。我已经存在很长一段时间了…你甚至可以把它当作两个无符号值,然后简单地从最低位进行加法<代码>3是0011
,F
是1111
=>右边的第一位都是1->0+进位,第二位都是1并进位->1+进位,第三位是1+0+进位->0+进位->这将重复到最后32位,留下进位。也就是说,结果是00…0010
binary=2
。它不是-1。如果你加上它,它的作用就像-1。注意一个十进制的例子,有4位数字:取2345加9999。结果将是2344和溢出。您没有“看到”前面的1(因为您只有4位数字),结果与减去0001的结果相同
ebx=000000003h; 3
esi=0FFFFFFFFh; -1
--------------; +
ebx=000000002h; 2