Frage

Demontage printf gibt nicht viele Infos:

(gdb) disas printf
Dump of assembler code for function printf:
0x00401b38 <printf+0>:  jmp    *0x405130
0x00401b3e <printf+6>:  nop
0x00401b3f <printf+7>:  nop
End of assembler dump.


(gdb) disas 0x405130
Dump of assembler code for function _imp__printf:
0x00405130 <_imp__printf+0>:    je     0x405184 <_imp__vfprintf+76>
0x00405132 <_imp__printf+2>:    add    %al,(%eax)

Wie wird es unter der Haube umgesetzt?

Warum hilft das Zerlegen nicht?

Was macht * meine vorher 0x405130?

War es hilfreich?

Lösung

Erstellbare Methode ändern Der Code: generasacodicetagpre.

bis generasacodicetagpre.

Andere Tipps

Der * ist die AT&T-Assembler-Syntax für indirekte Speicherreferenzen.D.h.

jmp *<addr>

bedeutet „Zur gespeicherten Adresse springen“. <addr>".

Es entspricht der folgenden Intel-Syntax:

jmp [addr]

Der Verzweigungsadressierung mithilfe von Registern oder Speicheroperanden muss ein „*“ vorangestellt werden.

Quelle

Praktisch alle C -Compiler bieten der Quelle die Laufzeitbibliotheken - nicht nur Open -Source -Compiler. Leider sind sie oft in ziemlich schwierigem Formular geschrieben, und sie sind im Allgemeinen nicht mit Dokumenten für Designbeschwerden ausgestattet.

Eine sehr schöne Ressource für den Umgang mit diesem Problem ist also PJ Plaugers "Die Standard -C -Bibliothek", das nicht nur die Quelle für eine Bibliotheksimplementierung liefert, sondern auch Einzelheiten darüber enthält, wie sie entworfen wurde, und in den besonderen Situationen, die eine solche Bibliothek berücksichtigen muss.

Zu den Preisen, die einige der "gebrauchten" Versionen des Buches angeboten werden, ist es ein Schnäppchen und sollte sich auf dem Bücherregal eines ernsthaften C -Programmierers befinden.

Plauger hat ähnliche Bücher, die auf die C ++ - Bibliothek abzielen, die meiner Meinung nach einen ähnlichen Wert haben:

Ich würde sagen, dass das Disassembling hier gut funktioniert, und dass Printf hier mit VFprintf "Unter der Haube" implementiert wird, was Sie erwarten würden. Beachten Sie, dass Assembler in der Regel viel ausführlicher ist als das C und zeitaufwändig, um zu verstehen, wo Sie die kommentierte Quelle nicht haben. Der Compiler -Ausgang ist auch keine gute Möglichkeit, sich selbst Assembler beizubringen.

printf() befindet sich höchstwahrscheinlich in einer dynamischen gemeinsamen Bibliothek. Der dynamische Linker füllt eine Tabelle mit den Adressen der importierten Funktionen. Deshalb müssen Sie diesen indirekten Anruf tätigen.

Ich erinnere mich nicht wirklich, wie das funktioniert. Es ist wahrscheinlich, dass Optimierungen den Prozess erschweren. Aber Sie haben die Idee.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top