主题:各位高手帮忙看下程序,实在不知道为什么会这样子啊。。
写了一个程序,是用来制做表格的,在未来汇编里能运行,但双击生成的EXE文件后出现问题,说是ntvdm.exe遇到问题需要关闭。为什么啊???
过两天就要交这个EXE文档了,高手来帮忙看看啊。。。。。。
.model small
.data
MODE DB ?
TABLE DB 0,0DAH,0C0H,0C4H,0B3H,0C3H,0B4H,0C5H,0C1H,0C2H,0BFH,0D9H ;设置数组保存制表符,便于查找
colour DB 02h,10 dup(?),04h,4 dup(?),07h,?,0eh
menu db 22 dup(?),0b3h,57 dup(?)
db " ",0dah,16 dup(0c4h),0bfh,?,?,0b3h, 57 DUP(?) ;菜单数组
db " ",0b3h," MENU ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -1- '",0dah,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -2- '",0C0h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -3- '",0C4h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -4- '",0B3h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -5- '",0C3h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -6- '",0B4h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -7- '",0C5h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -8- '",0C1h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -9- '",0C2h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -A- '",0BFh,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -B- '",0D9h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -C- CLEAR ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0B3H," -0- QUIT ",0B3H,?,?,0b3h, 57 DUP(?)
DB " ",0B3H," COLOUR ",0B3H,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -R- Red ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -W- WHITE ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -G- GREEN ",0b3h,?,?,0b3h,57 DUP(?)
db " ",0b3h," -Y- YELLOW ",0b3h,?,?,0b3h, 57 DUP(?)
DB " ",0C0H,16 DUP(0C4H),0D9H,?,?,0b3h, 57 DUP(?),22 DUP(?),0B3H,57 DUP(?)
db 22 dup(0c4h),0c1h,57 dup(0c4h)
db 16 dup(?),"Copyright @ 2006 LIXIANG N0.05372060"
Count EQU $-MENU ;用COUNT记录菜单数组中字节个数
.code
;清屏,并初始化界面,给出菜单 将MENU及COUNT保存在SI,CX里面,来传递参数
.286
vmenu proc near
PUSHA
MOV AX,0600H ;用10H号中断的6号功能清屏
MOV BH,0
INT 10H
MOV AX,0003H
INT 10H
MOV AX, 0B800H
MOV ES, AX ;彩色显示器的显示缓冲区段地址
MOV AH, 07H ;设置显示属性,即显示颜色
next:
LODSB ;取显示字符
STOSW ;向显示缓冲区设置显示字符和属性
loop next
MOV DH,00H ;初始化光标位置(0行,24列)
MOV DL,23
MOV AH,02H
MOV BH,00H
INT 10H
POPA
RET
vmenu endp
;MOVE子程序为根据键盘按键的扫描码进行光标的上下左右的移动
move proc near
PUSHA
CMP AH,48H
JE UP
CMP AH,50H
JE DOWN
CMP AH,4BH
JE LEFT
CMP AH,4DH
JE RIGHT
UP: ;上移一行
CMP DH,0
JE CASE1
DEC DH
CASE1:
JMP ALL
DOWN: ;下移一行
CMP DH,22
JE CASE2
INC DH
CASE2:
JMP ALL
RIGHT: ;右移一列
CMP DL,79
JE CASE3
INC DL
CASE3:
JMP ALL
LEFT: ;左移一列
CMP DL,23
JE ALL
DEC DL
ALL:
MOV AH,02H ;根据当前的DH和DL来设定光标位置
MOV BH,0
INT 10H
POPA
RET
move endp
.startup ;主程序段
MOV AH,0FH ;保存当前显示模式
INT 10H
MOV MODE,AL
START:
LEA SI,MENU ;将MENU的偏移量给SI,将COUNT给CX,从而给子程序VMENU传递参数
MOV CX,COUNT
CALL VMENU
AGAIN:
MOV AH,03H ;读取当前光标位置
MOV BH,0
INT 10H
MOV AH,00H ;读取键盘的输入
INT 16H
CMP AL,00 ;比较AL是字符还是主位控制键。若是正常字符则跳至GOON处,进行相应处理
JNE GOON
CALL move ;键盘输入为方位键,调用MOVE,以AH为参数,进行光标移动
JMP AGAIN ;跳至AGAIN处,继续读键盘的输入
GOON:
CMP AL,'C' ;若键盘输入为 'C',则跳至START处,清屏,并初始化界面
JE START
CMP AL,'0' ;若键盘输入为 0 ,则跳至结束
JE OVER
SUB AL,30H ;输入为正常字符,将ASCII转化为实际的字符
CMP AL,0AH
JB CASE
SUB AL,7
CMP AL,0AH ;输入的字符不是数字键且ASCII小于3A,为无用字符,跳至AGAIN处继续读键盘的输入
JB AGAIN
CASE:
MOV AH,00
MOV SI,AX
CMP SI,0CH
Jb GOON1 ;输入的字符ASCII大于3C,是无用字符
sub ax,16
mov bx,ax
mov bl,colour[bx]
JMP AGAIN
GOON1:
MOV AL,TABLE[SI] ;有用字符,通过TABLE找到相应的制表符输出
MOV AH,09H
MOV BH,0
MOV CX,1
INT 10H
JMP AGAIN
OVER: ;画图结束
MOV AL,MODE
MOV AH,00H ;恢复到刚开始时的显示模式
INT 10H
.exit 0
end
过两天就要交这个EXE文档了,高手来帮忙看看啊。。。。。。
.model small
.data
MODE DB ?
TABLE DB 0,0DAH,0C0H,0C4H,0B3H,0C3H,0B4H,0C5H,0C1H,0C2H,0BFH,0D9H ;设置数组保存制表符,便于查找
colour DB 02h,10 dup(?),04h,4 dup(?),07h,?,0eh
menu db 22 dup(?),0b3h,57 dup(?)
db " ",0dah,16 dup(0c4h),0bfh,?,?,0b3h, 57 DUP(?) ;菜单数组
db " ",0b3h," MENU ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -1- '",0dah,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -2- '",0C0h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -3- '",0C4h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -4- '",0B3h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -5- '",0C3h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -6- '",0B4h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -7- '",0C5h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -8- '",0C1h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -9- '",0C2h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -A- '",0BFh,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -B- '",0D9h,"' ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -C- CLEAR ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0B3H," -0- QUIT ",0B3H,?,?,0b3h, 57 DUP(?)
DB " ",0B3H," COLOUR ",0B3H,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -R- Red ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -W- WHITE ",0b3h,?,?,0b3h, 57 DUP(?)
db " ",0b3h," -G- GREEN ",0b3h,?,?,0b3h,57 DUP(?)
db " ",0b3h," -Y- YELLOW ",0b3h,?,?,0b3h, 57 DUP(?)
DB " ",0C0H,16 DUP(0C4H),0D9H,?,?,0b3h, 57 DUP(?),22 DUP(?),0B3H,57 DUP(?)
db 22 dup(0c4h),0c1h,57 dup(0c4h)
db 16 dup(?),"Copyright @ 2006 LIXIANG N0.05372060"
Count EQU $-MENU ;用COUNT记录菜单数组中字节个数
.code
;清屏,并初始化界面,给出菜单 将MENU及COUNT保存在SI,CX里面,来传递参数
.286
vmenu proc near
PUSHA
MOV AX,0600H ;用10H号中断的6号功能清屏
MOV BH,0
INT 10H
MOV AX,0003H
INT 10H
MOV AX, 0B800H
MOV ES, AX ;彩色显示器的显示缓冲区段地址
MOV AH, 07H ;设置显示属性,即显示颜色
next:
LODSB ;取显示字符
STOSW ;向显示缓冲区设置显示字符和属性
loop next
MOV DH,00H ;初始化光标位置(0行,24列)
MOV DL,23
MOV AH,02H
MOV BH,00H
INT 10H
POPA
RET
vmenu endp
;MOVE子程序为根据键盘按键的扫描码进行光标的上下左右的移动
move proc near
PUSHA
CMP AH,48H
JE UP
CMP AH,50H
JE DOWN
CMP AH,4BH
JE LEFT
CMP AH,4DH
JE RIGHT
UP: ;上移一行
CMP DH,0
JE CASE1
DEC DH
CASE1:
JMP ALL
DOWN: ;下移一行
CMP DH,22
JE CASE2
INC DH
CASE2:
JMP ALL
RIGHT: ;右移一列
CMP DL,79
JE CASE3
INC DL
CASE3:
JMP ALL
LEFT: ;左移一列
CMP DL,23
JE ALL
DEC DL
ALL:
MOV AH,02H ;根据当前的DH和DL来设定光标位置
MOV BH,0
INT 10H
POPA
RET
move endp
.startup ;主程序段
MOV AH,0FH ;保存当前显示模式
INT 10H
MOV MODE,AL
START:
LEA SI,MENU ;将MENU的偏移量给SI,将COUNT给CX,从而给子程序VMENU传递参数
MOV CX,COUNT
CALL VMENU
AGAIN:
MOV AH,03H ;读取当前光标位置
MOV BH,0
INT 10H
MOV AH,00H ;读取键盘的输入
INT 16H
CMP AL,00 ;比较AL是字符还是主位控制键。若是正常字符则跳至GOON处,进行相应处理
JNE GOON
CALL move ;键盘输入为方位键,调用MOVE,以AH为参数,进行光标移动
JMP AGAIN ;跳至AGAIN处,继续读键盘的输入
GOON:
CMP AL,'C' ;若键盘输入为 'C',则跳至START处,清屏,并初始化界面
JE START
CMP AL,'0' ;若键盘输入为 0 ,则跳至结束
JE OVER
SUB AL,30H ;输入为正常字符,将ASCII转化为实际的字符
CMP AL,0AH
JB CASE
SUB AL,7
CMP AL,0AH ;输入的字符不是数字键且ASCII小于3A,为无用字符,跳至AGAIN处继续读键盘的输入
JB AGAIN
CASE:
MOV AH,00
MOV SI,AX
CMP SI,0CH
Jb GOON1 ;输入的字符ASCII大于3C,是无用字符
sub ax,16
mov bx,ax
mov bl,colour[bx]
JMP AGAIN
GOON1:
MOV AL,TABLE[SI] ;有用字符,通过TABLE找到相应的制表符输出
MOV AH,09H
MOV BH,0
MOV CX,1
INT 10H
JMP AGAIN
OVER: ;画图结束
MOV AL,MODE
MOV AH,00H ;恢复到刚开始时的显示模式
INT 10H
.exit 0
end