Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 奇怪的汇编语言加法_Assembly_Binary_Hex_Add_Cpu Registers - Fatal编程技术网

Assembly 奇怪的汇编语言加法

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)来实现的。如果是有符号的数字,

我最近一直在学习汇编语言,我遇到了一个我不懂的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
)来实现的。

如果是有符号的数字,则为
-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