assembly - 8086 总成中的分支表

标签 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

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

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

最佳答案

小心点

jmp cs:table[si]

实际上是一个损坏的版本

jmp cs:[table + si]

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


假设 table 从 1000h 开始。那么

                             Table in memory at 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

这样

 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]

关于assembly - 8086 总成中的分支表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39611692/

相关文章:

c - 链接两个目标文件以生成一个二进制文件

assembly - 如何选择排序 - assembly 8086

algorithm - 将四进制转换为八进制。 ASM 8086

C++ 在 8086 中获取类/结构地址

c - 使用程序集中的 getchar 获取()函数

assembly - 64 位模式下的地址覆盖前缀

macos - 用户输入和输出在我的汇编代码中不起作用

assembly - AT&T 语法中 (%eax) 的含义?

assembly - Homoiconic和 “unrestricted”自修改代码+ Lisp真的是自修改的吗?

assembly - 如何在 nasm 中启用 a20?