Как я могу прочитать последовательность одиночных байтов в ARM?
Я знаю, что
Ldrb r1, [r0]
Считывает один байт из адреса, указанного r0. Однако я все еще не знаю, как читать R0 + 1 байт, затем r0 + 2, r0 + 3 и так далее. воля
Ldrb r1, [r0, #1]
Делать то, что я хочу? И это то же самое, что и здесь?
Добавить r0, r0, #1
Ldrb r1, [r0]
Моей целью было реализовать инструкцию rev как функцию, и то, что я делал, было
Lrdb r4, [r0]
Lrdb r5, [r0, #1]
Lrdb r6, [r0, #2]
Lrdb r7, [r0, #3]
Str r7, [r0]
Str r6, [r0, #1]
Str r5, [r0, #2]
Str r4, [r0, #3]
Однако только r7 считывает байт из числа, все остальные регистры считывают 0. Что я делаю не так?
2 ответа:
ldrb r1,[r0,#1]
Означает, что возьмите значение в r0, добавьте к нему 1 и загрузите оттуда байт (нуль) в r1.
ldrb r1,[r0],#1
Означает взять значение в r0, использовать его в качестве адреса для чтения байта из, поместить байт в r1, а затем добавить 1 к r0.
ldrb r1,[r0],#1
То же самое, что
ldrb r1,[r0] add r0,r0,#1
Только в одной инструкции вместо двух
Я предполагаю, что вы хотите иметь цикл, который использует
ldrb r1,[r0],#1
Единственным недостатком является то, что ваш указатель перемещается, это похоже на выполнение *p++ вместо того, чтобы array[x++]
Другое решение, которое не разрушает базу, - этоldrb r1,[r0,r2] add r2,r2,#1
Возьмите значения в r0 и r2, сложите их вместе, используйте это как адрес и считайте байт и сохраните его в r1
Наверное, лучше просто
mov r2,r0 loop: ldrb r1,[r0],#1 ... (end of loop) mov r0,r2
Если вы заботитесь о сохранении начала строкового адреса в регистре.
Не все это задокументировано в псевдокоде, который связан с каждой инструкцией и режимом адресации в документации arm. infocenter.arm.com
Я понимаю это, возможно, в образовательных целях. Однако это обычно плохо, так как пропускная способность памяти намного медленнее, чем у процессора. Лучше прочитать все 32 бита, а затем использовать rotates и
Это было бы правильной реализацией того, что вы пытаетесь сделать.eor
для замены байтов (или использоватьrev
, Если у вас есть). Вот ссылка на адресацию памяти . Ваша ошибка в том, что вам нужноstrb
, а неstr
.lrdb r4, [r0] lrdb r5, [r0, #3] strb r4, [r0, #3] strb r5, [r0] lrdb r4, [r0, #1] lrdb r5, [r0, #2] strb r4, [r0, #2] strb r5, [r0, #1]
На этот вопрос есть отличный ответ: подробно остановимся на том, как сделать версию
eor
. Это гораздо лучше.