用变址寻址方式实现跳跃表法的程序如下:
branch_addresses segment
; 定义数据段
branch_table dw routine_1
dw routine_2
dw routine_3
dw routine_4
dw routine_5
dw routine_6
dw routine_7
dw routine_8
branch_addresses ends
procedure_select segment
; 定义代码段
main proc far ; 定义主程序main
assume cs:procedure_select,ds:branch_addresses
start:
push ds
sub bx,bx
push bx
mov bx,branch_addresses
mov ds,bx
; 程序的主要部分
cmp al,0 ; (al)=0?
je continue_main_line ; (al)为0则转到continue_main_line
mov si,0
l: shr al,1 ; 把al逻辑右移1位
jnb not_yet ; CF=0转到not_yet
jmp branch_table[si] ; CF=1转到相应程序分支
not_yet: add si,type branch_table ; 修改地址
jmp l ; 无条件跳到l
continue_main_line: ; 其它程序段
…
routine_1:
… ; 程序段1
routine_2:
… ; 程序段2
ret
main endp ; 主程序main结束
procedure_select ends
end start
用寄存器间接寻址方式实现跳跃表法的程序如下(仅给出修改后的程序的主要部分):
……
cmp al,0
je continue_main_line
lea bx,branch_table ; branch_table的偏移地址送bx
l: shr al,1
jnb not_yet ; CF=0转到not_yet
jmp word ptr[bx] ; CF=1转到相应程序分支
not_yet: add bx,type branch_table
; 修改地址
jmp l ; 无条件跳到l
continue_main_line:
……
用基址变址寻址方式实现跳跃表法的程序如下(仅给出修改后的程序的主要部分),与前两种寻址方式的主要区别是这里使用了逻辑左移指令,即从al的高位向低位判断,而前两段程序是从al的低位向高位判断。
……
cmp al,0
je continue_main_line
lea bx,branch_table
mov si,7*type branch_table ; 14送si
mov cx,8 ; 循环次数8送cx
l: shl al,1 ; 把al逻辑左移1位
jnb not_yet ; CF=0转到not_yet
jmp word ptr[bx][si] ; CF=1转到相应程序分支
not_yet: sub si,type branch_table ; 修改地址
loop l ; 循环
continue_main_line:
……
以上多个例子都是既有分支结构又有循环结构,实际上,多数程序都是各种程序结构的组合。而且,循环结构可以看作分支结构的一种特例,它只是多次走一个分支,只在满足循环结束条件时,走另一个分支罢了。