1

我是 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)尝试了不同的配置,但没有任何效果。我的问题是如何将此值存储到内存中。

感谢您的任何帮助和回答。

4

1 回答 1

1

strb r3, [r1]是一个字节存储。当然它只存储一个字节。

uxtb r3, r1零扩展一个字节到一个寄存器,所以一个str r3, [r1]字存储将存储 4 个字节,高 3 个字节全为零。尝试使用内存中的初始值,0xFFFFFFFF以便您可以看到存储字节和存储零扩展字之间的区别。

如果要存储完整的370,请在存储之前不要将其截断为 8 位!

此外,您应该将您的放在标签(和).align 之前。 扩展到其位置的填充;如果要对齐,则必须到达对齐边界。var1:.word 0.alignvar1


此外,使用调试器单步检查寄存器和内存。很明显,您370被截断为(uint8_t)370uxtb无符号扩展字节)。

另外,您的代码不会从内存中打印单词,它只会传递r3给 printf。因此,您看不到保留高位字节未修改的字节存储与带有错误调试打印的字存储之间的区别。使用调试器要好得多。

于 2020-04-13T21:35:48.617 回答