+ -
当前位置:首页 → 问答吧 → 【虎彡】**************关于小轿车和小鸟的图形,求注释**********************

【虎彡】**************关于小轿车和小鸟的图形,求注释**********************

时间:2011-01-12

来源:互联网

昨天看一高手的图形小程序 复制过来研究 但是我自己写的注释没啥意义 全是描述动作的 
希望高手帮我写个容易理解的注释!感激不尽!
INT 10H 中断表:
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=36527&kindId=52140&postId=50640&readSg=1


DATA SEGMENT
INFO1 DB 0DH,0AH,'INPUT 1,2,OR 3:(1:bird,2:car,3:exit) $' ;提示语
BUFA DB 200
  DB ?
  DB 200 DUP(0) ;键盘输入缓冲区

BUFB DB 200 DUP(?)
BIRD  
  DB 76H,10,0,0 ;鸟的位模式图
  DB 0C4H,07,0,1
  DB 76H,10,-2,2
  DB 0C4H,07,0,1
  DB 76H,10,-2,2
  DB 0C4H,07,0,1
  DB 76H,10,-2,2
  DB 0C4H,07,0,1
  DB 76H,10,2,-2
  DB 0C4H,07,0,1
  DB 76H,10,2,-2
  DB 0C4H,07,0,1
  DB 76H,10,2,-2
  DB 0C4H,07,0,1
CAR DB 7 ;小汽车的位模式图
  DB 52H,7,0,0
  DB 0B1H,7,0,1
  DB 0DBH,7,0,1
  DB 0DBH,7,0,1
  DB 4FH,7,1,0
  DB 4FH,7,0,-3
  DB 2,7,-2,1

  CHAR_CNT DW ?

  POINTER DW ?

  LINE_ON DB ?

  COL_ON DB ?

DATA ENDS
STACK SEGMENT stack ;200字节的堆栈
  DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
  ASSUME CS:CODE,DS:DATA,SS:STACK
 start:
 mov ax,data
  mov ds,ax ;数据段装入

  mov ah,0  
  mov al,4 ;320×200 4色
  int 10h

  lea dx,info1  
  mov ah,9
  int 21h ;显示提示语

  mov ah,0 ;AH=0:从键盘读入ASCII字符,放在AL中 
  int 16h  
  CMP AL,31H ;是1么
  JNE A ;不等于转A
  CALL XIAO ;等于转小鸟
  A: 
  CMP AL,32H ;是2么
  JNE B ;不是转B
  CALL QICHE ;是转汽车
  B: 
  CMP AL,33H ;是3么
  JNE START ;不是转到开始
  MOV AH,4CH ;是则退出
  INT 21H
;---------------------------------------------------------------------
CLEAR MACRO pch,pcl,pdh,pdl,pbh ;清屏宏
  MOV AH,0
  MOV AL,4
  INT 10H  
  ;320×200 4色
  MOV AH,6 ;AH=06H—向上滚屏
  MOV AL,0 ;AL=0—清窗口
  MOV CH,pch  
  MOV CL,pcl ;(CH、CL)=窗口的左上角位置(Y坐标,X坐标)
  MOV DH,pdh
  MOV DL,pdl ;(DH、DL)=窗口的右下角位置(Y坐标,X坐标) 
  MOV BH,pbh ;BH=空白区域的缺省属性 
  INT 10H
ENDM
;---------------------------------------------------------------------
xiao proc ;小鸟
  PUSH DS
  MOV AX,0
  PUSH AX

  MOV AX,DATA
  MOV DS,AX

  MOV AH,0
  MOV AL,4 ;320×200 4色
  INT 10H

  MOV AH,0BH ;设置调色板、背景色或边框  
  MOV BH,0  
  MOV BL,1 ;BL=颜色 
  INT 10H 
   
  MOV AH,0BH  
  MOV BH,1 ;选择调色板:BH=01H,BL=调色板(320×200、4种颜色的图形模式) 
  MOV BL,1
  INT 10H

  CLEAR 0,0,24,79,7 ;调用清屏宏
  MOV AH,0FH ;读取显示器模式  
  INT 10H

  MOV DH,10 ;DH=行(Y坐标)
  MOV DL,0 ;DL=列(X坐标
  BEGIN:
MOV SI,2 ;SI是干什么的没看出来
  MOV CX,1 ;字符重复次数
  LEA DI,BIRD ;DI指向小鸟位模式图
  DISP: 
  CMP DL,80 ;DL大于80么
  JAE exit1 ;是转EXIT1
  MOV AH,2  
  INT 10H ;用文本坐标下设置光标位置
  MOV AH,9 ;在当前光标处按指定属性显示字符 
  MOV AL,[DI] ;AL=字符 
  MOV BL,[DI+1] ;BL=颜色(图形模式) 
  INT 10H
  CALL DLY ;延时

  MOV AH,9
  MOV AL,' ' ;AL=字符
  MOV BL,04 ;BL=颜色(图形模式) 
  INT 10H ;显示字符

  INC DL ;列坐标+1
  ADD DI,2 ;位模式图下一位
  DEC SI ;SI-1
  JNZ DISP
  JMP BEGIN
exit1: RET ;退出返回
xiao endp

;------------------------------------------------
DLY PROC NEAR ;延时(空循环)
  PUSH CX
  PUSH DX
  MOV DX,10000
  DL1: 
  MOV CX,6801
  DL2: 
  LOOP DL2
  DEC DX
  JNZ DL1
  POP DX
  POP CX
  RET
DLY ENDP
;------------------------------------------------
QICHE PROC near ;小汽车
  PUSH AX
  PUSH BX
  PUSH CX
  PUSH DX ;保护寄存器
   
  MOV AH,0 ;320×200 4色 
  MOV AL,4
  INT 10H

  MOV AH,0BH ;设置调色板、背景色或边框 
  MOV BH,01 ;选择调色板:BH=01H  
  MOV BL,00 ;BL=调色板(320×200、4种颜色的图形模式) 
  INT 10H

  CLEAR 0,0,24,79,7 ;清屏

  LEA DI,CAR ;DI指向小汽车位模式图

  MOV DH,5 ;DH=行(Y坐标)
  MOV DL,0 ;DL=列(X坐标


  CALL MOVE_SHAPE ;转
  RET  
QICHE ENDP
;---------------------------------------------------
MOVE_SHAPE PROC NEAR  
  PUSH AX
  PUSH BX
  PUSH CX
  PUSH DX
  PUSH DI ;保护寄存器

  MOV AH,0FH ;读取显示器模式 
  INT 10H

  SUB CH,CH ;CH清0
  MOV CL,[DI] ;位模式图送入CL
  INC DI ;下一字节
   
  ;属性保存
  MOV CHAR_CNT,CX ;保存CX

  MOV POINTER,DI ;保存偏移

  MOV LINE_ON,DH ;保存行

  MOV COL_ON,DL ;保存列

  PLOT_NEXT:  
  ADD DH,[DI+2] ;行
  ADD DL,[DI+3] ;列
  CMP DL,80 ;列是否大于80
  JB MOV_CRSR ;小于转

  Pop DI ;大于等于寄存器出栈
  Pop DX
  Pop CX
  Pop BX
  Pop AX  
  jmp exit2 ;返回

  MOV_CRSR: ;小于
  MOV AH,2 ;用文本坐标下设置光标位置 
  INT 10H

  MOV AL,[DI] ;AL=字符  
  MOV BL,[DI+1] ;BL=颜色
  PUSH CX ;保存CX
  MOV CX,1 ;显示个数
  MOV AH,09  
  INT 10H ;显示字符
  POP CX ;恢复CX
  ADD DI,4 ;偏移+4
  LOOP PLOT_NEXT ;循环

  CALL DLY ;延时
 
  CALL ERASE ; 

  JMP SHORT PLOT_NEXT ;跳到PLOT_NEXT 
;-------------------
  exit2: ret  
;-------------------
MOVE_SHAPE ENDP

;+++++++++++++++++++++++++++++++++
ERASE PROC NEAR 
  MOV CX,CHAR_CNT
  MOV DI,POINTER
  MOV DH,LINE_ON
  MOV DL,COL_ON ;属性值恢复

  ERASE_NEXT:  
  ADD DH,[DI+2] ;设置行
  ADD DL,[DI+3] ;设置列
  MOV AH,2
  INT 10H ;置光标

  MOV AL,[DI] ;AL=字符 
  MOV BL,0 ;颜色(图形模式) 
  PUSH CX ;保存计数器
  MOV CX,1 
  MOV AH,9
  INT 10H ;显示字符
  POP CX ;恢复计数器
  ADD DI,4 ;偏移+4
  LOOP ERASE_NEXT ;循环

  MOV CX,CHAR_CNT  
  MOV DI,POINTER
  MOV DH,LINE_ON
  INC COL_ON
  MOV DL,COL_ON ;恢复属性值
  RET  
ERASE ENDP

CODE ENDS  


END start

作者: znxllyuan   发布时间: 2011-01-12

引用楼主 znxllyuan 的回复:
昨天看一高手的图形小程序 复制过来研究 但是我自己写的注释没啥意义 全是描述动作的
希望高手帮我写个容易理解的注释!感激不尽!
INT 10H 中断表:
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=36527&kindId=52140&postId=50640&readSg=1


DA……

MOV SI,2 ;SI是干什么的没看出来
  MOV CX,1 ;字符重复次数
  LEA DI,BIRD ;DI指向小鸟位模式图
  DISP:  
  CMP DL,80 ;DL大于80么

 ...
  DEC SI ;SI-1
  JNZ DISP

SI也是循环计数的。

作者: shzhfu   发布时间: 2011-01-12