如何运行混合语言程序

时间:2017-03-29 06:08:47

标签: c assembly

我想编写一个混合语言程序,其中部分代码将用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进行代码编译。无论如何......我怎么能运行这样的代码?

2 个答案:

答案 0 :(得分:0)

这里没问题。请注意:汇编源文件的扩展名必须是.s.S(大写如果您希望对文件进行预处理,例如#define)。

Screenshot

答案 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

所以你不必直接搞乱链接器