2011-02-08 1 views
2

미리 정의 된 .byte 값을 레지스터에 제대로로드하는 방법은 무엇입니까? 예 : 상수로 정의와 함께 :초보자 용 ARM 어셈블리 질문

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 

답변

6

ldrb을 사용하여 바이트 정렬 포인터에서 레지스터로 단일 바이트를로드 할 수 있습니다. 그게 당신이 찾고있는 무엇을 기대 :

ldr r0, =val 
ldrb r1, [r0] 

당신은 아마 당신의 루프에서 같은를 원하거나 다른 사람이 아닌 단어로 정렬 된 주소의 첫 번째 문자로 진행하면 같은 방식으로 충돌합니다 (아마도 oHow에) :

loop: ldrb r2, [r0] 
+0

"바이트 정렬 포인터"- 다른 종류가 있습니까? :) –

+0

@Michael Burr, 나는 더 제한적인 정렬을 가진 포인터에 반대했다. –

0

당신이 바이트의 주소를 패딩하고 있습니까? 짝수 번째 주소 (단어)가 있어야합니다. 또는 어쩌면 심지어 더블 워드 패딩 의존성 당신의

+0

'바이트 주소를 채우는 것'이 무슨 뜻인지 명확하지 않습니다. – Pax

+0

당신은 정렬해야합니다 - 정렬 - 패딩 -> allignment –

+0

나는 당신의 대답이나 의견이 이해가 확실하지 않습니다. 데이터 섹션에서'msg'와'val'의 정렬은 OP의 문제가 아닙니다. –

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