Проблема с сохранением значения из регистра в памяти, 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. Таким образом, вы не могли увидеть разницу между хранилищем байтов, оставляющим старшие байты неизмененными, и хранилищем слов с этой ошибочной отладочной печатью. Намного лучше использовать отладчик.