用8086汇编语言在显示屏中央开一个大小可以调整的窗口(行列的象素数,可由用户输入两个数字调整)并在窗口中以拼音显示自己的名字
时间: 2024-02-12 12:07:20 浏览: 34
以下是用8086汇编语言实现的程序,可以在DOSBox中运行:
```assembly
.model small
.stack 100h
.data
rows dw ?
cols dw ?
; 定义字符显示区域
char_start equ 0B800h ; 显存开始地址
char_end equ 0BFFFh ; 显存结束地址
char_width equ 80 ; 每行显示字符数
char_height equ 25 ; 总共显示行数
; 定义窗口显示区域
win_start dw ?
win_end dw ?
win_width dw ?
win_height dw ?
; 定义名字字符串
name db 'Your name in pinyin', 0
.code
main proc
; 初始化段寄存器
mov ax, @data
mov ds, ax
; 获取用户输入的行列数
mov ah, 0Ah ; 功能号为0Ah,读取带回显的字符串
mov dx, offset rows ; 存储用户输入的行数
int 21h ; 调用DOS中断
mov ah, 0Ah
mov dx, offset cols ; 存储用户输入的列数
int 21h
; 计算窗口的起始和结束地址
mov ax, char_start ; 显存开始地址
add ax, 2*char_width ; 加上前两行的位置
mov win_start, ax ; 窗口起始地址
mov bx, rows ; 行数
sub bx, win_height ; 窗口高度
shr bx, 1 ; 取一半,使窗口居中
mov ax, char_width ; 列数
mul bx ; 计算行偏移量
add ax, win_start ; 加上起始地址
mov win_start, ax ; 窗口起始地址
mov bx, cols ; 列数
sub bx, win_width ; 窗口宽度
shr bx, 1 ; 取一半,使窗口居中
mov ax, bx ; 计算列偏移量
add ax, win_start ; 加上起始地址
mov win_start, ax ; 窗口起始地址
mov ax, win_start
add ax, win_width ; 计算窗口结束地址
sub ax, 1 ; 减1,因为地址从0开始
mov win_end, ax ; 窗口结束地址
; 显示窗口
mov si, win_start
mov cx, win_height
mov dx, win_width
mov bh, 11110000b ; 设置窗口边框颜色
call draw_border ; 绘制窗口边框
; 显示名字
mov ax, win_start
add ax, win_width ; 计算名字起始地址
sub ax, 14 ; 减去名字长度
mov si, ax ; 存储名字起始地址
mov di, offset name ; 存储名字字符串地址
call display_string ; 显示名字
; 等待用户输入
mov ah, 0
int 16h ; 调用BIOS中断读取键盘输入
; 退出程序
mov ah, 4Ch
int 21h
main endp
; 绘制窗口边框
draw_border proc
push ax
push bx
push cx
push dx
push si
push di
push bp
; 绘制上边框
mov al, bh ; 边框颜色
mov cx, dx ; 边框宽度
mov di, si
rep stosw
; 绘制左右边框
mov cx, cx-2 ; 不包括两个角落
mov bp, char_width
mov di, si
add di, bp ; 第二行开始
add di, dx ; 右边框
mov al, bh ; 边框颜色
push cx ; 保存循环计数器
mov cx, win_height-2 ; 不包括上下边框
rep stosw
pop cx ; 恢复循环计数器
; 绘制下边框
mov al, bh ; 边框颜色
mov cx, dx ; 边框宽度
mov di, si
add di, bp*(win_height-1) ; 最后一行
rep stosw
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
draw_border endp
; 显示字符串
display_string proc
push ax
push bx
push cx
push dx
push si
push di
mov bx, 0B800h ; 显存开始地址
mov es, bx
mov bx, si ; 存储字符串起始地址
; 显示字符串
mov cx, 0 ; 计数器清零
mov cl, byte ptr [bx] ; 获取字符串长度
inc bx ; 跳过长度字节
mov al, 07h ; 设定字符属性
mov ah, al ; 复制一份备用
mov si, bx ; 存储字符串内容起始地址
mov di, char_start ; 存储屏幕显示地址
add di, 2*char_width ; 加上前两行的位置
add di, dx ; 加上窗口左边框的位置
add di, char_width ; 加上第一行的位置
mov bx, char_width ; 存储每行字符数
call display_line ; 显示一行字符串
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
display_string endp
; 显示一行字符串
display_line proc
push ax
push bx
push cx
push dx
push si
push di
mov cx, bx ; 存储每行字符数
rep movsb ; 复制字符串到显存
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
display_line endp
end main
```
在程序运行时,会提示用户输入行数和列数,然后在屏幕中心显示一个可以调整大小的窗口,并在窗口中央显示拼音名字。用户可以通过按任意键退出程序。