我尝试在程序集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)
代码无效,它跳转到错误的标签.
有人可以给我示例或修复我的代码吗?
小心一点
jmp cs:table[si]
Run Code Online (Sandbox Code Playgroud)
实际上是一个受损的版本
jmp cs:[table + si]
Run Code Online (Sandbox Code Playgroud)
它不是数组索引.
汇编语言没有类型,为避免混淆,请不要使用这种非正统的语法.
假设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
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)