2017-03-29 4 views
-1

Ich möchte ein Programm mit mehreren Sprachen schreiben, in dem ein Teil des Codes in C und ein Teil des Codes in Assembly geschrieben wird. Ich bekam einen Beispielcode, also weiß ich, wie meine Arbeit aussehen soll.Wie führe ich ein Programm mit mehreren Sprachen aus?

.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 

Oben ist der Montageteil.

int addArrayinC(int *myArray, int num) 
{ 
    int c; 
    int i; 

    c = 0; 

    for (i=0; i<num; i++) 
     {c += *myArray; 
     myArray++; 
     } 

    return (c); 


} 

Dies ist die zweite Funktion in C geschrieben Und unten ist die Hauptdatei, die über zwei Funktionen sollte verwenden.

#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; 
    } 

Ich habe versucht, diese drei Dateien in Codeblöcke zu öffnen, aber bekommen konnte sie nicht laufen. Ich habe keine Ahnung, wie man ein gemischtes Sprachprogramm betreibt. Im Allgemeinen verwende ich cloud9 für Code-Zusammenstellungen. Wie auch immer ... Wie kann ich Code so laufen lassen?

+0

können Sie versuchen, Inline-Montage in c. https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html –

+0

Hey danke! jetzt funktioniert alles ... –

+0

Ich wusste nie, dass es möglich ist, asm inline. Obwohl das nicht genau das ist, was ich suchte, funktioniert es gut, ich denke ... Danke! :) –

Antwort

0

Kein Problem hier. Bitte beachten Sie: Die Erweiterung der Assembler-Quelldatei muss .s oder .S sein (in Großbuchstaben, wenn die Datei beispielsweise für #define vorverarbeitet werden soll).

Screenshot

+0

Ich kann nicht sogar .s-Datei zu meinem Projekt hinzufügen. Ich kann Asm-Datei nur von MASM hinzufügen, funktioniert aber auch nicht. –

+0

http://imgur.com/a/ofQwj Könnten Sie bitte einen Blick darauf werfen? –

+0

@IrakliKoberidze: Benennen Sie 'dad.asm' in' dad.s' um. Entferne 'dad.asm' aus dem Projekt (Rechtsklick auf' dad.asm' im Managementfenster). Fügen Sie 'dad.s' hinzu (Rechtsklick auf' assem'). Fügen Sie diesem Projekt die zweite .c-Datei hinzu ('assem'). Erstellen und führen Sie das Projekt (Schlüssel 'F9' oder über das Menü Build/Build and run). – rkhb

0

fun.c

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

bauen und untersuchen

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

Herstellung

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

So können wir fun.s machen

.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-Code 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 lässt Sie füttern Assemblersprache

gcc so.c fun.s -o so 
./so 
2 
3 
4 

sowie Objekte

gcc so.c fun.o 
./so 
2 
3 
4 

so müssen Sie nicht zu verwirren haben mit dem Linker direkt

Verwandte Themen