【问题标题】:Problem to store value ​from register into memory, ARM 32 bit将值从寄存器存储到内存中的问题,ARM 32位
【发布时间】:2020-04-13 21:17:31
【问题描述】:

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

感谢您的帮助和回答。

【问题讨论】:

    标签: assembly raspberry-pi arm raspberry-pi3 zero-extension


    【解决方案1】:

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

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

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

    此外,您应该将.align之前放在var1: 标签(和.word 0)之前。 .align 在其位置扩展为填充;如果您希望var1 对齐,那么您必须首先到达对齐边界


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

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

    【讨论】:

    • 非常感谢!它正在工作!我将 LDRB 和 STRB 更改为不带 b 的语法,并将 UXTB 更改为 MOV。在 .word 之前和之后使用 align 有区别吗?
    • @Encapsulation: .align 发出填充字节,直到当前位置是n 的倍数。如果您希望标签地址对齐,请将其放在标签之前
    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 2015-06-23
    • 2020-11-21
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多