我目前正在为考试做准备,但是我订购了自己的Arduino套件,并且想自己了解更多。
我正在为这堂课学习MULSU和MULS。这是他给我们的一个例子:
LDI r16, 150
LDI r17, 10
MULS r16, r17
;-106 * 10 = -1060
;R1:R0 = 0xFB:0xDC
我不明白的是为什么我们不取10的补码,而取150的补码。我想,因为它们都是带符号的,所以我们要取两者的补码,然后相乘。如果数字在一定范围内,是否经过签名可以不必更改?我注意到这在AVR中有很多应用,我觉得这是我需要了解的内容,以便获得该领域的技能。
谢谢
我假设我们在这里处理8位寄存器。
您提到的两个数字都可以由bitvector编码10010110
。当您将其阅读为无符号数字时,表示150。当您将其阅读为二进制补码时,则表示-106。
如果数字在一定范围内,是否经过签名可以不必更改?
好问题。要查看发生了什么,您可能想要列出长度为8的所有可能的位向量,并尝试将它们解释为无符号和有符号数字:
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
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句