2017-03-29 3 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; 
    } 

これら3つのファイルを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'を右クリックしてください)。 2番目の.cファイルをこのプロジェクトに追加します( 'assem')。ビルドしてプロジェクトを実行する(キー 'F9'またはメニュービルド/ビルドと実行).. – rkhb

0

fun.c

unsigned int fun (unsigned int x) 
{ 
    return(x+1); 
} 

ビルドとだから我々はfun.sを作ることができます

0000000000000000 <fun>: 
    0: 8d 47 01    lea 0x1(%rdi),%eax 
    3: c3      retq 

を生産

gcc -c -O2 fun.c -o fun.o 
objdump -D fun.o 

を調べる

.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 

ので、あなたは混乱に持っていけないオブジェクトを養うことができます直接リンカーで

関連する問題