Как использовать LDR с логическим сдвигом № 2 в ARM-64? - PullRequest
0 голосов
/ 09 октября 2018

Я пишу несколько программ в сборке ARM.Я хотел написать эквивалент этого:

int array_test(int index)
{
    ...
    arr[0] = 3;
    arr[1] = 9;
    arr[2] = 6;
    return arr[index];
}

, где я хочу установить значения массива для индекса 0-2 и вернуть значение массива для данного индекса.

В моей программе я использую

x4 = индекс;SP, SP # 4, SP # 8 = arr [0], arr [1], arr [2];x0 = возвращаемое значение

Чтобы получить элемент массива, заданный индексом, я хочу умножить индекс на 4 (для размера int) и добавить в SP.Однако, когда я использую

LDR x0, [SP, x4, LSL#2]     // Load to x0, (arr[index]) for return;

Но я получаю эту ошибку с aarch64-linux-android-gcc:

error: expected 'lsl' or 'sxtx' with optional shift of #0 or #3

Однако я могу получить то же самое с LSL, за которым следуетLDR:

LSL x4, x4, #2      // multiply index by 4 for 32-bit int
LDR x0, [SP, x4]    // Load to x0, (arr[index]) for return;

Почему я не могу использовать LDR с LSL из # 2 ?Только # 0 или # 3 кажутся действительными.

Спасибо за помощь!

1 Ответ

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

Вы использовали LDR инструкцию с 64-битным регистром назначения вместо 32-битного.

64-битный вариант загружает восемь байтов в регистр назначения Xn и позволяетсдвиг индекса # 0 или # 3

32-битный вариант загружает четыре байта в регистр назначения Wn и допускает сдвиг индекса # 0 или # 2 .Регистрация Wn расширена нулями для регистрации Xn

Вы должны использовать LDR w0, [SP, x4, LSL#2]

...