在电脑上输入L,之后提示输入两个点的坐标值,显示一段直线。 (要求改程序能够重复运行、刷新图形)请在dos环境下用汇编语言实现此功能并解释每行代码含义
时间: 2024-03-12 18:44:02 浏览: 182
以下是用汇编语言实现在电脑上输入L,之后提示输入两个点的坐标值,显示一段直线的程序:
```assembly
assume cs:code
data segment
x1 dw ?
y1 dw ?
x2 dw ?
y2 dw ?
slope db ?
x db ?
y db ?
data ends
code segment
start:
mov ax, @data
mov ds, ax
; 清屏
mov ah, 0
mov al, 3
int 10h
; 设置光标位置
mov ah, 2
mov bh, 0
mov dh, 0
mov dl, 0
int 10h
; 输出提示信息
mov ah, 9
lea dx, prompt1
int 21h
; 输入第一个点的坐标
mov ah, 1
int 21h
mov bl, al
mov bh, 0
mov ah, 1
int 21h
sub al, 30h
mov [x1], ax
mov ah, 1
int 21h
mov bl, al
mov bh, 0
mov ah, 1
int 21h
sub al, 30h
mov [y1], ax
; 输出提示信息
mov ah, 9
lea dx, prompt2
int 21h
; 输入第二个点的坐标
mov ah, 1
int 21h
mov bl, al
mov bh, 0
mov ah, 1
int 21h
sub al, 30h
mov [x2], ax
mov ah, 1
int 21h
mov bl, al
mov bh, 0
mov ah, 1
int 21h
sub al, 30h
mov [y2], ax
; 计算斜率
mov ax, [y2]
sub ax, [y1]
mov bx, [x2]
sub bx, [x1]
cwd
div bx
mov [slope], al
; 输出直线
mov x, [x1]
mov y, [y1]
mov ah, 0ch
mov al, 219
mov bh, 0
mov bl, 0fh
draw_line:
cmp x, [x2]
jg end_draw_line
inc x
mov ax, x
sub ax, [x1]
mul [slope]
mov bx, ax
mov ax, [y1]
add ax, bx
mov y, ax
mov ah, 0ch
mov al, 219
mov bh, 0
mov bl, 0fh
mov cx, 1
int 10h
jmp draw_line
end_draw_line:
; 输出提示信息
mov ah, 9
lea dx, prompt3
int 21h
; 等待用户按下任意键
mov ah, 0
int 16h
; 回到开始处,重复运行
jmp start
prompt1 db '请输入第一个点的坐标(x1,y1):$'
prompt2 db '请输入第二个点的坐标(x2,y2):$'
prompt3 db '按任意键重新开始...$'
code ends
end start
```
代码分析:
1. `assume cs:code`:将代码段赋值给代码段寄存器 CS。
2. `data segment`:数据段开始。
3. `x1 dw ?`、`y1 dw ?`、`x2 dw ?`、`y2 dw ?`:定义四个字的变量,用于存储两个点的坐标。
4. `slope db ?`:定义一个字节的变量,用于存储直线的斜率。
5. `x db ?`、`y db ?`:定义两个字节的变量,用于存储当前绘制的点的坐标。
6. `data ends`:数据段结束。
7. `code segment`:代码段开始。
8. `start:`:程序入口。
9. `mov ax, @data`、`mov ds, ax`:将数据段地址存入 AX 寄存器,再将其赋值给 DS 寄存器。
10. `mov ah, 0`、`mov al, 3`、`int 10h`:调用中断 10h 的功能号 00h,将屏幕清空。
11. `mov ah, 2`、`mov bh, 0`、`mov dh, 0`、`mov dl, 0`、`int 10h`:调用中断 10h 的功能号 02h,将光标位置设置为 (0,0)。
12. `mov ah, 9`、`lea dx, prompt1`、`int 21h`:调用中断 21h 的功能号 09h,将提示信息输出到屏幕上。
13. `mov ah, 1`、`int 21h`、`mov bl, al`、`mov bh, 0`、`mov ah, 1`、`int 21h`、`sub al, 30h`、`mov [x1], ax`:调用中断 21h 的功能号 01h,等待用户输入一个字符,将其存入 AL 寄存器,再将其转换成数字,存入 X1 变量。
14. 同上,将用户输入的第一个点的 y 坐标存入 Y1 变量。
15. `mov ah, 9`、`lea dx, prompt2`、`int 21h`:同上,输出提示信息。
16. 同第 13 步和第 14 步,将用户输入的第二个点的 x 和 y 坐标存入 X2 和 Y2 变量。
17. `mov ax, [y2]`、`sub ax, [y1]`、`mov bx, [x2]`、`sub bx, [x1]`、`cwd`、`div bx`、`mov [slope], al`:计算直线的斜率,存入 Slope 变量。
18. `mov x, [x1]`、`mov y, [y1]`、`mov ah, 0ch`、`mov al, 219`、`mov bh, 0`、`mov bl, 0fh`:将当前点的坐标初始化为第一个点的坐标,设置绘制直线的符号和颜色。
19. `cmp x, [x2]`、`jg end_draw_line`:比较当前点的 x 坐标和第二个点的 x 坐标,如果大于等于第二个点的 x 坐标,则跳转到程序结尾。
20. `inc x`、`mov ax, x`、`sub ax, [x1]`、`mul [slope]`、`mov bx, ax`、`mov ax, [y1]`、`add ax, bx`、`mov y, ax`、`mov ah, 0ch`、`mov al, 219`、`mov bh, 0`、`mov bl, 0fh`、`mov cx, 1`、`int 10h`、`jmp draw_line`:将当前点的 x 坐标加 1,计算当前点的 y 坐标,输出当前点,跳转到绘制下一个点。
21. `end_draw_line:`:绘制直线结束。
22. `mov ah, 9`、`lea dx, prompt3`、`int 21h`:输出提示信息。
23. `mov ah, 0`、`int 16h`:等待用户按下任意键。
24. `jmp start`:跳转到程序开头,重复运行。
25. `prompt1 db '请输入第一个点的坐标(x1,y1):$'`、`prompt2 db '请输入第二个点的坐标(x2,y2):$'`、`prompt3 db '按任意键重新开始...$'`:定义三个字符串,用于输出提示信息。
26. `code ends`:代码段结束。
27. `end start`:程序结束。
这个程序的主要步骤是:清屏、输出提示信息、等待用户输入两个点的坐标、计算直线的斜率、绘制直线、输出提示信息、等待用户按下任意键。程序使用了中断 10h 和 21h 来控制屏幕的输出和用户的输入。
阅读全文