📄 用鼠标取点,画线(最终版).asm
字号:
DSEG SEGMENT
LIDADDR DD ?
MODE DB ?
X1 DW ?
Y1 DW ?
X2 DW ?
Y2 DW ?
OLDX DW 0
OLDY DW 0
BUFFX DW ?
BUFFY DW ?
OLDADDR DD ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV AH,0FH ;取当前的显示模式保存在MODE中
INT 10H
MOV MODE, AL
MOV AH,0 ;设置成256色640*480的图形显示模式MOD
MOV AL,13H
INT 10H
CALL CLSSCR
MOV AX,00H
INT 33H ;初始化鼠标
CMP AX,0
JZ LAST
MOV AX,01H
INT 33H
NEXT: MOV AX,03H
INT 33H
MOV X1,CX
MOV Y1,DX
CALL DISMOUSE
CMP BX,1
JNZ NEXT
MOV AH,0CH
MOV BH,0
MOV AL,15
INT 10H ;显示鼠标按下左键的点
NEXT2: push ax
mov al, 11001100B
call vline
pop ax
MOV AX,03H
INT 33H
MOV X2,CX
MOV Y2,DX
CALL DISMOUSE
call vline
MOV X2,CX
MOV Y2,DX
CMP BX,1
JNZ NEXT2
CMP CX,X1
JNZ NEXT3
CMP DX,Y1
JNZ NEXT3
JMP NEXT2
NEXT3: MOV AX,02H
INT 33H
MOV AL,00001100B
CALL VLINE
mov ah,0
int 16h
cmp al,'c'
jnz next4
call CLSSCR
jmp next
next4: cmp al,1bh
jz last
jmp next
LAST: MOV AH,0
INT 16H
MOV AL,MODE
MOV AH,0
INT 10H
MOV AX,4C00H
INT 21H
DISMOUSE PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
CMP CX ,OLDX
JNZ DISMOUSE1
CMP DX,OLDY
JZ DISMOUSE2
DISMOUSE1: MOV DI ,CX
MOV SI,DX
MOV CX,OLDX
MOV DX,OLDY
MOV BH,0
MOV AL,11001100B
MOV AH,0CH
INT 10H
MOV CX,DI
MOV DX,SI
MOV OLDX,CX
MOV OLDY,DX
MOV BH,0
MOV AL,00001001B
MOV AH,0CH
INT 10H
DISMOUSE2: POP SI
POP DI
POP DX
POP CX
POP BX
POP AX
RET
DISMOUSE ENDP
; 画两点之间的直线 (X1,Y1),(X2,Y2) ,AL=该线的颜色
; 在256色320*200图形显示模式下
; 保护AX,BX,CX,DX ,DI
; Vline---[vline1 一般情况[vline11 x1<x2 的情况
; [ [vline12 x1>x2 的情况
; [
; [
; [
; [vline2 X1=X2的情况
; [vline3 Y1=Y2的情况
;
VLINE PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV BH,0
MOV AH,0CH
MOV CX,X1
CMP CX,X2
JZ VLINE2
MOV DX,Y1
CMP DX,Y2
JZ VLINE3
MOV CX,X1
SUB CX,X2
CMP CX,0
JG VLINENEXT1
NEG CX
VLINENEXT1: MOV DX,Y1
SUB DX,Y2
CMP DX,0
JG VLINENEXT
NEG DX
VLINENEXT: CMP CX,DX
JL VLINEY
VLINEX: MOV CX,X1
MOV DX ,Y1
CMP CX,X2
JA VLINE12
VLINE11: INT 10H ; x1<x2 的情况
INC CX
CMP CX,X2
JG VLAST
CALL YUNSHUAN1
JMP VLINE11
VLINE12: INT 10H ;vline12 x1>x2 的情况
DEC CX
CMP CX,X2
JL VLAST
CALL YUNSHUAN1
JMP VLINE12
VLINE2: MOV DX,Y1 ; 当X1=X2,即斜率不存在
CMP DX,Y2
JA VLINE22
VLINE21: INT 10H
INC DX
CMP DX,Y2
JG VLAST
JMP VLINE21
VLINE22: INT 10H
DEC DX
CMP DX,Y2
JL VLAST
JMP VLINE22
VLINE3: MOV CX,X1 ; 当Y1=Y2,即斜率=0
CMP CX,X2
JA VLINE32
VLINE31: INT 10H
INC CX
CMP CX,X2
JA VLAST
JMP VLINE31
VLINE32: INT 10H
DEC CX
CMP CX,Y2
JB VLAST
JMP VLINE32
VLINEY: MOV CX,X1
MOV DX ,Y1
CMP DX,Y2
JA VLINEY12
VLINEY11: INT 10H ; x1<x2 的情况
INC DX
CMP DX,Y2
JG VLAST
CALL YUNSHUAN2
JMP VLINEY11
VLINEY12: INT 10H ;vline12 x1>x2 的情况
DEC DX
CMP DX,Y2
JL VLAST
CALL YUNSHUAN2
JMP VLINEY12
VLAST: POP DI
POP DX
POP CX
POP BX
POP AX
RET
VLINE ENDP
;入口参数CX,计算出(Y2-Y1)*(CX-X1) /(X2-X1)+Y1
;出口参数为DX
YUNSHUAN1 PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DI
MOV AX,Y2
SUB AX,Y1
SUB CX,X1
XOR DX,DX
IMUL CX
MOV BX,X2
SUB BX,X1
IDIV BX
ADD AX,Y1
MOV DX,AX
POP DI
POP CX
POP BX
POP AX
RET
YUNSHUAN1 ENDP
;入口参数dx,计算出(X2-X1)*(dx-y1)/(y2-y1) +x1
;出口参数为cx
YUNSHUAN2 PROC
PUSH AX
PUSH BX
PUSH DX
PUSH DI
MOV AX,X2
SUB AX,X1
SUB DX,Y1
MOV BX,DX
XOR DX,DX
IMUL BX
MOV BX,Y2
SUB BX,Y1
IDIV BX
ADD AX,X1
MOV CX,AX
POP DI
POP DX
POP BX
POP AX
RET
YUNSHUAN2 ENDP
CLSSCR PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,0600H
MOV BH,11001100B
MOV CX,0
MOV DX,184FH
INT 10H
POP DX
POP CX
POP BX
POP AX
RET
CLSSCR ENDP
CSEG ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -