Как я могу прочитать последовательность одиночных байтов в 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 2

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. Это гораздо лучше.