Я пытаюсь сделать простой пример, чтобы вставить в код C 32-битный фрагмент сборки Sparc; этот небольшой код выполняет приращение переменной «сумма».
Код:
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
int n;
int sum;
int main ()
{
n = 100;
sum = 0;
struct timeval tv1, tv2;
long long diff;
gettimeofday (&tv1, NULL);
asm volatile ("set sum, %g1\n\t" \
"set n, %g3\n" \
"loop:\n\t" \
"add %g1, 1, %g2\n\t" \
"sub %g3, 1, %g4\n\t" \
"bne loop\n\t" \
"nop\n\t" \
: "=r" (sum)
: "r" (n)
);
gettimeofday (&tv2, NULL);
diff = (tv2.tv_sec - tv1.tv_sec) * 1000000L + (tv2.tv_usec - tv1.tv_usec);
printf ("Elapsed time = %d usec\n", diff);
printf ("Sum = %d\n", sum);
return 0;
}
К сожалению, компиляция с помощью gcc4.1.2 приводит к следующим ошибкам:
loop_dev_for-assembly_code.c: In function #main#:
loop_dev_for-assembly_code.c:18: error: invalid 'asm': invalid operand output code
loop_dev_for-assembly_code.c:18: error: invalid 'asm': operand number out of range
loop_dev_for-assembly_code.c:18: error: invalid 'asm': invalid operand output code
loop_dev_for-assembly_code.c:18: error: invalid 'asm': operand number out of range
loop_dev_for-assembly_code.c:18: error: invalid 'asm': operand number out of range
loop_dev_for-assembly_code.c:18: error: invalid 'asm': operand number out of range
Кажется, строка 18 соответствует "asm volatile ("set sum, %g1\n\t" \ ...
".
Но я не знаю, как обойти эти ошибки. Это может происходить из переменной sum
, которая установлена в регистре %g1
.
О связях между переменной, принадлежащей коду C, и переменной, локализованной в части кода на ассемблере. Я также видел для входных и выходных параметров синтаксис "=g"
(выходной параметр ??), "g"
(входной параметр): я думаю, что он соответствует разным регистрам между двумя синтаксисами.
если бы кто-нибудь мог дать мне некоторые подсказки, чтобы понять эту ссылку и отладить мой небольшой код, который выполняет простой цикл для увеличения variable sum
.
Спасибо за помощь, с уважением.