我目前正在攻读考试,但是我订购了自己的Arduino套件,希望自己了解更多。
我正在为这门课学习MULSU和MULS。以下是他给我们的一个例子:
LDI r16, 150
LDI r17, 10
MULS r16, r17
;-106 * 10 = -1060
;R1:R0 = 0xFB:0xDC
我不明白的是为什么我们不采用10的两个补码,但是我们确实采用了150的两个补码。我想,既然它们都是签名的,我们将采用两个补码然后相乘。如果一个数字在一定范围内,如果签名则不需要更改吗?我注意到这在AVR中应用了很多,我觉得这是我需要了解的东西才能获得该领域的技能。
谢谢
答案 0 :(得分:2)
我假设我们在这里处理8位寄存器。
您提到的这两个数字都可以由位向量10010110
进行编码。当你把它作为无符号数字读出时,它意味着150.当你把它读成2的补码有符号数字时,它意味着-106。
如果某个数字在一定范围内,如果已签名则不需要更改吗?
好问题。要查看正在发生的事情,您可能希望列出长度为8的所有可能的bitvector,并尝试将它们解释为无符号和带符号的数字:
unsigned signed
00000000 0 0
00000001 1 1
00000010 2 2
...
01111101 125 125
01111110 126 126
01111111 127 127
10000000 128 -128
10000001 129 -127
10000010 130 -126
...
11111101 253 -3
11111110 254 -2
11111111 255 -1
无符号整数的范围是0 .. 255
,对于两个补码的有符号数,它是-128 .. 127
。但是如您所见,只要最重要的位是0
,无符号解释和带符号的解释就是相同的。
所以,提示回答你的问题:
我不明白的是为什么我们不采用10的两个补码,但我们确实采用了150的两个补码。
我认为您使用的汇编语言不允许您编写带符号的数字。如老师的评论所示,目的是乘以-106和10,但汇编程序可能只能理解无符号数。这就是为什么你要编写与(预期)有符号数字具有相同编码的无符号数字。对于-106,恰好是150(两者都编码为10010110
),对于10,恰好是10(两者都编码为00001010
)。