2017-03-29 119 views
-1

我想編寫一個混合語言程序,其中部分代碼將用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

你可以嘗試c中的內聯彙編。 https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html –

+0

嘿謝謝!現在一切正常...... –

+0

從來不知道有可能內聯asm。 雖然這不是我正在尋找它的工作正常,我認爲... 謝謝! :) –

回答

0

這裏沒問題。請注意:彙編源文件的擴展名必須是.s.S(如果要對文件進行預處理,例如#define,則爲大寫)。

Screenshot

+0

我甚至無法將.s文件添加到我的項目中。我只能從MASM中添加asm文件,但也不起作用。 –

+0

http://imgur.com/a/ofQwj 請問您能看一下嗎? –

+0

@IrakliKoberidze:將'dad.asm'重命名爲'dad.s'。從項目中刪除'dad.asm'(在管理窗口中右鍵單擊'dad.asm')。添加'dad.s'(右鍵單擊'assem')。將第二個.c文件添加到此項目('彙編「)。建立並運行項目(Key'F9'或通過Build/Build菜單運行).. – rkhb

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 

所以我們可以fun.s

.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 

所以你不必亂與鏈接器直接聯繫