Ich habe ein Problem im Kopf und das ist, da die Sprunganweisung das EIP-Register durch Hinzufügen von vorzeichenbehafteten Offsets ändert (wenn ich hier keinen Fehler mache), würde auf der IA-32-Architektur vom Speicher nach oben gehen 0x7FFFFFFF (größte positive Zahl in vorzeichenbehafteter Logik) bis 0x80000000 (am wenigsten negative Zahl in vorzeichenbehafteter Logik) möglich? oder vielleicht sollte es wegen der Art der signierten Logik keinen solchen Sprung geben?wäre da ein solcher Fall des Springens, wenn ja wie?
Antwort
Vorzeichen und Vorzeichen sind nur zwei Möglichkeiten, das gleiche Bitmuster zu interpretieren. Diese Interpretation ändert nicht, wie die Addition durchgeführt wird. 7FFFFFFF + 1 ist immer 80000000, aber dies könnte entweder als Vorzeichen (eine negative Zahl) oder als Vorzeichen (eine positive Zahl) interpretiert werden.
Der Befehlszeiger wird immer als unsigned interpretiert (offensichtlich negative Adressen haben keine Bedeutung), so dass Ihre Frage beantwortet.
Relative Sprünge sind nicht signiert. Die Nummer aus der Sprunganweisung wird einfach zu EIP hinzugefügt. So können Sie überall im 32-Bit-Adressraum springen.
Beispiel: Wenn EIP 20 ist und Sie zu 4 springen möchten, verwenden Sie jmp 0FFFFFFF0h. Diese große Zahl wird zu EIP hinzugefügt, was effektiv dasselbe ist wie das Subtrahieren von 16.
Um von 7FFFFFFFh zu 80000000h zu springen, würden Sie Sprung 1 verwenden :-) Aber Ihre Adressen überschneiden sich, also ist es in der Praxis nutzlos.
Beachten Sie auch, dass alle Addition und Subtraktion Logik unabhängig von Zeichen funktioniert. Die Operationen sind immer gleich, einschließlich der relativen Sprünge.
Adressen sind unter x86 aufgrund eines "flachen" Adressierungsmodus nicht signiert. Die Adressierungsmodusabschnitte von Intel-Entwicklerhandbüchern sollten dies abdecken, und die Abschnitte zu allen un/bedingten relativen Sprüngen könnten auch etwas erwähnen, aber sie würden ungeachtet des Integer-Überlaufs funktionieren.
Um nur den Punkt über 0x7FFFFFFF + 1 zu wiederholen, der immer 0x80000000 ist, selbst wenn Sie 0x7FFFFFFF als signiert behandeln (+2147483647), bewirkt dieser Zusatz immer noch, dass er überläuft und auf -2147483648 (was 0x80000000 ist) – user470379