【发布时间】:2013-01-29 03:16:17
【问题描述】:
我对汇编语言非常陌生,对 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 应将值 2*A + 2*B 返回到 C 主程序。我已经尝试过了,并提出了这个解决方案(请原谅我,我是今天的新手)
#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
它不起作用,我一点也不惊讶。我确信这段代码有很多问题,但是对这里发生的事情或我做错的事情进行彻底的解释真的会有所帮助。
【问题讨论】:
-
@thelaws 是的,效果很好,当给定 5 时返回值 -40
-
组装,好的,但是对于什么 CPU?可以标记一下吗?
-
我不肯定,我只知道我们正在通过 ssh 在学校的 SPARC 机器上运行。
-
您需要了解/查找架构的调用约定,以及一些有关为其编写汇编代码的文档。您可以在一定程度上作弊并使用 gcc 的
-S选项将 C 代码转换为汇编代码并从中学习一些东西。 -
我建议您使用
gcc -Wall -S -fverbose-asm进行编译(也许还有一些优化选项,例如-O2)。生成的.s程序集文件随后包含一些有用的生成 cmets。
标签: c linux function assembly sparc