初学ARM装配问题

2 assembly arm

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

constant:   .byte   'a'
Run Code Online (Sandbox Code Playgroud)

我在尝试:

 ldr r0, =constant
 ldr r1, [r0]
Run Code Online (Sandbox Code Playgroud)

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

完整代码:

;   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
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 6

您可以使用ldrb从字节对齐的指针将单个字节装入寄存器.我希望你能找到的是:

ldr  r0, =val
ldrb r1, [r0]
Run Code Online (Sandbox Code Playgroud)

你可能想要在循环中使用相同的内容,否则一旦你前进到非字对齐地址(可能是oin How)的第一个字符,你就会以同样的方式崩溃:

loop:    ldrb r2, [r0]
Run Code Online (Sandbox Code Playgroud)