Wie verwendet man RIP Relative Adressierung in einem 64-Bit-Montageprogramm?
-
15-09-2020 - |
Frage
Wie verwende ich RIP Relative Adressierung in einem Linux-Montageprogramm für die AMD64-Archtiteure? Ich suche ein einfaches Beispiel (ein Hello-World-Programm), das den relativen Adressmodus AMD64 RIP nutzt.
Beispielsweise funktioniert das folgende 64-Bit-Montage-Programm mit normaler (absoluter Adressierung):
generasacodicetagpre.Ich vermute, dass das gleiche Programm mit RIP-Relat-Relating-Adressierung so etwas wäre:
generasacodicetagpre.Die normale Version läuft in Ordnung, wenn er kompiliert mit:
generasacodicetagpre.Aber ich kann die RIP-Version nicht arbeiten.
Alle Ideen?
--- edit ----
Die Antwort von Stephen Canon funktioniert die RIP-Version.
Jetzt, wenn ich die ausführbare Datei der RIP-Version zerledere, bekomme ich:
objdump -d hallo
generasacodicetagpre.Das zeigt, was ich versuchte, zu erfüllen: Lea 0x10 (% RIP),% RSI lädt die Adresse 17 Bytes nach der Anweisung des Lea-Anweisungen, die Adresse 0x400096 ist, wo die Hello-World-String gefunden werden kann und somit zu einem positionsunabhängigen Code führt.
Lösung
Ich glaube, dass Sie die -Adresse Ihrer Saite in den generationspflichtigen Ladung in den generationspflichtigen Ladern laden möchten.Ihr Code versucht, ein Quadword von dieser Adresse anstelle der Adresse selbst zu laden.Du willst:
generasacodicetagpre.wenn ich mich nicht irre.Ich habe jedoch keine Linux-Box, um weiter zu testen.
Andere Tipps
Da Sie die Adresse von msg in% RSI benötigen, ersetzen Sie einfach:
generasacodicetagpre.mit:
generasacodicetagpre.