Relative vs Absolute jmp-Montage
Wunderte ich mich über die folgenden. Ich habe bemerkt, beim schreiben von assembly-Sprache, die IA32 ist in einer solchen Weise zu fördern, die Nutzung von relative Sprünge, d.h. springen, eine Verschiebung der bytes vs die Verwendung von absoluten springt also ändern eip zu einer bestimmten Adresse im Speicher. Was ist die Logik dahinter?
- Beachten Sie, dass in den meisten Fällen nutzt man Adressen, die derzeit verfügbar sind, und nicht alles, was Sie wählen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meisten Sprünge sind Ziele, die nicht weit entfernt von der jump-Anweisung. Da die Sprung-Anweisungen werden zur Verfügung gestellt, die einen signed 16-bit Wert, Sie kann weniger bytes als nötig für einen absoluten Sprung (in der Regel 4 bytes plus die Anweisung selbst).
Einen kleinen zusätzlichen Vorteil der relativen Verzweigungen ist, dass Sie nicht brauchen, um Feste bis in die linker, oder, für diese Angelegenheit, gehen Sie durch die zusätzliche Dereferenzierung erforderlich PIC (position independent code).
Relative Sprünge machen es möglich für Compiler generieren verschiebbar - code, was bedeutet, dass der code irgendwo im Speicher; es ist nicht gebunden an einen festen Ort. Dies ist das entscheidende Konzept hinter der Bibliotheken: Sie können schreiben, den code einmal kompilieren und es in einem verschiebbaren Objekt - Datei, die verknüpft werden können, wie in jedem Programm. Der linker muss zum zuweisen von absoluten Adressen nur für die Funktionen, die von außen zugänglich (also Ihrem eigenen code finden kann), alle "internen" - Sprünge sind relativ und müssen nicht der Wechsel von einer ausführbaren Datei zu der nächsten.
Es lohnt sich Ihre Zeit, code zu schreiben in einem high-level-Sprache wie C, die compiler generiert Assembler-code (überprüfen Sie die
-S
option gcc), und dann Lesen Sie die Montage-Ausgang. Achten Sie besonders auf Bedingungen und Schleifen, wieif
,for
, undwhile
, und Sie werden sehen, dass Sie alle erzeugen relative Sprünge.Hier ein erfundenes Beispiel mit fiktiven Montageanleitung:
Hier generiert der compiler relative Sprünge (
JGE
undJMP
) zum überspringen des un-ausgeführt Zweig derif-else
block. Diese Sprünge funktionieren wird, egal wo im Speicher der linker setzt den code. Wenn Sie waren absolute springt der linker müsste, um eine Neuberechnung der Adressen jedes mal, wenn es verknüpft den code.Du wirst auch feststellen, dass viele Funktionsaufrufe generiert relative Sprünge, insbesondere, wenn die Funktionen beschränkt, die innerhalb einer einzigen Datei. Nicht nur, dass diese beschleunigen die Verknüpfung von Prozess, aber es macht den code kleiner und effizienter, auch. Das ist, weil die relative Adressen sind in der Regel beschränkt auf eine viel kleinere Reichweite als absolute Adressen, was bedeutet, dass Sie dargestellt werden können, in weniger bytes.
Hoffe, das hilft!