用汇编语言实现输入半径值和圆心数据,在屏幕中画圆,并能多次运行。
时间: 2024-02-13 11:05:51 浏览: 148
汇编语言实现文本输入窗口.txt
5星 · 资源好评率100%
下面是一个使用8086汇编语言的示例代码,可以实现输入半径值和圆心数据,在屏幕中画圆,并能多次运行:
```
.MODEL SMALL
.STACK 100H
.DATA
RADIUS DW ? ; 圆的半径
XC DW ? ; 圆心的x坐标
YC DW ? ; 圆心的y坐标
MSG1 DB '请输入圆的半径(1-99):$'
MSG2 DB '请输入圆心的x坐标(1-319):$'
MSG3 DB '请输入圆心的y坐标(1-199):$'
MSG4 DB '是否继续?(Y/N):$'
ERR1 DB '半径值不合法,请重新输入!$'
ERR2 DB '坐标值不合法,请重新输入!$'
PROMPT DB 0DH, 0AH, '请按任意键继续...', 0DH, 0AH, '$'
YES DB 'Y$'
.CODE
MAIN PROC
MOV AX, @DATA ; 初始化数据段寄存器
MOV DS, AX
MOV AX, 0B800H ; 将显存段地址存入AX
MOV ES, AX
MOV AH, 09H ; 显示消息1
MOV DX, OFFSET MSG1
INT 21H
CALL READ_INT ; 读取半径值
MOV RADIUS, AX
CMP AX, 1 ; 检查半径值是否在1-99之间
JB INVALID_RADIUS
CMP AX, 99
JA INVALID_RADIUS
MOV AH, 09H ; 显示消息2
MOV DX, OFFSET MSG2
INT 21H
CALL READ_INT ; 读取圆心的x坐标
MOV XC, AX
CMP AX, 1 ; 检查圆心的x坐标是否在1-319之间
JB INVALID_COORD
CMP AX, 319
JA INVALID_COORD
MOV AH, 09H ; 显示消息3
MOV DX, OFFSET MSG3
INT 21H
CALL READ_INT ; 读取圆心的y坐标
MOV YC, AX
CMP AX, 1 ; 检查圆心的y坐标是否在1-199之间
JB INVALID_COORD
CMP AX, 199
JA INVALID_COORD
CALL DRAW_CIRCLE ; 在屏幕中画圆
MOV AH, 09H ; 显示消息4
MOV DX, OFFSET MSG4
INT 21H
MOV AH, 01H ; 读取用户按键
INT 21H
CMP AL, YES ; 如果用户输入Y,则重新开始
JE MAIN
MOV AH, 4CH ; 指令结束
INT 21H
DRAW_CIRCLE PROC
MOV CX, 0 ; 初始化循环计数器
MOV DX, RADIUS
MOV BX, DX ; BX存储2*RADIUS
MOV AX, XC
ADD AX, DX ; 计算起始点的x坐标
MOV DX, YC
MOV SI, AX ; SI存储当前点的x坐标
SUB SI, DX ; 计算起始点的y坐标
MOV DI, SI
ADD DI, BX ; DI存储2*y坐标
MOV BX, 160 ; 将显存偏移地址存入BX
MOV DL, 0FH ; 设置点的颜色
DRAW_CIRCLE_LOOP:
MOV AX, [SI] ; 将当前点的x坐标存入AX
MOV DX, [SI+2] ; 将当前点的y坐标存入DX
MOV [ES:BX+AX*2], DL ; 在显存中画点
MOV [ES:BX-DX*2], DL ; 在显存中画点
MOV AX, [SI+4] ; 将当前点的下一个点的x坐标存入AX
CMP AX, DX ; 如果下一个点在圆心上方,跳转到UP
JBE DRAW_CIRCLE_DOWN
ADD SI, 6 ; 下一个点在圆心左下方,向右上移动一格
ADD DI, -2*DX+2*AX-2*RADIUS
JMP DRAW_CIRCLE_CONTINUE
DRAW_CIRCLE_DOWN:
ADD SI, 4 ; 下一个点在圆心下方,向上移动一格
ADD DI, 2*AX-2*RADIUS
DRAW_CIRCLE_CONTINUE:
CMP SI, DI ; 如果当前点的x坐标不小于y坐标,退出循环
JBE DRAW_CIRCLE_LOOP
RET
DRAW_CIRCLE ENDP
READ_INT PROC
XOR AX, AX ; 清除AX寄存器
MOV CX, 10 ; 设置除数为10
READ_INT_LOOP:
MOV AH, 01H ; 读取用户按键
INT 21H
CMP AL, 0DH ; 如果输入的是回车键,退出循环
JE READ_INT_DONE
CMP AL, '0' ; 如果输入的不是数字,提示错误并重新输入
JB READ_INT_ERROR
CMP AL, '9'
JA READ_INT_ERROR
SUB AL, '0' ; 将字符转换为数字
MUL CX ; 将原来的数值乘以10
ADD AX, BX ; 加上新输入的数字
MOV BX, AX
JMP READ_INT_LOOP
READ_INT_ERROR:
MOV AH, 09H ; 显示错误消息
MOV DX, OFFSET ERR1
INT 21H
JMP READ_INT_LOOP
READ_INT_DONE:
RET
INVALID_RADIUS:
MOV AH, 09H ; 显示错误消息
MOV DX, OFFSET ERR1
INT 21H
JMP MAIN
INVALID_COORD:
MOV AH, 09H ; 显示错误消息
MOV DX, OFFSET ERR2
INT 21H
JMP MAIN
MAIN ENDP
END MAIN
```
该代码使用了循环、函数、条件分支等汇编语言的基本语法和指令,可以实现输入半径值和圆心数据,在屏幕中画圆,并能多次运行。
阅读全文