将值从寄存器存储到内存中的问题,ARM 32 位
Problem to store value from register into memory, ARM 32 bit
我是 ARM 和汇编程序的新手。我试图编写一个简单的程序来将值从寄存器存储到内存。
string:
.ascii "%d2[=10=]0"
.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
对齐,那么你必须先到达对齐边界 .
此外,使用调试器 在单步执行时检查寄存器和内存。很明显,您的 370
被 uxtb
(无符号扩展字节)截断为 (uint8_t)370
。
此外,您的代码不会打印内存中的单词,它只会将 r3
传递给 printf。因此,您看不出高位字节未修改的字节存储与带有错误调试打印的字存储之间的区别。使用调试器要好得多。
我是 ARM 和汇编程序的新手。我试图编写一个简单的程序来将值从寄存器存储到内存。
string:
.ascii "%d2[=10=]0"
.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
对齐,那么你必须先到达对齐边界 .
此外,使用调试器 在单步执行时检查寄存器和内存。很明显,您的 370
被 uxtb
(无符号扩展字节)截断为 (uint8_t)370
。
此外,您的代码不会打印内存中的单词,它只会将 r3
传递给 printf。因此,您看不出高位字节未修改的字节存储与带有错误调试打印的字存储之间的区别。使用调试器要好得多。