2011-02-08 4 views
2

Comment charger correctement la valeur d'un .byte prédéfini dans un registre? par exemple. Avec une constante définie comme:Débutant ARM Assemblée Question

constant: .byte 'a' 

Je suis en train:

ldr r0, =constant 
ldr r1, [r0] 

Cependant, le simulateur interruptions après la deuxième ligne et donne l'erreur « L'accès à l'emplacement de mémoire non alignée, mauvaise adresse » Le reste de le code fonctionne bien aussi longtemps que la deuxième ligne n'est pas incluse.

complet Code:

; 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 

Répondre

6

Vous pouvez utiliser ldrb pour charger un seul octet dans un registre à partir d'un pointeur aligné sur les octets. Je pense que c'est ce que vous cherchez:

ldr r0, =val 
ldrb r1, [r0] 

Vous voulez probablement la même chose dans votre boucle ou bien vous écrasez de la même façon une fois que vous avancez au premier caractère à une adresse non-mot aligné (probablement le o en How):

loop: ldrb r2, [r0] 
+0

"un pointeur aligné sur les octets" - existe-t-il un autre type? :) –

+0

@ Michael Burr, je voulais dire par opposition à un pointeur avec un alignement plus restrictif. –

0

Êtes-vous Rembourrage l'adresse de l'octet? il doit être même adresse (mot) rembourré. ou peut-être même dword padded dependint sur votre

+0

Je ne comprends pas ce que vous entendez par «remplissage de l'adresse de l'octet». – Pax

+0

vous devez être à align - alignement - padding -> allignment –

+0

Je ne suis pas sûr que votre réponse ou votre commentaire ait un sens. Certes, l'alignement de 'msg' et' val' dans la section de données n'est pas le problème de l'OP. –

0

Vous travaillez avec des octets; il n'y a pas de problèmes d'alignement. Vous oubliez également d'incrémenter votre compteur et de comparer avec le mauvais registre. Voici une solution de travail:

; 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