首页 > 解决方案 > 拼装跳远表演

问题描述

在汇编中,我有一个带有大约 2000 个 JUMP 点(标签)的 JUMP 表,每个标签都有大约 20-30 行汇编指令......所以是的......它是一个很大的(开关),有大量的源代码...... 。 例如:

.TABLE:
     DD .case0
     DD .case1
     DD .case2
     DD .case3
     DD .case4
     ...
     ...
     ...
     DD .case2000

每个案例都有一些这样的代码(每个案例大约有20-30行指令)

.case0:
    push   ...
    mov    ...
    push   ...
    mov    ...
    push   ...
    mov    ...
    ...

    jmp    [4 * eax + .TABLE]  ;; it's may be the 'case1000' (eax is our case)

.case1:
    push   ...
    mov    ...
    push   ...
    mov    ...
    push   ...
    mov    ...
    ...

    jmp    [4 * eax + .TABLE]  ;; it's may be the 'case1000' (eax is our case)

.case2:
    push   ...
    mov    ...
    push   ...
    mov    ...
    push   ...
    mov    ...
    ...

    jmp    [4 * eax + .TABLE]  ;; it's may be the 'case1000' (eax is our case)
...
...
...

我可能需要跳到每个标签大约 10 次,一会儿我可能在case2,下一次我可能在case1020(跳远)

现在我关于这个 Jumps 的问题......例如,如果我想从 to 跳转case2case1020是否有任何性能问题或者这个跳远与例如 'case0' 到 'case100' 完全一样?

我的观点:jmp即使我们跳过 150Kb 指令,只要改变索引就可以了(跳转不到 127 字节的性能没有差异)......真的吗?

我也知道我们有短跳转,近跳转和远跳转......但我认为短跳转只是指令代码大小(127),跳转127字节或跳转100000000字节之间的性能没有差异......

是真的吗?

标签: assemblyx86

解决方案


推荐阅读