Инструкция LDRB с массивами и строками - PullRequest
1 голос
/ 19 января 2020

В настоящее время мы изучаем основы сборки в классе. Есть два примера фрагментов кода, относящихся к массивам и строкам соответственно, которые используют инструкцию LDRB, которая больше нигде не использовалась. Я понимаю, что он загружает байт вместо слова типа LDR, но я не понимаю, почему он используется там, где он используется. В материалах для урока нет разъяснений. Я попытался найти его в Google, но ничего не смог найти.

Я не знаю, почему он используется, будь то что-то конкретное c для массивов и строк или правильный синтаксис ... Я был бы очень признателен за объяснения, поскольку Я хочу понять. Примеры кода:

Массив:

.text

entry:    b start

arr:     .byte 10, 20, 25

eoa:

         .align

start:
ldr       r0, =eoa
ldr       r1, =arr
mov       r3, #0

loop:
          ldrb  r2, [r1], #1
          add   r3, r2, r3
          cmp   r1, r0
          bne   loop

stop:
          b stop

Строка:

.text
        b start

str:    .asciz "Greetings and well met"

       .equ   nul, 0

       .align

start:

       ldr   r0, =str
       mov   r1, #0

loop:   
       ldrb  r2, [r0], #1
       add   r1, r1, #1
       cmp   r2, #nul
       bne   loop
       sub   r1, r1,#1

stop:   b stop

1 Ответ

2 голосов
/ 19 января 2020

Я не знаю, почему это используется, является ли это чем-то конкретным c для массивов и строк или надлежащим синтаксисом ... Я был бы очень признателен за объяснения, которые я хочу понять.


LDR против LDRB

Основная причина, по которой вам нужно ldrb, заключается в том, что он может адресовать байт. ОЗУ представляет собой ячейку и имеет размер c, который зависит от аппаратного обеспечения. У ldrb есть способы игнорировать части при загрузке и записи. Если вы используете аппаратный регистр с отображенной памятью, вы можете обнаружить, что они ведут себя по-разному, и вам нужно обращаться к ним по-разному.

Все гораздо сложнее, если вы думаете о str и strb. Если вы используете str для байтов, вы перезаписываете другие байты.

Array vs String

Обычно массив может иметь размеры, отличные от 'byte'. Тем не менее, ваш пример - массив байтов . Разница в том, что байтовые массивы должны хранить размер, а строка имеет зарезервированный символ '\ x00', который является маркером конца. В примере кода метка адреса eoa используется для обозначения конца массива. Еще один способ сделать это,

arr:     .word 1b-arr-4     #  Store size of array first
         .byte 10, 20, 25
1:

Так что пример строки ищет ноль с cmp r2, #nul, а пример массива ищет размер с cmp r1, r0 (r1 - текущий индекс строки, а r0 еао ). Массив может содержать нулевой символ в данных, а строковый код немного более компактен в представлении (=str против =arr плюс =eoa).

Строка аналогична протоколу связи , который называется экранированием и зарезервированными символами. Например, символ EOS = \x7e может быть концом строки, а ESCAPE = \x7d зарезервирован. Тогда комбинация ESCAPE-! EOS - это EOS в строке, а ES C -! ES C - это ES C в строке. Строка имеет EOS = \x00 и правило, которое не может произойти, поэтому экранирование не требуется. Побег имеет недостаток в том, что размер данных не совпадает с представленным размером (некоторые данные занимают два байта, а другие - только один). Это также верно, если строка была Unicode (UTF8, UTF16 и т. Д. c).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...