Gcc 简单的汇编示例:设置输入并获得正确的输出语法

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

我试着做一个简单的例子,在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;

  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" );