www.pudn.com > c.rar > c.asm


STACK    SEGMENT STACK 
       DB 200 DUP(0) 
STACK    ENDS 
 
DATA     SEGMENT 
    X  = 50 
    Y  = 10 
     
    original_x DB 0 
    original_y DB 0 
     
DATA     ENDS 
 
CODE     SEGMENT 
       ASSUME CS:CODE,DS:DATA,SS:STACK 
BEGIN:      MOV    AX,DATA 
            MOV    DS,AX 
            
             
            MOV    CX,Y             ;豆子的行数 
  L2:       PUSH   CX                 
                       
            MOV    CX,X             ;豆子的列数 
             
  L1:       MOV    DL,2EH            ;打印一行豆子 
            MOV    AH,2 
            INT    21H                  
            LOOP  L1  
             
            MOV    DL,0AH            ;输出换行     
            MOV    AH,2 
            INT    21H 
            MOV    DL,0DH 
            MOV    AH,2 
            INT    21H 
             
            POP    CX 
             
            LOOP   L2 
                        
            MOV    AH,01              ;隐藏光标,设置光标大小 
            MOV    CX,0C00H 
            INT    10H 
    
            MOV    AH,3              ;读当前光标属性,位置什么的啦 
            INT    10H               ;调试时 使用 
             
            MOV    AH,2              ;设置光标位置 
            MOV    BH,0 
            SUB    DH,Y 
            INT    10H 
             
            MOV    original_X,DL     ;保存原点坐标 
            MOV    original_Y,DH 
             
            MOV    AX,0943H          ;在当前位置写字符C 
            MOV    BH,0 
            MOV    BL,14H 
            MOV    CX,1 
            INT    10H 
             
             
   d:       MOV    AH,3              ;读光标位置 
            INT    10H 
             
            MOV    AH,0              ;获取按键 
            INT    16H 
             
            CMP    AL,'S'            ;向下 
            JE     d1 
            CMP    AL,'D'            ;向右 
            JE     d2 
            CMP    AL,'W'            ;向上 
            JE     d3 
            CMP    AL,'A'            ;向左 
            JE     d4 
            CMP    AL,'Q' 
            JE     EXIT 
             
            JMP    d                ;其他字符不做任何处理 
             
  d1:       MOV     AL,original_Y 
            ADD     AL,Y-1 
            CMP     DH,AL   
            JGE     d 
                                   ;写空白到当前光标,相当于吃豆子 
            MOV    AH,0AH 
            MOV    AL,0 
            MOV    BH,0 
            MOV    CX,1 
            INT    10H 
             
            INC    DH 
            JMP    PRINT 
             
  d2:        
            MOV    AL,original_X 
            ADD    AL,X-1 
;            CMP     DL,original_X+X-1   
            CMP    DL,AL 
            JGE    d 
                                   ;写空白到当前光标,相当于吃豆子 
            MOV    AH,0AH 
            MOV    AL,0 
            MOV    BH,0 
            MOV    CX,1 
            INT    10H 
             
            INC    DL 
            JMP    PRINT 
                
  d3:        
            MOV    AL,original_Y 
            INC    AL 
;            CMP     DH,original_Y+1   
            CMP    DH,AL 
            JL      d 
                                   ;写空白到当前光标,相当于吃豆子 
            MOV    AH,0AH 
            MOV    AL,0 
            MOV    BH,0 
            MOV    CX,1 
            INT    10H 
             
            DEC    DH             
            JMP    PRINT 
                
  d4:        
            MOV    AL,original_X 
            INC    AL 
;            CMP     DL,original_X+1   
            CMP    DL,AL 
            JL      d 
                                   ;写空白到当前光标,相当于吃豆子 
            MOV    AH,0AH 
            MOV    AL,0 
            MOV    BH,0 
            MOV    CX,1 
            INT    10H 
             
            DEC    DL 
             
  PRINT:      
            MOV    AH,2              ;设置光标位置 
            MOV    BH,0 
            INT    10H  
                                     ;打印C 
            MOV    AX,0943H          ;在当前位置写字符C 
            MOV    BH,0 
            MOV    BL,14H 
            MOV    CX,1 
            INT    10H    
             
            JMP    d                       
                                                
                         ;到最后应还原光标位置                         
  EXIT:     MOV    AH,4CH 
            INT    21H 
CODE     ENDS 
      END  BEGIN