📄 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -