我不明白为什么我不能写mov r1, #5000
。为什么我必须使用ldr
? R1是32位寄存器,5000适合范围。正如我发现我可以mov r1, #255
,但不能mov r1, #256
。这对我来说似乎很奇怪。
答案 0 :(得分:4)
阅读说明书中的文档,在这种情况下,指令是固定长度的,所以你没有空间同时在16或32位指令中指令信息(操作码等)和32位立即,不可能如此需要立即限制。以x86为例,它是可变的指令长度,因此它们可以有很长的指令,但是很容易争辩说,执行pc相对负载或相同大小的一些固定长度指令对于管道没有显着的额外成本。所以六分之一的另外六分之一。 mips固定指令长度移动立即解决方案有其优点和缺点,并且每个arm指令集都有自己的优缺点解决方案。
用于组装者(当然是gcc,可能是武器工具链,keil等),你可以做一个快捷方式,汇编程序将选择更简单的路径
ldr r1,=immediate
如果它不能将其编码为单个指令(请注意,有一些移动为负,数学与程序计数器和其他技巧,它可能会发挥你当时可能没有想到或不知道电脑可能无法使用),如果它不能那么它可以编码为多个指令mov立即然后一个orr,或编码为pc相对负载。
每个指令集mov的特定限制都在arm架构参考手册中有详细记载,你可以获得armv7 one,它具有该架构版本和之前架构版本的所有编码。有了这些知识,你应该能够在汇编程序告诉你之前确定mov是否有效。
答案 1 :(得分:1)
在ARM Cortex-M3中,MOV是具有以下定义MOV<c>{<q>} <Rd>, #<imm8>
的16位指令
立即值作为操作码的一部分存储在手臂指令中
opc[15:11]='b00100 =>which identifies instruction.
opc[10:8]=<register no>
opc[7:0]=<imm8 value>
因此,按照上述说明,您可以将2 ^ 8 -1 => 255作为最大立即值
尽管通过指定指令说明符.W,您可以强制汇编程序为MOV选择32位编码,但这将只有11位的立即值
您可以使用具有16位即时价值支持的T3版本的MOV 您可以在其中将0到65535移至寄存器
因此代替了mov r1, #5000
您可以按照以下说明将0到65535之间的任何值加载到寄存器中
MOVW r1, #5000