LDUR и STUR в ARM v8

У меня было несколько курсов, которые касались сборки 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-битной версии:

  • Он колеблется от 0 до 16380 и может быть только кратным 4

В 64-битной версии:

  • Он колеблется от 0 до 32760 и может быть только кратным 8

Это означает, что некоторые смежные комбинации LDUR и LDR (немедленные) будут выполнять одну и ту же операцию.


Есть идеи?

10000