Вопрос по сборке ARM для начинающих - PullRequest
2 голосов
/ 08 февраля 2011

Как правильно загрузить значение предопределенного .byte в регистр?Например, с константой, определенной как:

constant:   .byte   'a'

Я пытаюсь:

 ldr r0, =constant
 ldr r1, [r0]

Однако, симулятор останавливается после второй строки и выдает ошибку «Доступ к расположению памяти без выравнивания, плохой»address "В остальном код работает нормально, если вторая строка не включена.

Полный код:

;   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

Ответы [ 3 ]

6 голосов
/ 08 февраля 2011

Вы можете использовать ldrb для загрузки одного байта в регистр из выровненного по байту указателя.Я ожидаю, что это то, что вы ищете:

ldr  r0, =val
ldrb r1, [r0]

Возможно, вы захотите то же самое в цикле, иначе вы потерпите крах таким же образом, как только перейдете к первому символу, не содержащему словавыровненный адрес (вероятно, o in How):

loop:    ldrb r2, [r0]
0 голосов
/ 04 марта 2011

Вы работаете с байтами; нет никаких проблем с выравниванием. Вы также забываете увеличивать свой счетчик и сравнивать с неправильным регистром. Вот рабочее решение:

;   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  
0 голосов
/ 08 февраля 2011

Вы дополняете адрес байта? это должен быть даже адрес (слово) дополненный. или, может быть, даже в зависимости от вашего

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...