我正在为英特尔X64写作。 RAX保持0到15之间的值。我希望执行跳转到相应的标签,如图所示。
lea r11, [rip+@@table]
shl rax, 1 // multiply by 2 for offset
add r11, rax
jmp r11 // jmp into the table below then jmp again
@@table:
jmp @@0
jmp @@1
jmp @@2
jmp @@3
jmp @@4
jmp @@5
jmp @@6
jmp @@7
jmp @@8
jmp @@9
jmp @@10
jmp @@11
jmp @@12
jmp @@13
jmp @@14
jmp @@15
@@0:
mov eax, 100
jmp @@ret
@@1:
mov eax, -10
jmp @@ret
...
如果RAX为0,则此工作正常。如果@@ 1处的-10更改为10,则它也适用于此。这意味着编译器违反了整个@@ table:jmp序列。
我已经关闭了优化,但这并没有帮助。显然,我并没有以正确的方式做到这一点。
如何阻止编译器优化jmp' s。或者,或者,还有另一种方法吗?