我尝试在程序集8086中创建一个分支表。

我写的:

    org 100h

    ; START THE PROGRAM

    mov si, 1
    jmp cs:table[si]

    table dw C1, C2, C3

C1:
    add bx, 1
    jmp EXIT

C2:
    add bx, 2
    jmp EXIT

C3:
    add bx, 3
    jmp EXIT
C4:
    add bx, 4
    jmp EXIT

; EXIT PRORGRAM
EXIT:
    mov ah, 0
    int 16h
    ret


代码不起作用,它跳到了错误的标签。

有人可以给我示例或修复我的代码吗?

最佳答案

小心一点

jmp cs:table[si]


其实是

jmp cs:[table + si]


它不是数组索引。
汇编语言没有类型,为避免混淆,请不要使用这种非正统的语法。



假设table从1000h开始。然后

assembly - 组件8086中的分支表-LMLPHP

使用SI = 1时,要跳转到的偏移量为1000h + 1 = 1001h。
该位置的WORD占用1001h和1002h,因此它越过C1和C2。

直接使用索引访问数组是装配中无法提供的便利,我们需要根据项目的大小来缩放索引。
在这种情况下,每个项目都是2字节的WORD,因此索引必须按2缩放。

Index    Scaled index    Address accessed
 0            0             1000h
 1            2             1002h
 2            4             1004h


从而

 mov si, 1
 shl si, 1         ;Scale index, SI = SI*2^1 = SI*2
 jmp cs:table[si]


或更好,如果在“编译时”知道索引

 mov si, 2         ;Use scaled index directly
 jmp cs:table[si]

09-05 03:53