Я пишу несколько программ в сборке 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 кажутся действительными.
Спасибо за помощь!