【问题标题】:How can I use a jump table with the JMP instruction?如何在 JMP 指令中使用跳转表?
【发布时间】:2020-11-15 19:20:57
【问题描述】:

这是我的代码(我知道错了):

org 100h

sert dw 1 
 
mov si, 1
shl si, 1
lea ax,[si]   
 
jmp ax

1:
PRINTN "Number 1"
jmp end

2:
PRINTN "Number 2"
jmp end

3:
PRINTN "Number 3"
jmp end

4:
PRINTN "Number 4"
jmp end

end:


mov ah, 0 
int 16h
ret 

【问题讨论】:

  • 另一个与您的问题无关的观察结果。不要像使用 sert dw 1 那样将数据放在代码路径中。处理器将尝试将该值0001h 作为代码执行。将数据放在处理器不会执行的地方(比如在代码之后)

标签: assembly conditional-statements x86-16 jump-table


【解决方案1】:

试试这样的:

        mov si, 1
        shl si, 1        ; adjust index for table entry size
        jmp [table+si]   ; branch to the destination found in the table

l1:     PRINTN "Number 1"
        jmp end

l2:     PRINTN "Number 2"
        jmp end

l3:     PRINTN "Number 3"
        jmp end

l4:     PRINTN "Number 4"
        jmp end

end:    ...

        ; jump table
        ; place this outside of your control flow
table   dw l1, l2, l3, l4

【讨论】:

  • 在单词边界上对齐跳转表很有用。在 NASM 源代码中,您必须将“align 2”放入“table”标签之前的一行。
  • @YahelAvraham 确保通过单击复选标记图标将答案标记为已接受。这会告诉其他人您的问题已得到解决。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多