程序集8086中的分支表

Yai*_* B. 2 assembly x86-16

我尝试在程序集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
Run Code Online (Sandbox Code Playgroud)

代码无效,它跳转到错误的标签.

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

Mar*_*oom 9

小心一点

jmp cs:table[si]
Run Code Online (Sandbox Code Playgroud)

实际上是一个受损的版本

jmp cs:[table + si]
Run Code Online (Sandbox Code Playgroud)

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


假设table从1000h开始.然后

                               表在内存中1000h

SI = 1偏移跳转到在1000H + 1 = 1001H取.
该位置的WORD占据1001h和1002h,因此它穿过C1C2.

直接使用索引访问数组是装配中不可用的一种方法,我们需要根据项目的大小来扩展索引.
在这种情况下,每个项目都是WORD,2个字节,因此索引必须缩放2.

Index    Scaled index    Address accessed
 0            0             1000h
 1            2             1002h
 2            4             1004h
Run Code Online (Sandbox Code Playgroud)

从而

 mov si, 1
 shl si, 1         ;Scale index, SI = SI*2^1 = SI*2
 jmp cs:table[si]
Run Code Online (Sandbox Code Playgroud)

或更好,如果索引在"编译时"已知

 mov si, 2         ;Use scaled index directly
 jmp cs:table[si]
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案和图形的+1! (2认同)