16 ビット アセンブラーの条件付きジャンプ命令の問題は、オフセットが +127 または -128 バイトに制限されていることです。
386 では、jcc rel16
16 ビット モードで使用できるエンコーディングが導入されましたが、386 以降でのみ使用できます。アセンブラが異なれば、16 ビット コードで 386 命令を有効にするためのオプションも異なります。
jcc rel8
一部には、以下で説明することを自動的に実行するオプションもありますjmp rel16
。たとえば、TASM には/jJUMPS
.
あなたがこれを持っているとしましょう:
cmp al, '1'
jnz ItsNot1
; lots of code here
ItsNot1:
範囲外のエラーが発生した場合は、次のように再コーディングできます。
cmp al, '1'
jz Its1
jmp ItsNot1
Its1:
; lots of code here
ItsNot1:
私が行ったのは、比較の意味を変更し、別のコード パスに移動する無条件ジャンプを回避することだけです。
条件付きジャンプがたくさんあると、面倒になることがあります。それらの1つを再コーディングすると、別のトリガーがトリガーされます。そして、コードをリファクタリングし、それらの壊れた条件の一部がなくなる可能性があることを発見します。通常、コード サイズを真剣に気にしない限り、気にすることはありません。
一部のアセンブラには、自動ジャンプ サイズ設定を行うスイッチがあり、いつでも条件付きジャンプをコーディングでき、ジャンプ アラウンド条件付きジャンプ トリックを自動的に実行できます。
ほとんどの場合、
PRINT 'something'
と
call PTHIS
db 13, 10, 'something'
最初のものは、何かを印刷するための完全なコードに加えて、印刷したい文字列に展開されるマクロです。2 番目は単純なcall
命令 (3 バイト) と文字列です。または、C++ の用語では、PRINT
マクロはインライン関数のようなものでcall PTHIS
、通常の (インライン化されていない) 関数呼び出しです。