Jump out-of-range-Lösungen und wie verschiedene Anweisungen beeinflussen Bereich
Ich habe gekämpft, viel mit dem Fehler "jmp out of range", eine Menge Zeit, die ich ausführen müssen, um eine subrutine aus verschiedenen teilen mein code als würde ich eine Funktion in C++.
Kam ich zu einem Punkt, dass beide enden auf meinen code springen müssen, auf den selben Platz und es gibt einfach keinen Weg für beide, um es zu erhalten.
Was ist die Lösung dafür?
Auch habe ich bemerkt, dass
PRINT 'something'
Scheint, zu besetzen, um mehr "Raum" als mit:
CALL PTHIS
DB 13, 10, 'something', 0
(Wenn ich einen DRUCK zwischen zwei Sprüngen, die ich bekommen springen aus der Reihe, aber wenn ich ersetzen Sie es mit einem PTHIS, ist es kein problem)
Warum ist das so?
- Was bedeutet die
PRINT
makro erweitern? jcc rel16
neu war in 386. Vorherjcc rel8
war die einzige Codierung, die für bedingte Verzweigungen, und nurjmp
/call
könnte springen weiter.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem mit der bedingten Sprungbefehle im 16-bit-assembler ist, dass Sie zu beschränkt sind um +127 oder -128 Byte für den offset.
386 eingeführt, die
jcc rel16
Kodierung ist verfügbar in 16-bit-Modus, aber nur auf 386 und höher. Verschiedene Monteure haben verschiedene Möglichkeiten, die für die Aktivierung 386 Anweisungen in 16-bit-codeEinige haben auch Optionen, um automatisch zu tun, was im folgenden beschrieben: bedingte
jcc rel8
über einejmp rel16
. Zum Beispiel, TASM ist/jJUMPS
.Lassen Sie uns sagen, Sie haben diese:
Wenn Sie sich einen Sprung außerhalb des Bereichs Fehler Sie können re-code wie folgt:
Alles was ich da gemacht hast, ist das wechseln der Sinn des Vergleichs und springen um den unbedingten Sprung, der Sie zu den alternativen code-Pfad.
Bekommt es nervt manchmal, wenn man viele bedingte Sprünge. Sie werden re-code einer von denen, und es wird der Auslöser. Und dann überarbeiten Sie den code und entdecken Sie einige der diese entstellten Bedingungen gehen kann entfernt. Normalerweise kümmere ich mich nicht, es sei denn, ich bin ernsthaft besorgt über die code-Größe.
Einige Monteure haben einen Schalter, der den automatischen Sprung Dimensionierung für Sie, so dass Sie immer den code der bedingten Sprünge und Sie werden der jump-around-conditional-jump-trick automatisch.
Wahrscheinlich der Unterschied zwischen
und
Ist, dass die erste ist ein makro, das expandiert, um den vollständigen code für den Druck etwas, plus die Zeichenfolge, die Sie drucken möchten. Die zweite ist eine einfache
call
Befehl (3 bytes), plus die Zeichenfolge. Oder, in C++ Begriffe, diePRINT
makro ist wie eine inline-Funktion, und diecall PTHIS
ist eine normale (nicht inline) Funktion aufrufen.jcc rel16
im 16-bit-Modus. Vor, dass, jajcc rel8
war die einzige Codierung, die für bedingte Verzweigungen, und nurjmp
/call
könnte springen weiter. Also ja, wenn Sie konnte nicht umstrukturieren, Ihren code zu vermeiden benötigen mehr bedingte Verzweigungen, bedingte Sprung über einejmp
war der Weg zu gehen.Manchmal haben Sie zu negieren, im test und stellen Sie den Zweig einfach springen ein bisschen, während der fall durch ein nicht-bedingter Sprung ist, um mit out-of-range-destination.