Проблема сохранения значения из регистра в памяти, ARM 32 бит - PullRequest
1 голос
/ 14 апреля 2020

Я новичок в 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 (hex: 0x172), сохраняется только 0x72. STR, кажется, передает только 8 бит данных. Я пробовал разные конфигурации с инструкцией STR (например, STRB), и ничего не работает. У меня вопрос, как можно сохранить это значение в памяти.

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

1 Ответ

1 голос
/ 14 апреля 2020

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

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

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

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


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

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

...