2011-02-08 14 views
2

定義済み.byteの値をレジスタに正しくロードするにはどうすればよいですか?例えば定数として定義して:初心者のARMアセンブリ質問

constant: .byte 'a' 

私がしようとしています:

ldr r0, =constant 
ldr r1, [r0] 

はしかし、シミュレータは、二行目の後に停止し、エラー「非整列メモリロケーションへのアクセス、不正なアドレス」の残りの部分を与えます2番目の行が含まれていない限り、コードは正常に実行されます。

全コード:

; 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を使用して、バイトアライメントされたポインタから1バイトをレジスタにロードすることができます。私はそれはあなたが探しているものです期待:

ldr r0, =val 
ldrb r1, [r0] 

あなたはおそらくあなたのループ内で同じことをしたいか、他あなたが非ワード境界整列アドレスで最初の文字に進めたら同じようにクラッシュします(おそらくoHowで):

loop: ldrb r2, [r0] 
+0

の中にあります。 "バイトアライメントされたポインタ" - 他の種類はありますか? :) –

+0

@Michael Burr、私は、より限定的なアラインメントを持つポインタとは対照的に意味しました。 –

0

あなたはバイトのアドレスを水増ししていますか?それは偶数のアドレス(単語)をパディングする必要があります。またはおそらくdword埋め込みdependintにあなたの

+0

「バイトのアドレスをパディングする」という意味が明確ではありません。 – Pax

+0

あなたはalign-alignment-padding-> 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 
関連する問題