当前位置: 代码迷 >> 汇编语言 >> 跳转表AL为何需要左移1位解决方案
  详细解决方案

跳转表AL为何需要左移1位解决方案

热度:6018   发布时间:2013-02-26 00:00:00.0
跳转表AL为何需要左移1位
根据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在表中的偏移
  相关解决方案