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:
我所做的只是改变比较的感觉,并绕过将您带到备用代码路径的无条件跳转。
如果您有很多条件跳转,有时会很烦人。您将重新编码其中一个,它会触发另一个。然后你重构代码并发现其中一些被破坏的条件可以消失。通常我不会担心它,除非我非常关心代码大小。
一些汇编程序有一个开关,可以为您自动调整跳转大小,以便您始终可以编写条件跳转代码,它们会自动执行跳转条件跳转技巧。
最有可能的区别
PRINT 'something'
和
call PTHIS
db 13, 10, 'something'
是不是第一个是一个宏,它扩展为用于打印某些东西的完整代码,以及您要打印的字符串。第二个是简单call
指令(3 个字节),加上字符串。或者,在 C++ 术语中,PRINT
宏就像一个内联函数,并且call PTHIS
是一个普通(非内联)函数调用。