Gcc 简单的汇编示例:设置输入并获得正确的输出语法
我试着做一个简单的例子,在C代码中插入一段32位的Sparc汇编代码;这段小代码对变量“sum”执行增量运算 代码是:Gcc 简单的汇编示例:设置输入并获得正确的输出语法,gcc,assembly,inline-assembly,sparc,Gcc,Assembly,Inline Assembly,Sparc,我试着做一个简单的例子,在C代码中插入一段32位的Sparc汇编代码;这段小代码对变量“sum”执行增量运算 代码是: #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; gettimeo
#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;
}
第18行似乎对应于“asm volatile”(“set sum,%g1\n\t”\…
”
但我不知道如何避免这些错误。它可能来自变量sum
,该变量设置为%g1
寄存器
关于属于C代码的变量和汇编代码部分中设置的变量之间的链接。我还看到,对于输入和输出参数,语法“=g”
(输出参数??),“g”
(输入参数):我认为它对应于两种语法之间的不同寄存器
如果有人能给我一些线索来理解这个链接并调试我的小代码,它做一个简单的循环来增加变量和
感谢您的帮助,敬请。正如其他人所说,您的内联汇编代码中存在许多错误和误解。以下是几点。首先,在扩展asm语法中,您必须用另一个“%”转义所有“%”符号,因此,例如,您需要将“%”放在“%g1”而不是“%g1”中,并对您访问的所有寄存器执行此操作。S其次,不能对变量n或sum使用“set”,因为它们都是堆栈变量,而不是全局变量。您已经在asm语句中将这些变量声明为位置参数,因此sum是参数%0,n是%1。add指令将结果放入%g2中,该结果从未初始化或在任何地方使用过 我认为整个序列可以更简单地呈现为这样(未经测试):
你试过阅读手册吗?你犯了很多错误,很难统计。无论如何,如果可能的话,避免使用内联asm,并使用单独的asm文件。-@Jester对不起,很久以前我没有练习Sparc汇编,尤其是内联汇编。如果你能在小内联代码中给出一些大错误。你使用的是Sparc吗gcc还是您正在向sparc提供的x86 gcc?首先,将asm删除到其自己的文件中并调用gcc或as来组装它,然后用标签将其包装,然后返回并从C调用它。我从sparc版本的Debian蚀刻(sparc 32位)编译感谢QEMU主机中的QEMU系统Sparc命令和Debian蚀刻的映像,这个Sparc版本正在运行。如果您能告诉我内联代码的主要错误,这将是很好的。谢谢
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
asm volatile ("clr %%g1\n" \
"loop:\n\t" \
"add %%g1, 1, %%g1\n\t" \
"subcc %1, 1, %1\n\t" \
"bne loop\n\t" \
"nop\n\t" \
"mov %%g1, %0\n" \
: "=r" (sum)
: "r" (n)
: "g1" );