在AVR中,为什么我们有时只采用两个有符号数的补码?

时间:2014-05-06 13:45:20

标签: assembly avr twos-complement

我目前正在攻读考试,但是我订购了自己的Arduino套件,希望自己了解更多。

我正在为这门课学习MULSU和MULS。以下是他给我们的一个例子:

LDI r16, 150
LDI r17, 10
MULS r16, r17

;-106 * 10 = -1060
;R1:R0 = 0xFB:0xDC

我不明白的是为什么我们不采用10的两个补码,但是我们确实采用了150的两个补码。我想,既然它们都是签名的,我们将采用两个补码然后相乘。如果一个数字在一定范围内,如果签名则不需要更改吗?我注意到这在AVR中应用了很多,我觉得这是我需要了解的东西才能获得该领域的技能。

谢谢

1 个答案:

答案 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)。