我是ARM和汇编程序的新手。我试图编写一个简单的程序来将值从寄存器存储到内存。
string:
.ascii "%d\012\000"
.align 2
var1:
.word 0
.align 4
.text
.global main
main:
push {ip, lr}
ldr r1, adr_var1
ldrb r1, [r1]
mov r1, #370
uxtb r3, r1
ldr r1, adr_var1
strb r3, [r1]
ldr r0, adr_string
mov r1, r3
bl printf
mov r1, #0
mov r7, #1
pop {ip, pc}
adr_var1:
.word var1
adr_string:
.word string
将数据写入内存时出现问题。当它尝试写入值370(十六进制:0x172)时,仅保存0x72。 STR似乎只传输8个数据位。我尝试使用STR指令(例如STRB)进行其他配置,但没有任何效果。我的问题是如何将该值存储到内存中。
谢谢您的帮助和解答。
strb r3, [r1]
是字节存储。当然,它只存储一个字节。
uxtb r3, r1
将一个字节零扩展到寄存器中,因此str r3, [r1]
字存储将存储4个字节,高3个字节全为零。尝试以内存中的初始值为0xFFFFFFFF
进行尝试,以便您可以看到存储字节与存储零扩展字之间的区别。
如果要存储完整的370
,只需在存储前不要将其截断为8位!
此外,还应将.align
之前置于var1:
标签(和.word 0
)上。 .align
在其位置扩展为填充;如果要对齐var1
,则必须到达对齐边界first。
也,使用调试器在单步执行时检查寄存器和内存。很明显,您的370
被(uint8_t)370
(无符号扩展字节)截断为uxtb
。
此外,您的代码不会从内存中打印单词,它只会将r3
传递给printf。因此,您看不到字节存储区保留未修改的高位字节与带有该错误调试打印的字存储区之间的区别。使用调试器要好得多。