Assembly 如何将大于#0x00FF的值STR到内存中

Assembly 如何将大于#0x00FF的值STR到内存中,assembly,arm,Assembly,Arm,我正在使用一个40针双向并行端口的FPGA。要设置管脚的方向,我需要将内存位置0xFF200074的值更改为0x0000FFFF。但是,当我尝试将#0x0000FFFF移动到寄存器中时,会收到一个错误,表示它太大。我试图将该值移动到寄存器中,以便随后将其STR到内存中 我不相信我能用手臂直接操纵记忆。但是必须有一种简单的方法来实现这一点,我只是没有看到它。您需要从内存中加载该常量,因为指令没有足够的空间来进行任意立即处理。您可以使用ldr r0,=0x0000FFFF让您的工具为您处理它。让编译

我正在使用一个40针双向并行端口的FPGA。要设置管脚的方向,我需要将内存位置0xFF200074的值更改为0x0000FFFF。但是,当我尝试将#0x0000FFFF移动到寄存器中时,会收到一个错误,表示它太大。我试图将该值移动到寄存器中,以便随后将其STR到内存中


我不相信我能用手臂直接操纵记忆。但是必须有一种简单的方法来实现这一点,我只是没有看到它。

您需要从内存中加载该常量,因为指令没有足够的空间来进行任意立即处理。您可以使用
ldr r0,=0x0000FFFF
让您的工具为您处理它。让编译器在一个带有指针arg的函数中为您编译
*foo=0xffff
。然后查看优化的asm输出。如果您使用ARMv7 CPU,它可以使用
movw
在一条指令中创建该位模式。不幸的是,这里多次询问并回答了这个问题(或不取决于视图)。应该能找到他们。如果你看一下指令集,你会发现如何以及为什么。您可以使用armv4(armv1/2/3?)指令从四条指令构建任意数量的指令,可以使用一条指令和一个池从附近的池中加载。如前所述,对于较新的内核,您可以用较少的指令来完成。除了一些汇编器外,并非所有汇编器都支持ldr r0,=0x12345678语法,并将为您提供解决方案,除非您的汇编器不支持它,否则通常是goto。如果您不能在一条指令中使用两条或两条以上的指令,则有多种方法可以做到这一点。您有两个RISC概念。一个是由于对称的操作码大小。另一个是加载/存储CPU。RISC上的加载/存储功能受设计限制。它使CPU不那么复杂。