我对汇编很陌生。在这门课上的第三个实验中,我们必须使用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包含最终结果。