У меня было несколько курсов, которые касались сборки ARMv8, но оба учителя описали инструкции LDUR / STUR по-другому, и теперь я стал довольно потерянным. Может кто-то помочь прояснить?
Если бы у меня была инструкция:
LDUR R3, [R1, # 8]
Я отвечу в R3, но что я беру с R1 и как работает смещение? Это как логический сдвиг? Руководство ARM описывает его как «смещение байта», но затем не описывает, как это смещение действует на R1. Переместить значение, хранящееся в R1 (например, R1 имеет значение 50 в нем) или есть адрес памяти за пределами R1, о котором мне нужно подумать? Другие источники говорят, что мне нужно как-то думать о R1 как о массиве?
Пожалуйста помоги. Я понял все остальные инструкции, кроме LDUR и STUR. Приветствия.
Всего 1 ответ
LDUR - это регистр загрузки (немасштабированный) . Он загружает значение (32 бит или 64 бит) из адреса плюс смещение в регистр. unscaled
означает, что в машинный код смещение не будет кодироваться с использованием масштабированного смещения likd ldr, т. е. сдвиг не будет применен к битам смещения сразу. Смещение ( simm signed немедленное) будет добавлено в базовый регистр Xn | SP .
Таким образом, можно использовать смещения, которые не кратно 4 или 8 с ldur
, в отличие от ldr
Это прототипы для LDUR:
-- loads a 32-bit value
LDUR <Wt>, [<Xn|SP>{, #<simm>}]
-- loads a 64-bit value
LDUR <Xt>, [<Xn|SP>{, #<simm>}]
STUR is Store (unscaled) Регистрирует и работает таким же образом, но сохраняет значение в регистре в память.
Это прототипы для STUR:
-- stores a 32-bit register
LDUR <Wt>, [<Xn|SP>{, #<simm>}]
-- stores a 64-bit register
LDUR <Xt>, [<Xn|SP>{, #<simm>}]
LDUR / STUR разрешает доступ к 32/64-битным значениям, если они не совпадают с размером операнда. Например, 32-битное значение, сохраненное по адресу 0x52.
В вашем примере,
LDUR R3, [R1, #8]
эта команда будет загружать в R3
значение, указанное R1
плюс 8
байтов. Это то, что соответствует справочному руководству ARM по byte offset
. Поэтому, если R1
имеет значение 0x50
, это будет загружать значение, сохраненное по адресу 0x58
. Значение R1
не будет изменено.
Команда LDR R3, [R1, #8]
( LDR (немедленный) вариант без знака смещения ) производит ту же операцию, однако прототип отличается:
-- stores to a 32-bit register
LDR <Wt>, [<Xn|SP>{, #<pimm>}]
-- stores to a 64-bit register
LDR <Xt>, [<Xn|SP>{, #<pimm>}]
Прямое смещение pimm отличается, LDUR использует simm . Это означает, что смещение интерпретируется по-другому. Первый ( pimm ) является положительным смещением, а его диапазон отличается для 32-битного варианта и 64-битного варианта.
В 32-битной версии:
В 64-битной версии:
Это означает, что некоторые смежные комбинации LDUR и LDR (немедленные) будут выполнять одну и ту же операцию.