DATA SEGMENT S1 DB 'ENTER ROWS:','$' S2 DB 'ENTER COLS:','$' ROW DW 0 COL DW 0 ROWLEN DW 0 COLLEN DW 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AH,9 LEA DX,S1 INT 21H CALL READDEC MOV ROW,AX MOV CL,3 SHL AX,CL MOV COLLEN,AX MOV AH,9 LEA DX,S2 INT 21H CALL READDEC MOV COL,AX MOV CL,3 SHL AX,CL MOV ROWLEN,AX MOV AX,0A000H MOV ES,AX MOV AX,13H INT 10H ;进入320 x 200 图形模式 MOV BP,ROW LOP1: MOV CX,ROWLEN MOV AX,BP SHL AX,1 SHL AX,1 SHL AX,1 MOV BX,0 CALL DRAWHLINE DEC BP JNS LOP1 MOV BP,COL LOP2: MOV CX,COLLEN MOV AX,0 MOV BX,BP SHL BX,1 SHL BX,1 SHL BX,1 CALL DRAWVLINE DEC BP JNS LOP2 MOV AH,7 INT 21H JMP START DRAWHLINE PROC ;绘制横线,入口AX:起始行坐标,BX:起始纵坐标,CX:线长度 MOV SI,320 MUL SI ADD BX,AX ;计算起始像素点 DRAWHPOINT: MOV BYTE PTR ES:[BX],1 INC BX LOOP DRAWHPOINT RET DRAWHLINE ENDP DRAWVLINE PROC ;绘制竖线,入口AX:起始行坐标,BX:起始纵坐标,CX:线长度 MOV SI,320 MUL SI ADD BX,AX ;计算起始像素点 DRAWVPOINT: MOV BYTE PTR ES:[BX],1 ADD BX,320 LOOP DRAWVPOINT RET DRAWVLINE ENDP READDEC PROC MOV CX,10 XOR BX,BX LOPREAD: MOV AH,01H INT 21H CMP AL,' ' JZ EXITREAD CMP AL,13 JZ EXITREAD SUB AL,30H PUSH AX MOV AX,BX MUL CX POP DX ADD AL,DL ADC AH,0 MOV BX,AX JMP LOPREAD EXITREAD: MOV AX,BX RET READDEC ENDP CODE ENDS END START注释这段代码
时间: 2023-09-19 22:05:53 浏览: 121
下面是对于代码的注释:
```assembly
DATA SEGMENT
S1 DB 'ENTER ROWS:','$' ; 显示提示信息
S2 DB 'ENTER COLS:','$' ; 显示提示信息
ROW DW 0 ; 存储输入的行数
COL DW 0 ; 存储输入的列数
ROWLEN DW 0 ; 存储每行像素点的个数
COLLEN DW 0 ; 存储每列像素点的个数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA ; 将数据段地址存入AX寄存器
MOV DS,AX ; 将数据段地址存入DS寄存器
MOV AH,9 ; 设置中断号
LEA DX,S1 ; 将S1的地址存入DX寄存器
INT 21H ; 用21H号中断显示提示信息
CALL READDEC ; 调用READDEC过程读取用户输入的十进制数字
MOV ROW,AX ; 将AX中的输入值存入ROW变量
MOV CL,3 ; 设置移位位数
SHL AX,CL ; 将AX左移3位,相当于乘以8
MOV COLLEN,AX ; 将列宽存入COLLEN变量
MOV AH,9 ; 设置中断号
LEA DX,S2 ; 将S2的地址存入DX寄存器
INT 21H ; 用21H号中断显示提示信息
CALL READDEC ; 调用READDEC过程读取用户输入的十进制数字
MOV COL,AX ; 将AX中的输入值存入COL变量
MOV CL,3 ; 设置移位位数
SHL AX,CL ; 将AX左移3位,相当于乘以8
MOV ROWLEN,AX ; 将行长存入ROWLEN变量
MOV AX,0A000H ; 设置显存地址
MOV ES,AX ; 将显存地址存入ES寄存器
MOV AX,13H ; 设置视频模式13H,即320 x 200 图形模式
INT 10H ; 调用INT 10H中断设置视频模式
MOV BP,ROW ; 将ROW存入BP寄存器
LOP1:
MOV CX,ROWLEN ; 将行宽存入CX寄存器
MOV AX,BP ; 将BP存入AX寄存器
SHL AX,1 ; 将AX左移1位,相当于乘以2
SHL AX,1 ; 将AX左移1位,相当于乘以2
SHL AX,1 ; 将AX左移1位,相当于乘以2
MOV BX,0 ; 将0存入BX寄存器
CALL DRAWHLINE ; 调用DRAWHLINE过程绘制横线
DEC BP ; 将BP减1
JNS LOP1 ; 如果BP大于等于0,跳转到LOP1标签
MOV BP,COL ; 将COL存入BP寄存器
LOP2:
MOV CX,COLLEN ; 将列宽存入CX寄存器
MOV AX,0 ; 将0存入AX寄存器
MOV BX,BP ; 将BP存入BX寄存器
SHL BX,1 ; 将BX左移1位,相当于乘以2
SHL BX,1 ; 将BX左移1位,相当于乘以2
SHL BX,1 ; 将BX左移1位,相当于乘以2
CALL DRAWVLINE ; 调用DRAWVLINE过程绘制竖线
DEC BP ; 将BP减1
JNS LOP2 ; 如果BP大于等于0,跳转到LOP2标签
MOV AH,7 ; 设置中断号
INT 21H ; 用21H号中断发出响铃声
JMP START ; 跳转到START标签
DRAWHLINE PROC
; 绘制横线,入口AX:起始行坐标,BX:起始纵坐标,CX:线长度
MOV SI,320 ; 将320存入SI寄存器
MUL SI ; 将AX乘以SI的值
ADD BX,AX ; 计算起始像素点
DRAWHPOINT:
MOV BYTE PTR ES:[BX],1 ; 在显存中存入1
INC BX ; 将BX加1
LOOP DRAWHPOINT ; 循环绘制像素点
RET
DRAWHLINE ENDP
DRAWVLINE PROC
; 绘制竖线,入口AX:起始行坐标,BX:起始纵坐标,CX:线长度
MOV SI,320 ; 将320存入SI寄存器
MUL SI ; 将AX乘以SI的值
ADD BX,AX ; 计算起始像素点
DRAWVPOINT:
MOV BYTE PTR ES:[BX],1 ; 在显存中存入1
ADD BX,320 ; 将BX加上320,跳转到下一列的像素点
LOOP DRAWVPOINT ; 循环绘制像素点
RET
DRAWVLINE ENDP
READDEC PROC
; 读取用户输入的十进制数字
MOV CX,10 ; 将10存入CX寄存器
XOR BX,BX ; 将0存入BX寄存器
LOPREAD:
MOV AH,01H ; 设置中断号
INT 21H ; 用21H号中断读取一个字符
CMP AL,' ' ; 如果是空格,则退出循环
JZ EXITREAD
CMP AL,13 ; 如果是回车,则退出循环
JZ EXITREAD
SUB AL,30H ; 将字符转换为数字
PUSH AX ; 将数字存入堆栈
MOV AX,BX ; 将BX存入AX
MUL CX ; 将AX乘以CX
POP DX ; 将数字弹出堆栈并存入DX
ADD AL,DL ; 将DX加到AL中
ADC AH,0 ; 如果有进位,将进位加到AH中
MOV BX,AX ; 将结果存入BX中
JMP LOPREAD ; 跳转到LOPREAD标签
EXITREAD:
MOV AX,BX ; 将结果存入AX中
RET
READDEC ENDP
CODE ENDS
END START
```
阅读全文