Я не знаю, почему это используется, является ли это чем-то конкретным 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).