⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coloursquare.asm

📁 在win32下
💻 ASM
字号:
;0000 0 黑色 
;0001 1 蓝色 
;0010 2 绿色 
;0011 3 青色 
;0100 4 红色 
;0101 5 品红色 
;0110 6 棕色 
;0111 7 白色 
;1000 8 灰色 
;1001 9 淡蓝色 
;1010 10 淡绿色 
;1011 11 淡青色 
;1100 12 淡红色 
;;1101 13 淡品色 
;1110 14 黄色 


DATAS SEGMENT 
COLOR DW 02 
BKCOLOR DW 15 
COLORINFO DB 13,10,'PLEASE INPUT COLOR HEX CODE(0~E):$' 
CRLF DB 13,10,'$' 
LENINFO DB 13,10,'PLEASE INPUT THE LENGTH:$' 
BUFF DB 10,0,10 DUP (0) 
POINT DW 200,400,400,200 
DW 200,200,300,100 
DW 400,200,300,100 
DATAS ENDS 

STACKS SEGMENT 
DW 200 DUP(0) 
STACKS ENDS 

CODES SEGMENT 
ASSUME CS:CODES,DS:DATAS,SS:STACKS 
START: MOV AX,DATAS 
MOV DS,AX 
MOV AX,0A000H 
MOV ES,AX 
CALL INPUTCOLOR 
MOV AH,9 
MOV DX,OFFSET CRLF 
INT 21H 
CALL INPUTLEN 
MOV AX,0012H 
INT 10H ;设置640*480*16图形模式 
MOV AL,2 
CALL SET_WRITE_MODE 
MOV AX,BKCOLOR 
CALL CLEAR 
MOV CX,4 
MOV SI,OFFSET POINT 
DDD: PUSH CX 
PUSH SI 
MOV AX,[SI] 
PUSH AX 
MOV AX,[SI+2] 
PUSH AX 
MOV AX,[SI+4] 
PUSH AX 
MOV AX,[SI+6] 
PUSH AX 
CALL LINE 
POP SI 
ADD SI,8 
POP CX 
LOOP DDD 
MOV AH,01H 
INT 21H 
MOV AX,4C00H 
INT 21H 
PIXEL: 
PUSH BP 
PUSH BX 
PUSH CX 
PUSH DS 
MOV BP,SP 
MOV AX,80 
MOV BX,WORD PTR[BP+12] ;BX<=Y 
MUL BX ;(DX:AX)<=80*Y 
MOV BX,AX ; 
MOV AX,WORD PTR[BP+14] ;AX<--X 
MOV CL,8 ; | | 
DIV CL ;AL<=商(X/8),AH<=余数(X%8) SP-> | | 
MOV CL,AH ;CL<=AH | DS |<-BP 
MOV AH,0 ; | CX |<-BP+2 
ADD BX,AX ;BX(OFFSET)<=80*Y+X/8 | BX |<-BP+4 
MOV AL,80H ; | BP |<-BP+6 
SHR AL,CL ;AL(MASK)<=(80H>>CL) |返回地址|<-BP+8 
PUSH AX ; | COLOR |<-BP+10 
MOV DX,3CEH ; | Y |<-BP+12 
MOV AL,8 ; | X |<-BP+14 
OUT DX,AL ; | | 
MOV DX,3CFH ; PIXEL堆栈结构 
POP AX 
OUT DX,AL 
MOV AL,ES:[BX] 
MOV AX,WORD PTR[BP+10] ;AX<=COLOR 
MOV BYTE PTR ES:[BX],AL 
POP DS 
POP CX 
POP BX 
POP BP 
RET 6 
LINE: 
PUSH BP 
MOV BP,SP 
SUB SP,16 
MOV WORD PTR[BP-6],0 ;X=0 
MOV WORD PTR[BP-8],0 ;Y=0 
MOV WORD PTR[BP-14],1 ;INCX=1 
MOV WORD PTR[BP-16],1 ;INCY=1 
MOV AX,WORD PTR[BP+6] ;AX<=X2 
SUB AX,WORD PTR[BP+10] ;AX<=X2-X1 
JNC L1 ;IF X2>=X1,JMP L1 
NEG AX ;IF X2<X1,DELTA_X=-DELTA_X 
MOV WORD PTR[BP-14],-1 ;INCX<=-1 
L1: CMP AX,0 ;IF DELTA_X!=0,JMP L11 
JNE L11 ; 
MOV WORD PTR[BP-14],0 ;INCX<=0 
L11: MOV WORD PTR[BP-10],AX ;DELTA_X<=AX SP-> | | 
MOV AX,WORD PTR[BP+4] ;AX<=Y2 | INCY | 
SUB AX,WORD PTR[BP+8] ;AX<=Y2-Y1 | INCX |<-BP-14 
JNC L2 ;IF Y2>=Y1,JMP L2 | DELTA_Y|<-BP-12 
NEG AX ;IF Y2<Y1,DELTA_Y=-DELTA_Y | DELTA_X|<-BP-10 
MOV WORD PTR[BP-16],-1 ;INCY<=-1 | Y |<-BP-8 
L2: CMP AX,0 ;IF DELTA_Y!=0,JMP L22 | X |<-BP-6 
JNE L22 ; |DISTANCE|<-BP-4 
MOV WORD PTR[BP-16],0 ;INCY<=0 | T |<-BP-2 
L22: MOV WORD PTR[BP-12],AX ;DELTA_Y<=AX | BP |<-BP 
LP4: MOV AX,WORD PTR[BP-10] ;AX<=DELTA_X |返回地址|<-BP+2 
CMP AX,WORD PTR[BP-12] ; | Y2 |<-BP+4 
JG LP5 ;DELTA_X>DELTA_Y | X2 |<-BP+6 
MOV AX,WORD PTR[BP-12] ; | Y1 |<-BP+8 
MOV WORD PTR[BP-4],AX ;DISTANCE<=DELTA_Y | X1 |<-BP+10 
JMP LP51 ; | | 
LP5: MOV AX,WORD PTR[BP-10] ; LINE堆栈结构 
MOV WORD PTR[BP-4],AX ;DISTANCE<=DELTA_X 
LP51: INC AX 
MOV WORD PTR[BP-2],AX 
LP6: PUSH WORD PTR[BP+10] 
PUSH WORD PTR[BP+8] 
PUSH COLOR 
CALL PIXEL 
MOV AX,WORD PTR[BP-6] ;AX<=X 
ADD AX,WORD PTR[BP-10] ;AX<=X+DELTA_X 
MOV WORD PTR[BP-6],AX ;X=X+DELTA_X 
MOV AX,WORD PTR[BP-8] ;AX<=Y 
ADD AX,WORD PTR[BP-12] ;AX<=Y+DELTA_Y 
MOV WORD PTR[BP-8],AX ;Y=Y+DELTA_Y 
MOV AX,WORD PTR[BP-6] ;AX<=X 
CMP AX,WORD PTR[BP-4] 
JLE LP7 ;IF X<=DISTANCE,JMP LP7 
MOV AX,WORD PTR[BP-6] ;X>DISTANCE 
SUB AX,WORD PTR[BP-4] ;AX<=X-DISTANCE 
MOV WORD PTR[BP-6],AX ;X=X-DISTANCE 
MOV AX,WORD PTR[BP+10] ;AX<=X1 
ADD AX,WORD PTR[BP-14] ;AX<=X1+INCX 
MOV WORD PTR[BP+10],AX ;X1=X1+INCX 
LP7: MOV AX,WORD PTR[BP-8] ;AX<=Y 
CMP AX,WORD PTR[BP-4] 
JLE LP8 ;IF Y<=DISTANCE,JMP LP8 
MOV AX,WORD PTR[BP-8] ;Y>DISTANCE 
SUB AX,WORD PTR[BP-4] ;AX<=Y-DISTANCE 
MOV WORD PTR[BP-8],AX ;Y=Y-DISTANCE 
MOV AX,WORD PTR[BP+8] ;AX<=Y1 
ADD AX,WORD PTR[BP-16] ;AX<=Y1+INCY 
MOV WORD PTR[BP+8],AX ;Y1=Y1+INCY 
LP8: DEC WORD PTR[BP-2] ;IF T!=0,JMP LP6 
JZ LP9 
JMP LP6 
LP9: MOV SP,BP 
POP BP 
RET 8 
SET_WRITE_MODE: 
PUSH AX 
MOV DX,3CEH 
MOV AL,5 
OUT DX,AL 
MOV DX,3CFH 
POP AX 
OUT DX,AL 
MOV DX,3CEH 
MOV AL,8 
OUT DX,AL 
MOV DX,3CFH 
MOV AL,0FFH 
OUT DX,AL 
RET 
CLEAR: 
MOV BX,0 
CLR1: MOV ES:[BX],AL 
INC BX 
CMP BX,80*480 
JNB CLR2 
JMP CLR1 
CLR2: RET 
INPUTCOLOR: 
MOV AH,9 
MOV DX,OFFSET COLORINFO 
INT 21H 
MOV AH,1 
INT 21H 
CMP AL,30H 
JB INPUTCOLOR 
CMP AL,39H 
JB INPUTOK 
CMP AL,61H 
JB BIGCHAR 
SUB AL,20H 
BIGCHAR:CMP AL,'A' 
JB INPUTCOLOR 
CMP AL,'F' 
JNB INPUTCOLOR 
INPUTOK:MOV AH,0 
MOV [COLOR],AX 
RET 
INPUTLEN: 
MOV AH,9 
MOV DX,OFFSET LENINFO 
INT 21H 
MOV AH,10 
MOV DX,OFFSET BUFF 
INT 21H 
CALL ABC ;AX为长度 
CMP AX,50 
JA Q1 
MOV AX,50;最小50 
JMP OK 
Q1: 
CMP AX,480 
JB OK 
MOV AX,480 
OK: 
MOV BX,640 
SUB BX,AX 
MOV CX,1 
SHR BX,CL 
MOV SI,OFFSET POINT ;X居中 
MOV [SI],BX 

MOV BX,480 
SUB BX,AX 
MOV CX,1;Y居中 
SHR BX,CL 
MOV CX,480 
SUB CX,BX 
MOV [SI+2],CX 

MOV BX,[SI] 
MOV DX,BX;1X 
MOV CX,[SI+2];1Y 
ADD BX,AX 
MOV [SI+4],BX ;2X 
MOV [SI+6],CX ;2Y 
MOV [SI+8],DX 
MOV [SI+10],CX 
MOV [SI+16],BX 
MOV [SI+18],CX 

PUSH AX 
PUSH CX 
MOV CX,1 
SHR AX,CL 
POP CX 
ADD DX,AX 
MOV [SI+12],DX;3X 
MOV [SI+20],DX;3X 
MOV BX,866;866 
POP AX 
MUL BX 
MOV BX,1000 
DIV BX 
SUB CX,AX 
MOV [SI+14],CX 
MOV [SI+22],CX 
RET 
;POINT DW 200,200,400,200 1P-2P 
; DW 200,200,300,100 1P-3P 
; DW 400,200,300,100 2P-3P 
ABC PROC 
MOV CH,0 
MOV BX,OFFSET BUFF 
MOV CL,[BX+1] 
CMP CX,0 
JZ ABCD 
PUSH CX 
ADD BX,2 
PUSH BX 
L0: SUB [BX],30H 
INC BX 
LOOP L0 
POP BX 
MOV AX,0 
MOV CH,0 
MOV CL,[BX-1] 
L111: MOV DL,10 
MUL DL 
ADD AL,BYTE PTR [BX] 
INC BX 
LOOP L111 
POP CX 
ABCD: RET 
ABC ENDP 
CODES ENDS 
END START 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -