. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验16中为什么要add bx,bx呢?好多天了没解答,才发的第二贴。  [待解决] 回复[ 3次 ]   点击[ 463次 ]  
yc2010
[帖 主]   [ 发表时间:2010-09-08 21:21 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-03-03 23:27
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 
------------------------------------------------ 
我的理解是:table[bx]是内存单元(表示的是字节),而dw定义的table中调用sub1,sub2,sub3,sub4, 
这4个子程序是字,1个字=2个字节,所以要add bx,bx   ,是不是这样理解的?
------------------------------------------------
mov bl,ah   
mov bh,0   
add bx,bx   ----------->这里为什么要bx*2  2个问题 
call word ptr table[bx]   
----------------------------------  
ah是8位寄存器(字节),用来传送子程序编号。  
bx是16位寄存器(字),已经是word了,为什么还要add bx,bx呢? 
还有就是add bx,bx的话,那不就是dd(双字)了吗? 
2个问题怎么就是没个人能解答下。
masmaster
[第1楼]   [ 回复时间:2010-09-10 21:24 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
sub1,sub2,sub3,sub4,他们对应的地址:
XXXX:0000
XXXX:0002
XXXX:0004
XXXX:0006
见指令:
  cmp ah,3          ;入口参数和3比较  
        ja sret     ;如果大于3,
        mov bl,ah   ;否则, 将入口的ah送至bl
        mov bh,0    ;清除高8位
        add bx,bx   ;如果bx=0,选的是sub1,入口地址即:XXXX:0000,如果bx=1,那么入口地址:xxxx:0002,如果没有这一步,那么入口地址就变成了XXXX:0001,这个地址是错误的,因为sub的地址是16位的两字节的。同理, 如果ah=3, 那么对应的就是sub4,XXXX:0006
        call word ptr table[bx] ;地址是用16位偏移表示的,不允许出现奇数。
masmaster
[第2楼]   [ 回复时间:2010-09-10 21:24 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
个人看法, 仅供参考。
yc2010
[第3楼]   [ 回复时间:2010-09-11 09:03 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-03-03 23:27
谢谢masmaster
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved