解释 一下 汇编 程序

.model tiny
.code
.startup
mov ah,9h
mov dx,offset mesaa
int 21h
start1:
mov ah,01h
int 21h
cmp al,'1'
jb start1
cmp al,'8'
ja start1
and ax,000fh
dec ax
shl ax,1
mov bx,ax
jmp table[bx]
start2:
mov ah,9
int 21h
.exit 0
mes db 'Input a number (1~8) ',0dh,0ah,'$'
disp1:
mov dx,offset mes1
jmp start2
disp2:
mov dx,offset mes2
jmp start2
disp3 :
mov dx,offset mes3
jmp start2
disp4:
mov dx,offset mes4
jmp start2
disp5:
mov dx,offset mes5
jmp start2
disp6:
mov dx,offset mes6
jmp start2
disp7:
mov dx,offset mes7
jmp start2
disp8:
mov dx,offset mes8
jmp start2
mes1 db 0dh,0ah, 'chapter 1!',0dh,0ah,'$'
mes2 db 'chapter 2!',0dh,0ah,'$'
mes3 db 'chapter 3!',0dh,0ah,'$'
mes4 db 'chapter 4!',0dh,0ah,'$'
mes5 db 'chapter 5!',0dh,0ah,'$'
mes6 db 'chapter 6!',0dh,0ah,'$'
mes7 db 'chapter 7!',0dh,0ah,'$'
mes8 db 'chapter 8!',0dh,0ah,'$'
table dw disp1,disp2,disp3,disp4
dw disp5,disp6,disp7,disp8
end

关键是table的定义:disp1等在内存的状态是什么样的,怎么存储的,能这么用吗??一般都是dw后跟数据的啊……

jmp table[bx] 取得的操作数,如disp1,不是一个数据,而是一个转移地址。我的理解,寻址是两个过程,先是寄存器相对寻址取得操作数(disp1),然后disp1是存储器相对寻址方式找到相应语句。还可以采用其他存储器或寄存器寻址方式(书上说的,这是个例题),或改为Call table[bx],然后jmp start2改为RET
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-07-14
伪指令DB\W\D\DE...右边,可以跟以下内容:
·数据 数字或字符
·DUP
·表达式
·?
·变量 存储变量的地址:
DW时,取其偏移量存储;
DD时,偏移量存储于低位字,段值存储于高
位字。

(有一点比较遗憾,那就是我也才入门。)
我搜了一下,有人说标号最终会被解释成****H:****H的地址。并没有人敢说“标号名就是变量名”。可我认为它们本质是一样的。只不过它们处理的对象类型不同。
变量名不也是代表了一个内存地址么?像标号名代表了代码的地址一样。根据选择跳转到相应的代码。

仅供参考。

所以,依我的推断,TABLE存储了一张地址表。本回答被提问者采纳
第2个回答  2008-07-20
自己用debug的u命令 ,t命令研究一下吧!那样对你的效果或许会更好
相似回答