16 位汇编器中条件跳转指令的问题在于它们的偏移量限制为 +127 或 -128 字节。
第386章 介绍了jcc rel16
16 位模式下可用的编码,但仅适用于 386 及更高版本。不同的汇编器有不同的选项来启用 16 位代码中的 386 条指令
有些还可以选择自动执行下述操作:jcc rel8
over a jmp rel16
。例如,TASM 有/jJUMPS http://comp.lang.asm.x86.narkive.com/dnHzBFc1/locals-and-jumps.
假设你有这个:
cmp al, '1'
jnz ItsNot1
; lots of code here
ItsNot1:
如果出现跳转超出范围错误,您可以像这样重新编码:
cmp al, '1'
jz Its1
jmp ItsNot1
Its1:
; lots of code here
ItsNot1:
我所做的只是改变比较的意义并跳过无条件跳转,将您带到备用代码路径。
如果你有很多条件跳转,有时会很烦人。您将重新编码其中一个,它会触发另一个。然后你重构代码并发现一些损坏的条件可以消失。通常我不会担心它,除非我非常担心代码大小。
一些汇编器有一个开关,可以为您自动调整跳转大小,以便您始终可以编写条件跳转代码,并且它们会自动执行跳转条件跳转技巧。
最有可能的区别是
PRINT 'something'
and
call PTHIS
db 13, 10, 'something'
第一个是一个宏,它扩展为用于打印某些内容的完整代码,加上您要打印的字符串。第二个是简单的call
指令(3 个字节),加上字符串。或者,用 C++ 术语来说,PRINT
宏就像一个内联函数,并且call PTHIS
是一个普通的(非内联的)函数调用。