Проблема с сохранением значения из регистра в памяти, ARM 32 бит

Я новичок в ARM и ассемблере. Я попытался написать простую программу для хранения значений из регистра в памяти.

string:
        .ascii "%d\012\000"
        .align 2

var1:
        .word 0
        .align 4

.text
.global main

main:
        push {ip, lr}
        ldr r1, adr_var1
        ldrb r1, [r1]
        mov r1, #370
        uxtb r3, r1
        ldr r1, adr_var1
        strb r3, [r1]
        ldr r0, adr_string
        mov r1, r3
        bl printf
        mov r1, #0
        mov r7, #1
        pop {ip, pc}

adr_var1:
        .word var1

adr_string:
        .word string

Проблема возникает при записи данных в память. Когда он пытается записать значение 370 (шестнадцатеричное: 0x172), сохраняется только 0x72. STR, кажется, передает только 8 бит данных. Я пробовал разные конфигурации с инструкцией STR (например, STRB), но ничего не работает. У меня вопрос, как сохранить это значение в памяти.

Спасибо за любую помощь и ответ.

1 ответ

Решение

strb r3, [r1]это хранилище байтов. Конечно, он хранит только один байт.

uxtb r3, r1 ноль расширяет байт в регистр, так что str r3, [r1]word store будет хранить 4 байта, а старшие 3 байта - все нули. Попробуйте с начальным значением в памяти0xFFFFFFFF так что вы можете увидеть разницу между сохранением байта и сохранением слова с нулевым расширением.

Если вы хотите сохранить полную 370, просто не усекайте его до 8 бит перед сохранением!

Также вы должны поставить .align Передvar1: этикетка (и .word 0). .alignрасширяется до заполнения в своем местоположении; Если хочешьvar1для выравнивания, поэтому сначала нужно добраться до границы выравнивания.


Кроме того, используйте отладчик для проверки регистров и памяти на каждом этапе. Было бы очевидно, что ваш370 были усечены до (uint8_t)370 от uxtb (беззнаковый расширенный байт).

Кроме того, ваш код не печатает слово из памяти, он только передает r3в printf. Таким образом, вы не могли увидеть разницу между хранилищем байтов, оставляющим старшие байты неизмененными, и хранилищем слов с этой ошибочной отладочной печатью. Намного лучше использовать отладчик.

Другие вопросы по тегам