2017-12-09 4 views
1

Ich arbeite an einem kleinen Compiler-Projekt, und ich kann nicht herausfinden, wie die Adresse eines Stack-Speicherortes anstelle des Werts auf diesem Stapel verschoben werden Lage. Mein Ziel ist es, eine Stapelspeicheradresse, die einen ganzzahligen Wert enthält, als void-Zeiger auf eine C-Funktion zu setzen, die sie druckt. Mein oberstes Ziel ist es, eine Zeiger-Ganzzahl-Arithmetik in der Funktion auszuführen. Ich bin erfolgreich beim Aufrufen der C-Funktion von einer Laufzeitbibliothek Erweiterung, aber das Problem ist nur herauszufinden, wie die Adresse in Assembly schieben.Push-Adresse des Stack-Speicherortes anstelle des Werts an der Adresse

Meine C-Funktion.

void print(void* ptr){ 
    int* int_ptr = (int*)ptr; 
    printf("*int_ptr is %d\n",*int_ptr); 
} 

Meine Assembly

.globl main 
main: 
pushl %ebp 
movl %esp, %ebp 
subl $4, %esp 

movl $42, %eax 
movl %eax, -4(%ebp) 

pushl -4(%ebp) 
//Instead of the value at -4(%ebp), I would like the address of -4(%ebp) 
call print 

addl $8, %esp 
leave 
ret 

Als für das, was ich jetzt haben, wird es zum Absturz bringen, da ich den Wert Casting bin 42 an eine Adresse. Kann mir jemand bitte eine Referenz oder Ressourcen nennen, um mehr zu erfahren?

+1

@MichaelPetch Wow! Ich kann nicht glauben, dass es so einfach war. Ich danke dir sehr! – Miket25

Antwort

3

Im Allgemeinen können Sie die Adresse eines stack-basierten Wertes erhalten, indem Sie die Anweisung verwenden, um die effektive Adresse -4(%ebp) zu erhalten und in ein Register zu setzen. Sie können dann dieses Register auf den Stapel schieben. Die LEA Instruktion wird in den instruction set reference diese Weise beschrieben:

Ermittelt die effektive Adresse des zweiten Operanden (der Quelloperand) und speichert sie in dem ersten Operanden (Zieloperand). Der Quelloperand ist eine Speicheradresse (Offset-Teil), die mit einem der Adressierungsmodi des Prozessors spezifiziert ist; Der Zieloperand ist ein Allzweckregister.

In Ihrem Code so etwas wie dies funktioniert hätte:

durch Ihre Funktion print Diese
lea -4(%ebp), %eax 
push %eax 

sollte effektiv passieren die Adresse -4(%ebp) auf dem Stapel für den Einsatz.

Verwandte Themen