Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 集合式跳远表演_Assembly_X86 - Fatal编程技术网

Assembly 集合式跳远表演

Assembly 集合式跳远表演,assembly,x86,Assembly,X86,在汇编中,我有一个包含大约2000个跳转点(标签)的跳转表,每个标签有大约20-30行汇编指令。。。所以是的。。。这是一个有大量源代码的大开关。。。例如: .TABLE: DD .case0 DD .case1 DD .case2 DD .case3 DD .case4 ... ... ... DD .case2000 每个案例都有这样的代码(每个案例有大约20-30行指令) 我可能需要跳转到每个标签大约

在汇编中,我有一个包含大约2000个跳转点(标签)的跳转表,每个标签有大约20-30行汇编指令。。。所以是的。。。这是一个有大量源代码的大开关。。。例如:

.TABLE:
     DD .case0
     DD .case1
     DD .case2
     DD .case3
     DD .case4
     ...
     ...
     ...
     DD .case2000
每个案例都有这样的代码(每个案例有大约20-30行指令)

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

现在我的问题是。。。例如,如果我想从
case2
跳到
case1020
,是否有 性能问题或此跳远与例如“case0”到“case100”完全相同

我的意见是:
jmp
只要改变索引就行了,不管(在性能上没有差别,跳转小于127字节),即使我们跳转超过150Kb的指令。。。是吗

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


这是真的吗?

跳转指令的性能(或者更准确地说,延迟)主要取决于跳转到的位置以及跳转表的缓存情况。通常,没有必要担心这个。在这种情况下,所有案例都不相关,它可能会跳转到case0,从case0跳转到case2000!!!所以我们不能说任何关于案例位置的问题。有些案例比其他案例更常见吗?这里有一些关于这类代码的相关优化提示:我开始写一个答案,但我要写的大部分内容都在@Ross链接的答案中。缺少的一件事是TLB的影响。当然,页面内的跳转将命中TLB,而跳转到另一个页面可能会丢失,从而引入额外的延迟。
.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)
...
...
...