在Lazarus(Free Pascal)ASM中写一个双跳(无表)

时间:2015-10-02 13:49:40

标签: assembly 64-bit freepascal lazarus

我正在为英特尔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。或者,或者,还有另一种方法吗?

0 个答案:

没有答案