我对 asm 中的指令有一些疑问
1)添加Rd,Rr; Rd 和 Rr 是无符号数还是有符号数?
2) 如何在寄存器中加载有符号数?我知道LDI Rd,K正在加载 unsgned。
3)你能给我提供两个16位数字相加的具体例子吗?一个数字是负数是否可行?
2 的补码算法的好处在于,无论操作数是否有符号,加法和减法的工作方式都是一样的。由程序员适当地解释操作数和结果。但是检测溢出是不同的。
让我们添加12345
和-10
。12345
是0x3039
和-10
是0xfff6
。我们将首先添加低字节,然后是高字节和第一次操作的进位。
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 的补码。