0

我对 asm 中的指令有一些疑问

1)添加Rd,Rr; Rd 和 Rr 是无符号数还是有符号数?

2) 如何在寄存器中加载有符号数?我知道LDI Rd,K正在加载 unsgned。

3)你能给我提供两个16位数字相加的具体例子吗?一个数字是负数是否可行?

4

1 回答 1

1

2 的补码算法的好处在于,无论操作数是否有符号,加法和减法的工作方式都是一样的。由程序员适当地解释操作数和结果。但是检测溢出是不同的。

让我们添加12345-10123450x3039-100xfff6。我们将首先添加低字节,然后是高字节和第一次操作的进位。

LDI R16, 0x39 ; low byte of 12345
LDI R17, 0x30 ; high byte of 12345
LDI R18, 0xf6 ; low byte of -10
LDI R19, 0xff ; high byte of -10
ADD R16, R18   ; add low bytes without carry
; R16 is now 0x39 + 0xf6 = 0x2f and carry is 1
ADC R17, R19   ; add high bytes and the carry
; R17 is now 0x30 + 0xff + 0x01 = 0x30

因此,结果是0x302f期望值12335。现在,我们可以认为初始-10值是无符号数65526,结果在没有任何变化的情况下仍然是正确的,但在这种情况下,我们会出现溢出(回绕)。

您可以在 wikipedia 上阅读2 的补码

于 2013-10-07T22:16:04.640 回答