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_Hex_Subtraction - Fatal编程技术网

Assembly 从较小的数字(十六进制)中减去较大的数字

Assembly 从较小的数字(十六进制)中减去较大的数字,assembly,hex,subtraction,Assembly,Hex,Subtraction,我在做一些关于系统号的练习题。一切都很好,但我陷入了一个问题,在十六进制系统中,我从一个较小的数字中减去较大的数字(基数16) (1234-ABEF)我开始这样做 4 - F = 5 (borrow 16 from 3 so it becomes 2) 2 - E = 4 (borrow 16 from 2 so it becomes 1) 1 - B = 6 (borrow 16 from 1 so it becomes 0) 0 - A = ? I don't know what to

我在做一些关于系统号的练习题。一切都很好,但我陷入了一个问题,在十六进制系统中,我从一个较小的数字中减去较大的数字(基数16)

(1234-ABEF)我开始这样做

4 - F = 5 (borrow 16 from 3 so it becomes 2)
2 - E = 4 (borrow 16 from 2 so it becomes 1)
1 - B = 6 (borrow 16 from 1 so it becomes 0)
0 - A = ?   I don't know what to do here ? where should I borrow from ?
我用了一个在线计算器,它告诉我最后的答案是 (1234-ABEF=FFFF6645)


谢谢你

没有什么可借来的,所以结果是否定的

您使用的在线计算器的假设是,您正在处理32位有符号值,并且由于您要从较小的值中减去较大的值,因此从1234中减去ABEF的值会自动结束并变成FFFF6645,也称为十进制-39355


旁注:如果您在Windows上,内置计算器可以帮助您在“程序员”视图中进行这些计算。

逻辑没有减法,减法是通过加法完成的。记住,twos补足“倒转加1”。当你做十进制数学,加上99+3,第一列是9+3=2,以1为进位。带出的数字进入顶部的进位槽,第二列1(进位)加9(第一个操作数)加0(第二个操作数为placholder)。第三列是1+0+0=1,我们可以称之为完成。可以可视化三行:进位、第一个操作数、第二个操作数。。进位槽位于第一列上。现在想想二进制,你可以用列(十六进制就是二进制,四位一组,如果你用铅笔和纸,你会把十六进制分解成单独的位)做完全相同的数学运算。所以我们从学校知道a+b=a+(-b)是对的,我们知道在二进制中-b是两个,补码是倒数加一。那么,如果简单地反转并将其用作第二个操作数,并且第一列的进位槽中的加法是1,那么0x1234-0xABEF与0x1234+(-0xABEF)=0x1234+(~0xABEF)+1=0x01234+(~0x0ABEF)+1(添加了一些填充)=0x01234+0xF5410+1=0xF6645,会怎么样呢。或者,如果要将其修剪为16位,则为0x6645。如果您使用的是32位,那么它是0xFFFF6645,64位0xFFFFFFFF6645。就像十进制99+3=100或0100或00000000 100一样,这取决于我们要用数字填充多少位

如果我们做了0x1234-0x0005=0x01234+0xFFFFA+1=0x01224会怎么样。左边的填充是零。没有借款。另一个号码是借来的,左边的是永远的。或者从另一个角度来看,答案是否定的。二进制中的负一是反转并向右加一,所以0x001反转为0xFFFFF…FFFFF,表示alu或寄存器中的位数,然后加一,得到0xFFFF…FFFF。如果是8位寄存器0xFF、16位0xFFFF、32位0xFFFFFF。与上面的0xFFFF…FF6645相同。倒过来加上一个0x99BA+1=0x99BB=39355或实际上是-39355

0x1234=4660,0xABEF=44015,在计算器4460-44015=-39355上