assembly - 初级 ARM 汇编问题

标签 assembly arm

如何正确地将预定义的 .byte 值加载到寄存器中?例如常量定义为:

constant:   .byte   'a'

我正在尝试:

 ldr r0, =constant
 ldr r1, [r0]

但是,模拟器在第二行之后停止并给出错误“访问未对齐的内存位置,错误地址”,只要不包含第二行,其余代码就可以正常运行。

完整代码:

;   r0  is a pointer to msg1
;    r1  used to store the value of val
;   r2  used to compare a character in msg1
;   r3  counter for the number of comparisons

    .text
    .global _start  
_start:
        ldr r0, =msg
        ldr r1, =val
        ldr r1, [r1]
        mov r3, #0

loop:   ldr r2, [r0]    
        cmp r2, #0
        beq done
        cmp r0, r1
        add r0, r0, #4
        bne loop
        add r2, r2, #1
        b loop

done:
        swi 0x11

    .data
    .align
msg:    .asciz  "How many 'a's are in this string?"
val:    .byte   'a'
    .end

最佳答案

您可以使用ldrb从字节对齐指针将单个字节加载到寄存器中。我希望这就是您正在寻找的:

ldr  r0, =val
ldrb r1, [r0]

您可能希望在循环中进行相同的操作,否则一旦您前进到非字对齐地址的第一个字符(可能是 o 中的 How ),您就会以同样的方式崩溃:

loop:    ldrb r2, [r0]

关于assembly - 初级 ARM 汇编问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4929530/

相关文章:

assembly - 为什么 MIPS 堆栈基址是 0x7ffffffc 而不是 0x80000000

用于汇编样式十六进制数字的 C# 正则表达式

c++ - 我无法设置 opencv 库的编译器路径。

linux-kernel - ARM 锁定寄存器写操作导致设备崩溃

linux - 为 cortex-a8 设备交叉编译时出现链接器问题

assembly - 32位汇编语言创建输出文件麻烦

c++ - 有什么方法可以在运行时不间断地动态更新二进制文件(可执行文件)?

c - 使用 GCC 内联汇编的 PC 相关调用

android-emulator - Qemu 中的 ARM NEON 支持

go build 在编译 cgo 包时找不到我的 C 标准库