Попытка скомпилировать функцию в сборке - PullRequest
0 голосов
/ 02 октября 2019

Итак, у меня есть такая проблема: напишите функцию на ассемблере, чтобы вычислить сумму первых N чисел от 0 до N. N передается в качестве аргумента функции. Функция будет вызываться, как показано ниже Int sumofFirstNNumbers (int N)

И для этого я создал этот код сборки:

sub sp, sp, #32

str w0, [sp, 12]

str wzr, [sp, 24]

str wzr, [sp, 28]

.L3:

ldr w1, [sp, 28]

ldr w0, [sp, 12]

cmp w1, w0

bgt .L2

ldr w1, [sp, 24]

ldr w0, [sp, 28]

add w0, w1, w0

str w0, [sp, 24]

ldr w0, [sp, 28]

add w0, w0, 1

str w0, [sp, 28]

b .L3

.L2:

ldr w0, [sp, 24]

add sp, sp, 32

ret

, однако, когда я запускаю этот код в Segger, онпродолжает показывать эту ошибку, ожидается регистр ARM, и я не знаю, как ее исправить. Любая помощь будет оценена !!

1 Ответ

0 голосов
/ 02 октября 2019

Ваш код AArch64, а не ARM (32-разрядный). Создайте его с помощью набора инструментов AArch64, а не ARM.

Или используйте регистры ARM (r0 вместо w0 и т. Д.).

Также обратите внимание, что ARM не имеет архитектурногорегистр нуля, поэтому вам нужно будет создать регистр обнуления с помощью инструкции mov, вместо того, чтобы просто использовать wzr.

Или, лучше, вообще не использовать память. Для sum (i = 1..n) нужны только пара регистров, счетчик и аккумулятор. И предел, если вы считаете, а не вниз. Вы скомпилировали C в режиме отладки (с помощью компилятора AArch64), а затем вручную скопировали его в проект ARM?

...