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