ARM程序集无法从地址加载



我对汇编很陌生。在这门课上的第三个实验中,我们必须使用ldr;需要将不同寄存器的部分存储到一个最终寄存器中。

它应该取第一个寄存器的第一个字节,第二个寄存器的第二个字节,第三个寄存器的第三个字节和第四个寄存器的第四个字节,并将这些值存储在一个最终寄存器中。

下面的代码,对我来说,似乎应该这样做:

LDR r1, =0x2A078CE2             
LDR r2, =0x0C82B182             
LDR r3, =0x9F46452E             
LDR r4, =0x31F1D1B9
LDRB r6, [r1]
LDRB r7, [r2, #1]
LDRB r8, [r3, #2]
LDRB r9, [r4, #3]
stop    B   stop
end

代码编译时带有1个警告:"p1. ",第309行:警告:A1581W:在地址0x16">

添加了2个字节的填充不知道这是什么意思,也不知道这是不是一个问题。

无论哪种方式,当我调试代码时,寄存器1 - 4接收正确的值。但是一旦LDRB指令被执行,所有寄存器的值都不会改变。即使将第一条指令更改为LDR r6, [r1], r6仍然保持在0。

在这里完全不知所措,因为我使用了教授给我的语法

LDR r1, =0x2A078CE2             
LDRB r6, [r1]

这说值0 x2a078ce2放入寄存器r1然后从内存中读取地址0 x2a078ce2并获得字节,零垫,把它放在r6。如果你想要r1的低8位,那么你需要使用AND。如果你想说8:15位,那么你需要向右移动,然后使用and,或者and,然后移动,你的选择。

ldr执行一次加载(从某个地址的内存)。如果你想要寄存器中的位,那么你要么需要将寄存器写入内存,然后读回有问题的字节(使用你安全选择的一些地址),要么只是掩码和移位(根本不使用内存)。

你想要r6 = (r1>>0)&0xFF;Not r6 = (unsigned char *)r1;(r7 = (r2>>8)&0xFF,等)

and     r1, r1, #0xff
and     r2, r2, #0xff<<8
and     r3, r3, #0xff<<16
and     r4, r4, #0xff<<24
orr     r1, r2, r1
orr     r3, r4, r3
orr     r0, r3, r1

0包含最终结果。

最新更新