回 帖 发 新 帖 刷新版面

主题:各位高手帮忙看下程序,实在不知道为什么会这样子啊。。

写了一个程序,是用来制做表格的,在未来汇编里能运行,但双击生成的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

回复列表 (共1个回复)

沙发

这得去问bill.gates了。ntvdm是16位虚拟机,你的程序也是16位的;也许
是那个虚拟机有问题吧。
非用不可的话,在debug里G一下吧

我来回复

您尚未登录,请登录后再回复。点此登录或注册