Как узнать, какие полусотни (8 битов) ...
... и сохранить данные в виде 32-битного значения с расширенным знаком в целевом регистре Rd.
В терминологии ARM " word " означает 32 бита, а " halfword " означает 16 бит.
Кроме того, инструкция LDRH
не расширяет знак, но расширяет ноль.
Здесь описана инструкция LDRSB
, а не LDRH
.LDRSB
знак расширяет 8 бит.
После вычисления адреса ... мы получаем 32-битное значение, которое сохраняется в Rd, но какие 8 бит в 32-битном ... должны быть сохранены?
Рассчитанный адрес не сохраняется ни в одном регистре.Адрес используется для адресации байта в ОЗУ (или в любом другом типе памяти).
Другими словами: рассчитанный адрес является адресом где-то в памяти.
Байт, сохраненный вэтот адрес будет прочитан.
Этот байт будет записан в младшие 8 битов регистра Rd
.Поскольку инструкция расширяет значение, бит 7 значения считанного значения будет скопирован в биты 31 ... 8 Rd
.(Предполагая, что мы говорим о LDRSB
.)
Это сделано потому, что (как в десятичной системе) положительное число остается тем же самым, когда предшествует "ноль" цифр (в двоичных системах: биты) и в дополнении до двух.арифметическое отрицательное число остается неизменным при добавлении «единичных» битов:
decimal 12 = decimal 0000012
01100 = 000000001100 = decimal 12
10100 = 111111110100 = decimal -12
... и число интерпретируется как «отрицательное» число, если старший бит установлен при использовании дополнения до двух.
Инструкция LDRB
будет увеличивать значение на ноль, что означает, что двоичное число интерпретируется не как двоичное число, а как положительное число без знака:
10100 = 000000010100 = decimal 20
Следовательно, LDRB
будетпросто установите биты 31 ... 8 в ноль.
Для 16-битных инструкций (LDRH
и LDRSH
) будет прочитано два байта:
Байт по вычисленному адресу будетбыть прочитано в младшие 8 битов, а байт, следующий за ним, будет считан в биты 15 ... 8.Старший бит второго байта будет скопирован в биты 31 ... 16 в случае LDRSH
;эти биты будут просто установлены в ноль в случае LDRH
.
Пример:
R0 = 1234000 (decimal)
Content of the memory:
Address 1234012: 9A (hexadecimal)
Address 1234013: 7A (hex.)
Address 1234014: BC (hex.)
Address 1234015: DE (hex.)
Address 1234016: 7E (hex.)
Program:
LDRSB R1, [R0, #12]
LDRSB R2, [R0, #13]
LDRB R3, [R0, #12]
LDRSH R4, [R0, #14]
LDRSH R5, [R0, #15]
LDRH R6, [R0, #14]
Results:
R1 = FFFFFF9A
R2 = 0000007A
R3 = 0000009A
R4 = FFFFDEBC
R5 = 00007EDE
R6 = 0000DEBC