| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1040 人关注过本帖
标题:小毛病,汇编高手帮帮忙!!
只看楼主 加入收藏
sherry33
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-4-28
收藏
 问题点数:0 回复次数:3 
小毛病,汇编高手帮帮忙!!
题目21:设计一个程序完成如下功能:
初始状态下假设一个字母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)则进行反弹计算,然后改变运行方向变量值。
·   当控制按键按下后除了改变运行方向变量值外还必须判断是否在边界,需要保证下一个字母位置不能有越界的异常情况发生。
搜索更多相关主题的帖子: 字母 异常情况 变量 毛病 
2008-06-11 09:54
sherry33
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-4-28
收藏
得分:0 
FANGX MACRO FANGXIANG,OPR1,OPR2,COL_NUM,ROW_NUM
        MOV NUM,FANGXIANG
        CALL CLS
        CALL READ
        OPR1 COL,COL_NUM
        OPR2 ROW,ROW_NUM
        ENDM
DATAS SEGMENT
    str db 'A'
    row db 24
    col db 0
    NUM DB 5
DATAS ENDS

STACKS SEGMENT
    db 200 dup (0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS: DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX

        call cls
        call DISPLAY

LOOP1:                                
        STI
        MOV AH,0BH
        INT 21H
        INC AL
        JNZ MOVE1
FLAG3:
        MOV  AH,0
        INT  16H
        PUSH AX
        MOV  AH,1
        INT  16H
        JZ FLAG2
    POP AX
        JMP FLAG3
EXIT1:
        JMP EXIT
FLAG2:
        POP AX
    CMP  AL,1BH
    JZ  EXIT
    CMP AH,4BH
    JZ K4
    CMP AH,50H
    JZ K2
    CMP AH,4DH
    JZ K6
    CMP AH,48H
    JZ K8
    CMP AH,47H
    JZ K7
    CMP AH,49H
    JZ K9
    CMP AH,4FH
    JZ K1
    CMP AH,51H
    JZ K3
    JMP LOOP1
K4:
        FANGX 5,SUB,ADD,1,0
        CALL DISPLAY
        JMP LOOP1
K2:
        FANGX 4,ADD,ADD,0,1
        CALL DISPLAY  
        JMP LOOP1
K6:
        FANGX 7,ADD,ADD,1,0
        CALL DISPLAY
        JMP LOOP1
K8:
        FANGX 3,ADD,SUB,0,1
        CALL DISPLAY
        JMP LOOP1
K7:
        FANGX 6,SUB,SUB,1,1
        CALL DISPLAY
        JMP LOOP1
K9:
        FANGX 5,ADD,SUB,1,1
        CALL DISPLAY   
        JMP LOOP1
K1:
        FANGX 1,SUB,ADD,1,1
        CALL DISPLAY
        JMP LOOP1
K3:
        FANGX 2,ADD,ADD,1,1
        CALL DISPLAY
        JMP LOOP1
MOVE1:
        CALL SUB_DELAY
        CALL MOVE
        JMP LOOP1
EXIT:
        MOV AX,4C00H        
        INT 21H                         ;返回DOS

DISPLAY proc near            ;显示字符'A'
        MOV BH,0
        MOV DH,ROW
        MOV DL,COL
        MOV AH,2
        INT 10H
          mov cx,1
          mov al,'A'
          MOV BL,00001011B
          mov ah,9
          int 10h
          ret
DISPLAY endp
   
CLS PROC NEAR                        ;清屏
        MOV CX,0
        MOV DH,24
        MOV DL,79
        MOV BH,0
        MOV AX,600H
        INT 10H
        RET
CLS ENDP

MOVE PROC NEAR                        ;运动
        STI
NEXT:
        MOV BL,NUM
        CMP NUM,5
        JZ ROT1
        CMP NUM,2
        JZ ROT2
        CMP NUM,6
        JZ ROT3
        CMP NUM,1
        JZ ROT4
        ;CALL SUB_DELAY
        FANGX BL,ADD,SUB,1,1
        CALL DISPLAY
        JMP NEXT_MOVE
ROT1:                                        ;右上                        
        CMP ROW,0
        JZ ROT2                                ;向右下动
        CMP COL,79
        JZ ROT3                                ;向左上动
        ;CALL SUB_DELAY
        FANGX 5,ADD,SUB,1,1
        CALL DISPLAY
        

        JMP NEXT_MOVE
ROT2:                                        ;右下        
        CMP COL,79
        JZ ROT4                                ;向左下动
        CMP ROW,24
        JZ ROT1                                ;向右上动
        ;CALL SUB_DELAY
        FANGX 2,ADD,ADD,1,1
        CALL DISPLAY
        

        JMP NEXT_MOVE
ROT3:                                        ;左上               
        CMP COL,0
        JZ ROT1                                ;向右上动
        CMP ROW,0
        JZ ROT4        
        ;CALL SUB_DELAY
        FANGX 6,SUB,SUB,1,1
        CALL DISPLAY
        

        JMP NEXT_MOVE
ROT4:                                        ;左下               
        CMP ROW,24
        JZ ROT3
        CMP COL,0
        JZ ROT2        
        ;CALL SUB_DELAY
        FANGX 1,SUB,ADD,1,1
        CALL DISPLAY
        

        JMP NEXT_MOVE
NEXT_MOVE:
        RET
MOVE ENDP

READ PROC NEAR                        ;读光标位置,DH=行号,DL=列号
        MOV AH,3
        MOV BH,0
        INT 10H
        MOV ROW,DH
        MOV COL,DL
        RET
READ ENDP

SUB_DELAY PROC NEAR                ;延迟一秒
        STI
        PUSH        AX
        PUSH        BX
        PUSH        CX
        PUSH        DX
        PUSHF

        MOV AH, 2CH
        INT 21H
        INC DH  ;系统秒数个数加1
        MOV BL, DH
        CMP BL, 3CH  ;如果是60
        JNE SUB_TIMER
        XOR BL, BL  ;BL置0

SUB_TIMER:
        MOV        AH, 2CH
        INT        21H        ;获取系统时间
        CMP        BL, DH        ;秒数十位置0,只比较个数
        JE        SUB_RET        ;如果到了下一秒,则返回
        JMP        SUB_TIMER

SUB_RET: POPF
        POP        DX
        POP        CX
        POP        BX
        POP        AX
        RET
SUB_DELAY        ENDP

CODES ENDS
    END START
2008-06-11 09:55
sherry33
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-4-28
收藏
得分:0 
这是我写的程序
有点小毛病的~~
就是在A运动到最上面的时候不反弹。。。
而且,按2.4.6.8的时候,应该按照原来运动方向运动的,它都是向右上运动。。。
还有就是,按了控制键后,运动改变不明显。。。例如我按了2,不是向下运动的。。。
2008-06-11 09:55
sherry33
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-4-28
收藏
得分:0 
顶哦~~~
2008-06-20 11:05
快速回复:小毛病,汇编高手帮帮忙!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037932 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved