将汇编语言与c链接

时间:2013-01-29 03:16:18

标签: c linux function assembly sparc

我是汇编语言的新手,对C来说还是新手。我看过一个从c代码创建函数调用的示例,汇编代码有一个函数可以进行计算并返回值(这个是一项任务) C代码:

#include <stdio.h>

int Func(int);

int main() 
{
int Arg;
Arg = 5;
printf("Value returned is %d when %d sent\n",Func(Arg), Arg);
}

汇编代码:

.global Func
Func:    save  %sp,-800, %sp
add  %i0, -45 , %l0  
mov %l0, %i0 
ret 
restore

它从C代码中获取值,将值添加到汇编代码中的数字,然后输出新数字。我在很大程度上理解这个例子。我们的任务(修改代码):“编写一个调用Func1的C源文件,其中包含2个参数A和B,以及包含两个方法的汇编源文件,Func1和Func2。让Func1调用Func2,好像它是Func2(Q) .Func2应该将其输入参数加倍并将该加倍值发送回Func1。Func1应该返回C main值2 * A + 2 * B.“我试过这个,并提出了这个解决方案(请原谅我,我是今天的新手)

#include <stdio.h>

int Func1(int, int);
void Func2(int, int);
int main() 
{
int Arg1 = 20;
int Arg2 = 4;
printf("Value returned is %d ",Func1(Arg1,Arg2));

}

大会:

.global Func1
Func1: save %sp,-800, %sp 
mov %l0, %i0
mov %l1, %i1
call Func2
nop
ret
restore

Func2: save %sp,-800, %sp
umul %i0, 2 , %l0
umul %i1, 2 , %l1
call Func1
nop

它不起作用,我并不感到惊讶。我确定这段代码有很多问题,但对这里发生的事情或我做错了什么的彻底解释真的会有所帮助。

2 个答案:

答案 0 :(得分:1)

我是否正确看到了这一点:

In Func1, you call Func2
   which calls Func1 again
      which calls Func2 again
         which calls Func1 again
             which calls Func2 again
                 ...
Stack overflow, resulting in bad memory access and segmentation fault

显然,不要这样做:)。你到底想做什么?从Func2返回乘法的结果?然后返回它,就像从Func1返回添加结果一样。

然后作业清楚地说:

  

调用Func2,好像它是Func2(Q)。 Func2应该加倍输入   参数并将该值加倍返回

那你为什么要给Func2两个参数?如果我们假设有效的分配,那么你可以处理它的小块,就像我引用的这篇文章。它说Func2需要1个参数,所以相信并用一个参数制作Func2,并且你完成了一个分配(然后如果事实证明assignemnt无效或试图欺骗你,你当然需要回到它,当然,但上面很清楚)。


但为了帮助你,你有工作代码,对吗?

.global Func
Func:    save  %sp,-800, %sp
add  %i0, -45 , %l0  
mov %l0, %i0 
ret 
restore

对于Func2,您需要更改该代码,使其乘以2,而不是添加-45?您是否尝试将添加说明更改为:

imul  %i0, 2 , %l0  

(或者umul,但在您的C代码中指定了int而不是unsigned int,所以我认为它已签名......)。


我不会为你写Func1,但是你知道如何得到你的输入,我认为是正确的。然后你需要在返回之前在%i0中生成结果。小步骤工作:首先制作Func1,只返回%i0 + %i1,而不会调用Func2。然后尝试2 * %i0 + %i1,拨打Func2一次。然后最后写入2 * %i0 + 2 * %i1两次调用Func2的请求版本(或者更少更简单的代码,提取公共因子,这样您仍然只需要调用Func2一次)。

答案 1 :(得分:1)

要将值传递回func1,func2不应再次调用func1。有函数返回值到func1。函数的返回值应保存在寄存器i0中,这是大多数处理器的ABI。

  1. main使用值
  2. 调用func1
  3. func1读取参数形式i0
  4. func1使用i0
  5. 中的参数调用func2
  6. func2将参数相乘并保存在%l0
  7. 将值移回i0并返回
相关问题