给出dosbox画圆程序的前半部分代码,为该代码添加注释,在结尾给出简易流程说明 data segment shuc db 'draw a yuan: $' hua1 db 'input yuanxin and banjing(example:310,220 200): $' zifu db 20 dup(0) ;此段用以临时存放输入字符 shu db 20 dup(0) ; suan db 24 dup(0) ;用来存放计算圆过程中产生的临时数据 data ends stack segment stk db 16 dup(0) stack ends code segment assume cs:code, ds:data,ss:stack start: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov dx,offset shuc ;显示输入C的提示字符 call showmsg call input ;输入字符c的处理 mov al,ds:[si] and al,11011111b ;便于大小写都识别,将字符转换成大写 cmp al,43h draw1: mov dx,offset hua1 call showmsg call input call zhuanshu call moshi mov bx,offset shu mov ax,ds:[bx] mov si,ax mov ax,ds:[bx+2] mov di,ax mov ax,ds:[bx+4] call drawyuan mov ax,4c00h int 21h ;--------------------------------------- input: ;实现键盘输入字符 mov bx,0 mov cx,20 re: mov ah,1h ;DOS中断 键盘键入回显,al为字符 int 21h cmp al,0dh ;0dh为回车的ASCII码 jz scx mov si,offset zifu mov [bx][si],al ;将输入的字符放到zifu区 inc bx loop re ret ;-------------------------------------- scx: ;条件跳转时对cx设置 mov cx,0 ret ;-------------------------------------- showmsg: ;用来显示提示字符 mov ah,9h int 21h ret ;-------------------------------------- moshi: ;屏幕显示模式 mov al,12h mov ah,0 int 10h ret ;------------------------------------- zhuanshu: ;将输入的ascII码转为数字 mov bx,offset zifu mov bp,offset shu mov cx,16 mov si,0 mov di,0 lei: mov al,ds:[bx][si] cmp al,0 jz scx sub al,30h mov dl,100 mul dl mov word ptr ds:[bp][di],ax mov ax,0 mov al,ds:[bx][si+1] sub al,30h mov dl,10 mul dl add ax,word ptr ds:[bp][di] mov word ptr ds:[bp][di],ax mov ax,0 mov al,ds:[bx][si+2] sub al,30h add ax,word ptr ds:[bp][di] mov word ptr ds:[bp][di],ax add si,4 add di,2 loop lei ret
时间: 2023-08-15 14:18:40 浏览: 205
这段代码实现了一个 DOSBox 下的画圆程序,下面是注释:
```assembly
data segment
shuc db 'draw a yuan: $' ; 提示用户输入
hua1 db 'input yuanxin and banjing(example:310,220 200): $' ; 提示用户输入圆心和半径
zifu db 20 dup(0) ; 用以临时存放输入字符
shu db 20 dup(0) ; 存放转换后的数字
suan db 24 dup(0) ; 存放计算圆过程中产生的临时数据
data ends
stack segment
stk db 16 dup(0)
stack ends
code segment
assume cs:code, ds:data, ss:stack
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov dx,offset shuc ; 显示输入 C 的提示字符
call showmsg
call input ; 输入字符 C 的处理
mov al,ds:[si]
and al,11011111b ; 便于大小写都识别,将字符转换成大写
cmp al,43h
je draw1 ; 如果输入字符为 C,则跳转到 draw1 处
; 如果输入字符不为 C,则程序结束
mov ax,4c00h
int 21h
; ---------------------------------------
input:
; 实现键盘输入字符
mov bx,0
mov cx,20
re:
mov ah,1h ; DOS 中断,键盘键入回显,al 为字符
int 21h
cmp al,0dh ; 0dh 为回车的 ASCII 码
jz scx
mov si,offset zifu
mov [bx][si],al ; 将输入的字符放到 zifu 区
inc bx
loop re
ret
; --------------------------------------
scx:
; 条件跳转时对 cx 设置
mov cx,0
ret
; --------------------------------------
showmsg:
; 用来显示提示字符
mov ah,9h
int 21h
ret
; --------------------------------------
moshi:
; 屏幕显示模式
mov al,12h
mov ah,0
int 10h
ret
; -------------------------------------
zhuanshu:
; 将输入的 ASCII 码转为数字
mov bx,offset zifu
mov bp,offset shu
mov cx,16
mov si,0
mov di,0
lei:
mov al,ds:[bx][si]
cmp al,0
jz scx
sub al,30h
mov dl,100
mul dl
mov word ptr ds:[bp][di],ax
mov ax,0
mov al,ds:[bx][si+1]
sub al,30h
mov dl,10
mul dl
add ax,word ptr ds:[bp][di]
mov word ptr ds:[bp][di],ax
mov ax,0
mov al,ds:[bx][si+2]
sub al,30h
add ax,word ptr ds:[bp][di]
mov word ptr ds:[bp][di],ax
add si,4
add di,2
loop lei
ret
; -------------------------------------
draw1:
mov dx,offset hua1
call showmsg
call input
call zhuanshu
call moshi
mov bx,offset shu
mov ax,ds:[bx]
mov si,ax
mov ax,ds:[bx+2]
mov di,ax
call drawyuan
mov ax,4c00h
int 21h
code ends
end start
```
简单流程说明:
1. 首先提示用户输入 "C",如果用户输入 "C" 则跳转到 `draw1` 处,否则程序结束。
2. 在 `draw1` 中提示用户输入圆心和半径,将用户输入的字符转化为数字,并设置屏幕显示模式。
3. 计算圆的坐标,调用 `drawyuan` 程序来画圆。
4. 程序结束。
阅读全文