我想编写一个混合语言程序,其中部分代码将用C语言编写,部分代码用汇编语言编写。我得到了一个示例代码,所以我知道我的工作应该是什么样的。
.globl _addArrayinA
_addArrayinA:
pushl %ebp
movl %esp,%ebp
subl $8,%esp
movl 8(%ebp), %ebx
xorl %esi,%esi
xor %eax,%eax
bak:
addl (%ebx),%eax
addl $4,%ebx
incl %esi
cmpl $10, %esi
jne bak
movl %ebp, %esp
popl %ebp
ret
# Return value is in %ea
以上是装配部分。
int addArrayinC(int *myArray, int num)
{
int c;
int i;
c = 0;
for (i=0; i<num; i++)
{c += *myArray;
myArray++;
}
return (c);
}
这是用C编写的第二个函数。 以下是主文件,它应该使用上面的两个函数。
#include <stdio.h>
#include <stdlib.h>
extern int addArrayinC(int *numbers,int count);
extern int addArrayinA(int *numbers, int count);
int main(void) {
int mynumbers[10]={1,2,3,4,5,6,7,8,9,0};
int sum;
sum = addArrayinC(mynumbers, 10);
printf("\nThe sum of array computed in C is : %d ",sum);
sum = addArrayinA(mynumbers, 10);
printf("\nThe sum of array computed in assembly is : %d ",sum);
return EXIT_SUCCESS;
}
我试图在codeblocks中打开这三个文件,但无法运行它们。我不知道如何运行混合语言程序。通常,我使用cloud9进行代码编译。无论如何......我怎么能运行这样的代码?
答案 0 :(得分:0)
答案 1 :(得分:0)
fun.c
unsigned int fun ( unsigned int x )
{
return(x+1);
}
构建并检查
gcc -c -O2 fun.c -o fun.o
objdump -D fun.o
制造
0000000000000000 <fun>:
0: 8d 47 01 lea 0x1(%rdi),%eax
3: c3 retq
所以我们可以取笑。
.globl fun
fun:
lea 0x1(%rdi),%eax
retq
as fun.s -o fun.o
objdump -D fun.o
0000000000000000 <fun>:
0: 8d 47 01 lea 0x1(%rdi),%eax
3: c3 retq
C代码so.c
#include <stdio.h>
unsigned int fun ( unsigned int x );
int main ( void )
{
printf("%u\n",fun(1));
printf("%u\n",fun(2));
printf("%u\n",fun(3));
return(0);
}
gcc允许您提供汇编语言
gcc so.c fun.s -o so
./so
2
3
4
以及对象
gcc so.c fun.o
./so
2
3
4
所以你不必直接搞乱链接器