根据AL(1<=AL<=8)中的值,跳转到相应的标号(SUB1,SUB2,...,SUB8)处执行各自的过程
- Assembly code
数据段TABLE DW SUB1 DW SUB2 DW SUB3 ... DW SUB8代码段DEC AL SHL AL,1MOV AH,0MOV SI,AXLEA BX,TABLEJMP WORD PTR[BX+SI]SUB1:... ...SUB2:... ...SUB8:...
===============================
请教DEC AL 当AL=1时为何这里自减1,为何还要再执行左移1位SHL AL,1
------解决方案--------------------------------------------------------
JMP WORD PTR,
WORD是两字节啊,所以地址索引乘2,SHL
减一就猜不到了,你这程序没头没尾的,全靠猜
------解决方案--------------------------------------------------------
先看table地址表:(假设)
xxxx:0000 sub1
xxxx:0002 sub2
xxxx:0004 sub3
xxxx:0006 sub4
xxxx:0008 sub5
xxxx:000a sub6
xxxx:000c sub7
xxxx:000e sub8
当al=1时
dec al;al=0
shl al,1;al=0
对应sub1地址
。。。
。。。
当al=8时
dec al ;al=7
shl al,1;al=14(0eh)
对应sub8的地址
所以, 只有先dec,再shl,才可找到相应的地址
------解决方案--------------------------------------------------------
shl = *2
------解决方案--------------------------------------------------------
因为一个sub在表中占2个字节,所以把号码乘2得到sub在表中的偏移