初学ARM装配问题

时间:2011-02-08 04:23:51

标签: 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

3 个答案:

答案 0 :(得分:6)

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

ldr  r0, =val
ldrb r1, [r0]

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

loop:    ldrb r2, [r0]

答案 1 :(得分:0)

你正在使用字节;没有对齐问题。您还忘记增加计数器并与错误的寄存器进行比较。这是一个有效的解决方案:

;   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 r1, =val  
        ldr r0, =msg  
        ldrb r1, [r1]  
        mov r3, #0  

loop:   ldrb r2, [r0],#1  
        cmp r2, #0  
        beq done  
        cmp r2, r1  
        addeq r3,r3,#1  
        b loop  
done:  
        swi 0x11  

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

答案 2 :(得分:-1)

你是否在填充字节的地址?它需要是偶数地址(字)填充。或者甚至可能是dword padded依赖于你的