Anfänger-ARM-Assembly-Frage
Wie Sie korrekt geladen wird der Wert von einem vordefinierten .byte in ein register? z.B. Mit einem Konstanten definiert als:
constant: .byte 'a'
Ich versuche:
ldr r0, =constant
ldr r1, [r0]
Jedoch der simulator Stoppt nach der zweiten Zeile und gibt die Fehlermeldung "Zugriff auf unaligned Speicher, ungültige Adresse" den rest Der code sonst läuft es gut, solange die zweite Zeile ist nicht im Lieferumfang enthalten.
Vollständige 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
ldrb
laden ein byte in ein register von einem byte-Zeiger ausgerichtet. Ich erwarte, dass das, was Sie suchen:Möchten Sie wahrscheinlich die gleichen, die in die Schleife, sonst werden Sie Absturz in der gleichen Weise, sobald Sie Voraus, um das erste Zeichen in einem nicht-word-aligned-Adresse (wahrscheinlich die
o
imHow
):Du arbeitest mit bytes; es gibt KEINE alignment-Probleme. Du hast auch vergessen zu Inkrementieren Ihre Zähler und Vergleich mit dem falschen register. Hier eine funktionierende Lösung:
Sind Sie Polsterung die Adresse des byte? es müssen sogar Adresse (Wort) aufgefüllt. oder vielleicht sogar dword-gepolsterte dependint auf Ihre
msg
undval
im Abschnitt Daten ist nicht die OP das problem.