Dies ist mein C-Programm mit puts()
:
Nachdem ich gcc -S -o sample.s sample.c
benutzt habe, um es in Assembly zu kompilieren, habe ich Folgendes bekommen:
Ich habe den gleichen Weg gemacht, dieses Mal habe ich printf()
anstelle von puts benutzt und das habe ich bekommen:
Hier ist, was ich nicht verstehe, die printf()
function mov $.LC0
bis %eax
, dann mov %eax
bis (%esp)
, während die puts()
funktion mov %.LC0
direkt auf (%esp)
.
Ich weiß nicht, warum das so ist.
Der große Unterschied zwischen den beiden Funktionen auf Assembly-Ebene besteht darin, dass die Funktion puts()
nur ein Argument (einen Zeiger auf die anzuzeigende Zeichenfolge) und die printf()
-Funktion ein Argument (einen Zeiger) benötigt in die Formatzeichenfolge) und dann eine beliebige Anzahl von Argumenten im Stapel ( printf()
ist eine variadische Funktion).
Beachten Sie, dass es absolut keine Überprüfung der Anzahl der Argumente gibt, es hängt nur von der Anzahl der Zeit ab, die das Zeichen %
in der Formatzeichenfolge angetroffen wird. Zum Beispiel wird diese Spezifität im Formatzeichenfolgeformat-Fehlerausnutzungs-Verfahren verwendet, um interaktiv den Inhalt des Stapels eines Prozesses zu untersuchen.
Der Unterschied besteht also darin, dass puts()
nur ein Argument und printf()
eine variadische Funktion hat.
Wenn Sie diesen Unterschied besser verstehen wollen, versuchen Sie Folgendes zu kompilieren:
%Vor%