如何将预定义的.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
答案 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依赖于你的