王爽 汇编语言

table: dw sub1,sub2,sub3,sub4

set: push ax

push bx

cmp ah,3

ja sret

mov bl,ah

mov bh,0

add bx,bx ----------->这里为什么要bx*2

call word ptr table[bx]

sret: pop bx

pop ax

ret
------------------------------------------------
ah是8位寄存器(字节),用来传送子程序编号。
bx是16位寄存器(字),已经是word了,为什么还要add bx,bx呢?
还有就是add bx,bx的话,那不就是dd(双字)了吗?
2个问题怎么就是没个人能解答下。
--------------------------------------------------------------------
我的理解是:table[bx]是内存单元(表示的是字节),而dw定义的table中调用sub1,sub2,sub3,sub4,
这4个子程序是字,1个字=2个字节,所以要add bx,bx ,是不是这样理解的?
谁能解释下?

1.table有4个表目,每个指向一个子程序的偏移地址
2.ah是8位寄存器(字节),用来传送子程序编号,对头
3.add bx,bx是为了由子程序编号得到存放对应子程序的偏移地址的表目的偏移地址(有点拗口),可替换为shl bx,1
4.add bx,bx怎么会得双字,顶多就17位,就是说可能溢出
5.table[bx]是内存单元,对,寄存器相对寻址。他的宽度,要看环境。如另外一个操作数或者word ptr table[bx]

多加分,少匿名,会有很多人答!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-09-09
你的理解是正确的,table[bx]是内存单元,但sub1等是字,要占两个字节,所以ah判断出是第几个自称序后,给bl,然后bh为零,此时,bx里也只是ah的值,比如说ah=1,此时bl=1,bh=0,bx=1;你这里理解有问题。bx里是第几个子程序,[bx]就表示字节,所以要乘2,才能在table中找到相应的子程序。
相似回答