【发布时间】:2018-06-24 17:12:34
【问题描述】:
我最近一直在学习汇编语言,遇到了一个我不明白的 add 语句。
ebx=00000003;
esi=0FFFFFFFFh;
add ebx,esi
The Result was: ebx=00000002
这怎么可能? 有人可以解释一下添加是如何发生的吗?
【问题讨论】:
标签: assembly binary hex add cpu-registers
我最近一直在学习汇编语言,遇到了一个我不明白的 add 语句。
ebx=00000003;
esi=0FFFFFFFFh;
add ebx,esi
The Result was: ebx=00000002
这怎么可能? 有人可以解释一下添加是如何发生的吗?
【问题讨论】:
标签: assembly binary hex add cpu-registers
这是一个被掩盖为加法的减法。
指令add ebx,esi 将ESI 中的-1 值与EBX 中3 的值相加,得到2 的值。
这是可能的,因为two complement binary addition。
ebx=000000003h; 3
esi=0FFFFFFFFh; -1
--------------; +
ebx=000000002h; 2
减法是通过从 0FFFFFFFFh(-1) 到 00000000h(0) 的溢出实现的。
【讨论】:
-1。如果是且 unsigned 数字,则值为 UINT_MAX。 (是的,你有正确的两个恭维计算)
NOT instruction)。将所有 0 翻转为 1,反之亦然并添加一个称为二补码,如链接中所示(x86 NEG instruction)。
3 是 0011,F 是 1111 => 右边的第一位是两个 1 -> 0 + 进位,第二位都是 1 并进位 -> 1 + 进位,第三位是 1+0+进位 -> 0 + 进位 -> 这将重复到最后 32 位,留给你携带。 IE。结果是00....0010 binary = 2。