大虾帮我看看程序

hi_dnager 2008-11-26 12:31:06
一个分支程序 跳转表的地方有问题 我是新手 大虾救命~~~
;************************************************************************************************
DATA SEGMENT
;定义数据段
MSG1 DB '***WELCOME to 分支 by CCenter!***','$' ;定义输出的第一个字符串信息
MSG2 DB 'enter 1 to 9:','$' ;定义输出的字符串信息:选择菜单
MSG3 DB 'please choose:','$' ;定义输出的字符串信息:选择前缀

MSG4 DB 'Hello!','$' ;定义输出的字符串信息:分支1的信息
msg5 DB 'AAA','$' ;定义输出的字符串信息:分支2的信息
MSG6 DB 'BBB','$' ;定义输出的字符串信息:分支3的信息
MSG7 DB 'CCC','$' ;定义输出的字符串信息:分支4的信息
MSG8 DB 'DDD','$' ;定义输出的字符串信息:分支5的信息
MSG9 DB 'EEE','$' ;定义输出的字符串信息:分支6的信息
MSG10 DB 'FFF','$' ;定义输出的字符串信息:分支7的信息
MSG11 DB 'GGG','$' ;定义输出的字符串信息:分支8的信息
MSG12 DB 'FFF','$' ;定义输出的字符串信息:分支9的信息
ERRMSG DB 'CHOOSE ERROR! ','$' ;定义输出的字符串信息:选择错误息

TABLE dw one
dw two
dw three
dw four
dw five
dw six
dw seven
dw eight
dw nine
DATA ENDS
;************************************************************************************************
CODE SEGMENT ;代码段
main proc far
ASSUME CS:CODE ,DS:DATA

START:

MOV AX,DATA
MOV DS,AX

LEA BX,TABLE

CALL ENTER ;调用显示回车换行子程序
LEA DX,MSG1
CALL DISPCHS ;调用显示字符串子程序
CALL ENTER
CALL ENTER

LEA DX,MSG2
CALL DISPCHS

AGAIN: ;定义用于选择错误循环
CALL ENTER

LEA DX,MSG3
CALL DISPCHS ;调用显示字符串子程序

MOV AH,01H
INT 21H
CMP AL,'1' ;输入的字符和1相比较
JE WORD  PTR[bx] ;如果相等,转移到one标号
CMP AL,'2'
;输入的字符和2相比较
JE WORD PTR[bx+2] ;如果相等,转移到two标号
CMP AL,'3' ;输入的字符和3相比较

JE WORD PTR[bx+4] ;如果相等,转移到three标号
CMP AL,'4' ;输入的字符和4相比较

JE WORD PTR[bx+6] ;如果相等,转移到four标号
CMP AL,'5' ;输入的字符和5相比较

JE WORD PTR[bx+8] ;如果相等,转移到five标号
CMP AL,'6' ;输入的字符和6相比较

JE WORD PTR[bx+10] ;如果相等,转移到six标号
CMP AL,'7' ;输入的字符和7相比较

JE WORD PTR[bx+12] ;如果相等,转移到seven标号
CMP AL,'8' ;输入的字符和8相比较

JE WORD PTR[bx+14] ;如果相等,转移到eight标号
CMP AL,'9' ;输入的字符和9相比较

JE WORD PTR[bx+16] ;如果相等,转移到nine标号
JMP ERROR ;否则就无条件转移到ERROR标号

EXIT:
MOV AH,4CH
INT 21H


one:
CALL ENTER
LEA DX,MSG4 ;输出1字符串的偏移地址
CALL DISPCHS
CALL ENTER
JMP AGAIN
two:
CALL ENTER
LEA DX,MSG5
CALL DISPCHS ;调用显示字符串子程序
CALL ENTER
JMP AGAIN
three:
CALL ENTER
LEA DX,MSG6
CALL DISPCHS ;调用显示字符串子程序
CALL ENTER
JMP AGAIN
four:
CALL ENTER
LEA DX,MSG7
CALL DISPCHS ;调用显示字符串子程序
CALL ENTER
JMP AGAIN
five:
CALL ENTER
LEA DX,MSG8
CALL DISPCHS ;调用显示字符串子程序
CALL ENTER
JMP AGAIN
six:
CALL ENTER
LEA DX,MSG9
CALL DISPCHS ;调用显示字符串子程序
CALL ENTER
JMP AGAIN
seven:
CALL ENTER
LEA DX,MSG10
CALL DISPCHS ;调用显示字符串子程序
CALL ENTER
JMP AGAIN
eight:
CALL ENTER
LEA DX,MSG11
CALL DISPCHS ;调用显示字符串子程序
CALL ENTER
JMP AGAIN
nine:
CALL ENTER
LEA DX,MSG12
CALL DISPCHS ;调用显示字符串子程序
CALL ENTER
JMP AGAIN

ERROR:
CALL ENTER
LEA DX,ERRMSG ;输出选择错误信息
CALL DISPCHS ;调用显示字符串子程序
MOV DL,07H ;输出ASCII码的报警(响铃)控制符BEL(07H)
CALL DISPCH ;调用显示单个字符子程序
CALL ENTER
JMP EXIT

MAIN ENDP

DISPCH PROC NEAR ;显示单个字符子程序
MOV AH,02H
INT 21H
RET ;返回
DISPCH ENDP

ENTER PROC NEAR ;显示回车换行子程序
MOV DL,0DH
CALL DISPCH
MOV DL,0AH
CALL DISPCH ;调用显示单个字符子程序
RET ;返回
ENTER ENDP

DISPCHS PROC NEAR ;显示字符串子程序
MOV AH,09H ;9号功能调用:显示字符串
INT 21H ;完成输出显示
RET
DISPCHS ENDP

CODE ENDS
;************************************************************************************************
END START

...全文
112 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hi_dnager 2008-12-04
  • 打赏
  • 举报
回复
自己搞定啦 哈哈o(∩_∩)o...

;BY JUN
;************************************************************************************************
DATA SEGMENT
MSG DB 'please choose(1~9):','$' ;定义输出的字符串信息:选择前缀
CH1 DB 0DH,0AH,'Hello!',0DH,0AH,'$' ;定义输出的字符串信息:分支1的信息
CH2 DB 0DH,0AH,'Wang Linfang',0DH,0AH,'$' ;定义输出的字符串信息:分支2的信息
CH3 DB 0DH,0AH,'is',0DH,0AH,'$' ;定义输出的字符串信息:分支3的信息
CH4 DB 0DH,0AH,'a',0DH,0AH,'$' ;定义输出的字符串信息:分支4的信息
CH5 DB 0DH,0AH,'cute',0DH,0AH,'$' ;定义输出的字符串信息:分支5的信息
CH6 DB 0DH,0AH,'pig',0DH,0AH,'$' ;定义输出的字符串信息:分支6的信息
CH7 DB 0DH,0AH,'Wan Jun',0DH,0AH,'$' ;定义输出的字符串信息:分支7的信息
CH8 DB 0DH,0AH,'is',0DH,0AH,'$' ;定义输出的字符串信息:分支8的信息
CH9 DB 0DH,0AH,'a goodman',0DH,0AH,'$' ;定义输出的字符串信息:分支9的信息
ERRMSG DB 0DH,0AH,'CHOOSE ERROR! ',0DH,0AH,'$' ;定义输出的字符串信息:选择错误息
TABLE dw one
dw two
dw three
dw four
dw five
dw six
dw seven
dw eight
dw nine
DATA ENDS
;************************************************************************************************
CODE SEGMENT ;定义代码段
main proc far
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA bx,TABLE

AGAIN:
LEA DX,MSG
CALL DISPCHS ;调用显示字符串子程序

MOV AH,01H
INT 21H
CMP AL,'1' ;输入的字符和1相比较
JB ERROR
CMP AL,'9' ;输入的字符和9相比较
JA ERROR
SUB AL,31H ;转数值
add AL,AL
mov AH,0H
MOV DI, AX
JMP [BX+DI]
ERROR:
LEA DX,ERRMSG ;输出选择错误信息
CALL DISPCHS ;调用显示字符串子程序
JMP EXIT

EXIT:
MOV AH,4CH ;4C号功能调用:终止当前程序并返回调用程序
INT 21H ;返回DOS

one:
LEA DX,CH1 ;输出1字符串的偏移地址
CALL DISPCHS
JMP AGAIN
two:
LEA DX,CH2
CALL DISPCHS
JMP AGAIN
three:
LEA DX,CH3
CALL DISPCHS
JMP AGAIN
four:
LEA DX,CH4
CALL DISPCHS
JMP AGAIN
five:
LEA DX,CH5
CALL DISPCHS
JMP AGAIN
six:
LEA DX,CH6
CALL DISPCHS
JMP AGAIN
seven:
LEA DX,CH7
CALL DISPCHS
JMP AGAIN
eight:
LEA DX,CH8
CALL DISPCHS
JMP AGAIN
nine:
LEA DX,CH9
CALL DISPCHS
JMP AGAIN
MAIN ENDP

DISPCHS PROC NEAR ;显示字符串子程序
MOV AH,09H ;9号功能调用:显示字符串
INT 21H ;完成输出显示
RET
DISPCHS ENDP

CODE ENDS
;************************************************************************************************
END START

wangkeyunanjing 2008-11-29
  • 打赏
  • 举报
回复
顶一个,我看花了,也没看出来
hi_dnager 2008-11-28
  • 打赏
  • 举报
回复
mov dx,offset msg;貌似错了~~
谢谢了
可否分析一下 我那个程序是什么错误呢
BAYNPU 2008-11-26
  • 打赏
  • 举报
回复
disp1: mov dx,offset msg1
jmp start2
...
disp8: mov dx,offset msg12 ;这个DISP8应改DISP12才对
jmp start2
end
BAYNPU 2008-11-26
  • 打赏
  • 举报
回复
这个程序应该这样编写比较简单些:
.model small
.stack
.data
MSG1 DB '***WELCOME to 分支 by CCenter!***','$'
MSG2 DB 'enter 1 to 9:','$' ;定义输出的字符串信息:选择菜单
MSG3 DB 'please choose:','$' ;定义输出的字符串信息:选择前缀
MSG4 DB 'Hello!','$' ;定义输出的字符串信息:分支1的信息
msg5 DB 'AAA','$' ;定义输出的字符串信息:分支2的信息
MSG6 DB 'BBB','$' ;定义输出的字符串信息:分支3的信息
MSG7 DB 'CCC','$' ;定义输出的字符串信息:分支4的信息
MSG8 DB 'DDD','$' ;定义输出的字符串信息:分支5的信息
MSG9 DB 'EEE','$' ;定义输出的字符串信息:分支6的信息
MSG10 DB 'FFF','$' ;定义输出的字符串信息:分支7的信息
MSG11 DB 'GGG','$' ;定义输出的字符串信息:分支8的信息
MSG12 DB 'FFF','$' ;定义输出的字符串信息:分支9的信息
MSG DB 'CHOOSE ERROR! ','$' ;定义输出的字符串信息:选择错误息

table dw disp1,disp2,disp3,disp4,disp5,disp6,disp7,disp8,disp9,disp10,disp11,disp12
;取得各个标号的偏移地址
.code
.startup
start1: mov dx,offset msg ;提示输入数字
mov ah,9
int 21h
mov ah,1 ;等待按键
int 21h
cmp al,’1’ ;数字 < 1?
jb start1
cmp al,’12’ ;数字 > 12?
ja start1
and ax,000fh ;将ASCII码转换成数字
dec ax
shl ax,1 ;等较于add ax,ax
mov bx,ax
jmp table[bx] ;(段内)间接转移:IP←[table+bx]
start2: mov ah,9
int 21h
.exit 0
int 21h
;
disp1: mov dx,offset msg1
jmp start2
...
disp8: mov dx,offset msg12
jmp start2
end

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧