Arm cortex-m3 mov和ldr

问题描述 投票:0回答:2

我不明白为什么我不能写mov r1, #5000。为什么我必须改用ldr? R1是32位寄存器,范围为5000。而且我发现我可以mov r1, #255但不能mov r1, #256。对我来说似乎很奇怪。

assembly arm cortex-m
2个回答
4
投票

请阅读说明文档,在这种情况下,说明是固定长度的,因此您没有空间容纳说明信息(操作码等)和16或32位指令中的32位立即数,这是不可能的,因此需要立即限制。例如,对于x86,它的指令长度是可变的,因此它们可以具有较长的指令,但是很容易争论说,相对于pc的负载或几个相同大小的固定长度的指令在管道上并不会产生明显的额外成本。所以六个一打中的六个mips固定指令长度移动立即解决方案有其优势和劣势,而对于每个arm指令集,每种解决方案都有其优势和劣势的解决方案。

用于武装汇编器(某些情况下是gcc,可能是武装工具链,keil等),您可以执行快捷方式,而汇编器将选择更简单的路径

ldr r1,=immediate

如果无法将其编码为一条指令(请注意,可能会有一些否定的动作,带有程序计数器的数学运算以及它可能会发挥的其他技巧,您可能当时没有考虑过,或者不知道PC可能无法使用),如果不能,则可以将其编码为多条指令,然后立即将其编码为orr,或将其编码为pc的相对负载。

关于每个指令集的立即数的具体限制,在arm体系结构参考手册中都有详细记录,您只需购买armv7即可,并且具有该版本和先前体系结构版本的所有编码。有了这些知识,您应该能够在汇编程序告诉您之前确定mov是否可以工作。


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
© www.soinside.com 2019 - 2024. All rights reserved.