我尝试在程序集 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 开始。那么
SI = 1
跳转到的偏移量为 1000h + 1 = 1001h。
该位置的 WORD 占据 1001h 和 1002h,因此它跨越了 C1 和 C2。
直接使用索引访问数组是汇编中没有的舒适,我们需要根据项目的大小来缩放索引。
在这种情况下,每个项目都是一个 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/