2017-08-29 15 views
3

Das ist mein Montageprogramm add.sAufruf Montage Funktion von c führt Fehler

.globl add 

add: 
    movl 4(%esp), %eax 
    movl 8(%esp), %ebx 
    addl %ebx, %eax 
    ret 

Das ist mein C-Programm Segmentierung. Ich versuche, das Assembly-Programm aus dem C-Programm aufzurufen.

#include <stdio.h> 

int add(int a, int b); 

int main() { 
    int res = add(5,6); 
    printf("%d",res); 
    return 0; 
} 

Aber der obige Code gibt mir einen Segmentierungsfehler. Was verursacht diesen Fehler und wie behebe ich ihn?

+2

Wenn Sie die gleiche Funktion in C erstellen, wie funktioniert der Compiler Code generieren für sie? Führt es ein Stack-Setup durch, das du vermisst? Speichert es die Register, die es benutzt, um sie nicht zu überlisten (vielleicht werden sie woanders verwendet)? –

+2

Dies ist markiert mit 'x86-64'. Wenn das wahr ist, werden Argumente in dieser Architektur in keiner mir bekannten ABI übergeben. Auf was ist das Betriebssystem und die Architektur, auf die es sich bezieht? Wie ist es zusammengestellt und verlinkt? (Absturz wahrscheinlich, weil das Lesen von (% esp) schlecht ist, weil es% rsp sein soll). – Art

+0

Ich muss mit Art. Übereinstimmen. Kompilieren Sie dies als 32- oder 64-Bit-Code? –

Antwort

4

die cdecl Aufrufkonvention Unter der Annahme, verwenden Sie das ebx Register, das nicht clobbered sein sollte: sein Wert gespeichert werden muss und dann durch die Angerufenen wieder hergestellt, wenn sie geändert werden sollen.

Die Aufrufer geht davon aus, dass ebx wird nicht durch den Aufruf einer Funktion ändern. Daher, wenn die callee ändert, muss es zuerst speichern und dann wiederherstellen es auf seinen ursprünglichen Wert vor der Rückkehr von der Funktion. sie zuerst und dann wieder speichern


Die Register eax, ecx und edx können, ohne verwendet werden. Deshalb würde ich empfehlen ebx mit edx in Ihrem Code zu ersetzen:

add: 
    movl 4(%esp), %eax 
    movl 8(%esp), %edx 
    addl %edx, %eax 
    ret 
+0

Ich dachte 'ebx' ist ein allgemeines Register (lesen Sie es hier http://www.eecg.toronto.edu/~amza/www.mindsec.com/files/x86regs.html), warum es nicht überschrieben werden soll ? – CIsForCookies

+1

@CIsForCookies kann überschrieben werden, aber der Aufrufer geht davon aus, dass sich das Register 'ebx' nicht durch Aufruf einer Funktion ändert. Aus diesem Grund muss der Angerufene sie zuerst speichern und dann wiederherstellen, bevor er zurückkehrt. –

+0

oh ... ok. Was ist mit 'Push ebx' am Anfang von' add'? wird es in Ordnung sein? (offensichtlich 'edx' zu verwenden ist stattdessen der rechte Weg, aber versucht einfach zu verstehen) – CIsForCookies

Verwandte Themen