Assembly 在FPC ASM中对齐跳转表操作

Assembly 在FPC ASM中对齐跳转表操作,assembly,freepascal,lazarus,jump-table,Assembly,Freepascal,Lazarus,Jump Table,我有一张跳台,像这样: jmp rax @@table: jmp @@seg1 jmp @@sge2 jmp @@seg3 ... 这在理解jmp代码的长度为两个字节的情况下工作得非常好。我随后将代码添加到@@seg?代码段,现在跳到“更远”的代码段(标签)时会导致崩溃 我的结论是,更长的跳跃被编码为大于2的长度。不幸的是,我使用的反汇编程序在jmprax行停止,因此我无法确认。但结论是合乎逻辑的 有没有办法使编译器对齐jmp@@seg?命令的大小是4字节,这样我就可以保证跳转表有足够大且

我有一张跳台,像这样:

jmp  rax

@@table:
jmp @@seg1
jmp @@sge2
jmp @@seg3
...
这在理解jmp代码的长度为两个字节的情况下工作得非常好。我随后将代码添加到@@seg?代码段,现在跳到“更远”的代码段(标签)时会导致崩溃

我的结论是,更长的跳跃被编码为大于2的长度。不幸的是,我使用的反汇编程序在
jmprax
行停止,因此我无法确认。但结论是合乎逻辑的

有没有办法使编译器对齐
jmp@@seg
?命令的大小是4字节,这样我就可以保证跳转表有足够大且一致的大小?如果是这样,我可以确保以4s为单位递增
rax


我当然不想开始手动添加
nop
,试图解决这个问题。

强制它们都是5字节大小的近跳转。您无法将其放入4个字节;)或者,您可以只存储地址并使用间接跳转(如果不要求位置独立性)。你也可以存储偏移量,但是你必须自己添加一个基。我如何强制一个接近标签的跳跃?我真的不在乎职位的依赖性。我只想能够跳转到标记的片段。存储每个段的地址以便查找的最简单方法是什么?要存储地址,请使用汇编程序支持的任何指令,例如
dq@@seg1
。至于强制近跳转,您可能会执行类似于
jmpnear@@seg1
的操作,不幸的是,编译器说它忽略了near指令。你介意给我一个如何存储地址然后跳转到它的例子吗?存储地址,我已经有了。跳转就像
jmp[rax]
一样简单。强制所有跳转都是5字节大小的近跳转。您无法将其放入4个字节;)或者,您可以只存储地址并使用间接跳转(如果不要求位置独立性)。你也可以存储偏移量,但是你必须自己添加一个基。我如何强制一个接近标签的跳跃?我真的不在乎职位的依赖性。我只想能够跳转到标记的片段。存储每个段的地址以便查找的最简单方法是什么?要存储地址,请使用汇编程序支持的任何指令,例如
dq@@seg1
。至于强制近跳转,您可能会执行类似于
jmpnear@@seg1
的操作,不幸的是,编译器说它忽略了near指令。你介意给我一个如何存储地址然后跳转到它的例子吗?存储地址,我已经有了。跳跃就像
jmp[rax]
一样简单。