LDUR и STUR в ARM v8 - PullRequest
       76

LDUR и STUR в ARM v8

0 голосов
/ 19 октября 2018

У меня было несколько курсов, которые касались сборки ARMv8, но оба учителя описывали инструкции LDUR / STUR по-разному, и теперь я довольно растерялся.Может кто-нибудь помочь уточнить?

Если бы у меня была инструкция:

LDUR R3, [R1, # 8]

Я буду помещать ответ в R3, но что я беру из R1и как работает смещение?Это как логический сдвиг?Руководство ARM описывает его как «смещение байтов», но затем не описывает, как это смещение функционирует на R1.Должен ли я сдвинуть значение, хранящееся в R1 (скажем, R1 имеет значение 50) или есть адрес памяти вне R1, о котором мне нужно подумать?Другие источники говорят, что мне нужно как-то думать о R1 как о массиве?

Пожалуйста, помогите.Я понял все остальные инструкции, кроме LDUR и STUR.Приветствия.

1 Ответ

0 голосов
/ 24 октября 2018

LDUR равен Загрузить (немасштабированный) Регистр .Он загружает значение (32-разрядное или 64-разрядное) из адреса плюс смещение в регистр.unscaled означает, что в машинном коде смещение будет не кодироваться с масштабированным смещением, используемым likd ldr, т.е. сдвиг не будет применяться к битам немедленного смещения.Смещение ( simm немедленно подписано) будет добавлено в базовый регистр 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 - Сохранить (немасштабированный) Зарегистрироваться и работает таким же образом, но сохраняет значение в регистре в памяти.

Это прототипы для 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 (немедленные) будут производить одну и ту же операцию.

...