fand ich die Passage du sprichst:
4.5.1 JMP Anweisung
Der JMP-Befehl bewirkt, dass eine bedingungslose Übertragung zu einem Ziel, durch ein Codeetikett identifiziert, die durch denen übersetzt Assembler zu einem Offset. Die Syntax ist
JMP Ziel
Wenn die CPU eine bedingungslose Übertragung ausführt, den Offset des Ziels wird in den Befehlszeiger bewegt, wodurch die Ausführung an dem neuen Ort fortzusetzen.
Ihre Verwirrung ist verständlich; das ist schlecht erklärt.
Vor allem, wenn eine Anweisung sagt jmp destination
, dann wird es die Befehlszeiger gleich destination
gesetzt. Da hast du Recht.
Aber das Befehlsverhalten wird mit der Anweisung Codierung verwechselt.
Instructions des Formulars jmp address
codiert relativen Versätze in x86 verwenden. Die Offsets beziehen sich auf die Adresse unmittelbar nach die jmp
Anweisung.
Dies kann entweder als EB
gefolgt von einem vorzeichenbehafteten Byte-Offset oder E9
gefolgt von einem vorzeichenbehafteten Dword-Offset codiert werden. (Die ganzen Zahlen sind little endian in x86)
Zum Beispiel
00010000: EB 01 CC 90
Disassembliert zu
loc_10000:
jmp loc_10003 ; EB 01
int3 ; CC
loc_10003:
nop ; 90
Und
00010000: E9 01 00 00 00 CC 90
Disassembliert zu
loc_10000:
jmp loc_10006 ; E9 01 00 00 00
int3 ; CC
loc_10006:
nop ; 90
Beachten Sie, dass dies bedeutet, dass auf die gleiche Weise geschriebene Anweisungen unterschiedliche Kodierungen haben können, wenn sie sich an verschiedenen Adressen befinden. Zum Beispiel
00010000: EB 02 EB 00 CC EB FD EB FB
Disassembliert zu
loc_10000:
jmp loc_10004 ; EB 02
jmp loc_10004 ; EB 00
loc_10004:
int3 ; CC
jmp loc_10004 ; EB FD (FD == -3)
jmp loc_10004 ; EB FB (FB == -5)
Randbemerkung: Es gibt verschiedene Formen der jmp
Anweisung, aber die Art von dem Sie sprechen nur mit einem relativen Versatz codiert werden.
Wie auch immer, was der Autor sagt, ist, dass für ein Assembler Maschinencode für einen Befehl wie jmp destination
zu erzeugen, ist es destination
zu einem Byte-Offset gegenüber dem Ende der jmp
Anweisung konvertieren. In den meisten Fällen müssen Sie sich jedoch nicht um diesen Vorgang kümmern. Sie können einfach eine Beschriftung in Ihrer Baugruppe definieren und jmp my_label
schreiben, und der Assembler kümmert sich um alles für Sie.
Was ist der Unterschied zwischen "die Adresse, zu der wir springen wollen" und "der Offset (Adresse) des Ziels"? –
Nun, ist die absolute Adresse im Anweisungszeiger gespeichert oder ein Offset zu einem anderen Wert? – Dennis
IIRC der Wert in IP ist die Adresse des Codesegments + die Adresse des JMP-Labels. Dies ist immer der Fall. In unserer Zeit könnte dies bereits automatisch geschehen, aber früher bedeutet dies: Adresse, wo das Codesegement + Adresse des JMP-Labels beginnt (daher das Wort Offset). – icbytes