当前位置: 代码迷 >> 汇编语言 >> CPU无效指令 帮小弟我看看错哪了
  详细解决方案

CPU无效指令 帮小弟我看看错哪了

热度:962   发布时间:2016-05-02 05:08:43.0
求助 CPU无效指令 帮我看看哪里错了
题目:设计一个程序完成如下功能: 
? 初始状态下假设一个字母A或B从屏幕的左下角斜飞出去(速度为每秒钟移动2个字符的位置)
? 字母在行进期间碰到屏幕的边沿时反弹。
? 使用小键盘对运动中的字母进行控制,小键盘上的按键如下定义: 
? 4、2、6、8对应左、下、右、上
? 1、3、9、7对应左下、右下、右上、左上
? 比如:按下9键后字母就向右上方向前进   
? 程序在按下'ESC'按键时退出。
? 要求:
? 当字母往前走时必须将前一个字母显示的消除。
? 在程序中必须记住当前字母所在的座标、运行方向。屏幕的座标是:行:0-79,列0-24,运行方向可用一个变量表示,该变量从0-7分别表示左、左下、下、右下、右、右上、上、左上
? 每次向前移时必须判断下一个座标位置,若碰到边界即X、Y是否为(0、79), (0,24)则进行反弹计算,然后改变运行方向变量值。
? 当控制按键按下后除了改变运行方向变量值外还必须判断是否在边界,需要保证下一个字母位置不能有越界的异常情况发生。
DATAS SEGMENT
    ;此处输入数据段代码
KEY    DB   35H
DIR  DB    9
X        DB    0
Y    DB       24
COUNT    DB        9
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
   ASSUME CS:CODES,DS:DATAS,SS:STACKS
;--------------------------------
;Main program
;--------------------------------
main  proc far
START:
   MOV AX,DATAS
           MOV DS,AX
           MOV CH,05H
             MOV CL,07H
             MOV AH,01H
             INT 10H
    
   ;中断
   ;保存当前1CH的中断向量,再设置的中断向量
   ;save old interrupt vector
   MOV AL,1CH
   MOV AH,35H
   INT 21H
   PUSH ES
   PUSH DX
   PUSH DS
   ;set new interrupt vector
   MOV DX,OFFSET DRAW ;DX = OFFSET OF DRAW
   MOV AX,SEG DRAW ;AX = SEGMENT OF DRAW
   MOV DS,AX ;DS = AX
   MOV AL,1CH ;AL = VECTOR#
   MOV AH,25H ;TO SET INTERRUPT VECTOR
   INT 21H ;CALL DOS
  
   POP DS
   IN AL,21H
   AND AL,11111110B
   OUT 21H,AL
  
  
  
;   MOV DI,20000
;DELAY:  MOV SI,30000
;DELAY1: DEC SI
; JNZ DELAY1
; DEC DI
; JNZ DELAY
 ;此处输入代码段代码
LP1:    
CMP KEY,27 ;KEY == ESC
                JE EXIT ;Y = EXIT
        ; N
                CMP KEY,35H      ;KEY == 35H KEY中的值已被取走
                   JNE DIR_CHECK ;N -> DIR_CHECK KEY已有输入 判断原方向的合法性
        ;   Y
       ;KEY = 键盘按键
                   MOV AH,07H
                INT 21H
  相关解决方案