我在学习emu8086,你能帮我设计一个程序实现如下要求吗,从PC机系统中断向量表的占用情况可见,42H~4FH是系统未使用的中断向量,可利用它们开发用户自己软中断程序。 (1)实验要求利用47H号中断将一组字符转换成16进制数码,并在屏幕上显示出来。(必做) (2)编程求出一系列数据中的最大值、最小值,并送屏幕显示。要求:①将求最大值和最小值程序的程序段编写为46H号软中断,利用46H号中断调用实现求最大值和最小值功能;②将送屏幕显示用子程序实现。(选做)
时间: 2023-07-16 15:13:06 浏览: 313
当然可以!以下是实现要求的程序:
```
; 程序开始
assume cs:code, ds:data
data segment
buffer db 16 dup (?) ; 存储输入的字符
numList db 10, 20, 30, 40, 50 ; 待处理的数据列表
maxNum db 0 ; 最大值
minNum db 0 ; 最小值
data ends
code segment
start:
mov ax, data
mov ds, ax ; 初始化数据段寄存器
; 将47H号中断向量设置为当前程序的入口地址
mov dx, offset convert
mov ax, seg convert
mov es, ax
mov ax, 0047h
mov word ptr es:[ax*4], dx
; 将46H号中断向量设置为当前程序的入口地址
mov dx, offset findMinAndMax
mov ax, seg findMinAndMax
mov es, ax
mov ax, 0046h
mov word ptr es:[ax*4], dx
; 调用输入函数将字符读入 buffer 数组
call input
; 调用 47H 号中断将 buffer 数组中的字符转换成 16 进制数字
mov ah, 47h
int 47h
; 调用 46H 号中断求出最大值和最小值
mov ah, 46h
int 46h
; 显示结果
call display
mov ax, 4c00h ; 程序结束
int 21h
; 47H 号软中断,将字符转换成16进制数码
convert:
push ax ; 保存寄存器
push bx
push cx
push dx
push si
xor si, si ; 初始化索引
mov cx, 16 ; 循环 16 次,处理 buffer 数组中的每个字符
loop1:
mov al, buffer[si] ; 获取 buffer 数组中的字符
cmp al, 30h ; 判断字符是否为数字
jb skip ; 如果不是数字,则跳过
cmp al, 39h ; 判断字符是否为数字
ja skip ; 如果不是数字,则跳过
sub al, 30h ; 将字符转换成数字
mov bl, al ; 将数字保存到 bl 中
shl al, 4 ; 将数字左移 4 位
and al, 0F0h ; 将高 4 位清零
or al, bl ; 将低 4 位和高 4 位合并
mov buffer[si], al ; 将转换后的数字保存回 buffer 数组
skip:
inc si ; 索引加 1
loop loop1 ; 循环
pop si ; 恢复寄存器
pop dx
pop cx
pop bx
pop ax
iret ; 返回
; 46H 号软中断,求出一系列数据中的最大值、最小值
findMinAndMax:
push ax ; 保存寄存器
push bx
push cx
push dx
push si
mov maxNum, numList ; 初始化最大值为第一个数
mov minNum, numList ; 初始化最小值为第一个数
xor si, si ; 初始化索引
loop2:
mov al, numList[si] ; 获取 numList 数组中的数
cmp al, maxNum ; 判断是否大于当前最大值
jle notMax ; 如果不大于,则跳过
mov maxNum, al ; 更新最大值
jmp nextNum
notMax:
cmp al, minNum ; 判断是否小于当前最小值
jge nextNum ; 如果不小于,则跳过
mov minNum, al ; 更新最小值
nextNum:
inc si ; 索引加 1
cmp si, 5 ; 判断是否处理完所有的数
jl loop2 ; 如果没有处理完,则继续循环
pop si ; 恢复寄存器
pop dx
pop cx
pop bx
pop ax
iret ; 返回
; 显示结果的子程序
display:
; 显示转换后的数字
mov ah, 02h ; 调用中断 21H 的 02H 功能
mov cx, 16 ; 循环 16 次,显示 buffer 数组中的每个字符
mov si, offset buffer ; 初始化索引
loop3:
mov dl, buffer[si] ; 获取 buffer 数组中的字符
mov ah, 02h ; 调用中断 21H 的 02H 功能
int 21h ; 显示字符
inc si ; 索引加 1
loop loop3 ; 循环
; 显示最大值和最小值
mov ah, 09h ; 调用中断 21H 的 09H 功能
mov dx, offset maxMsg ; 显示最大值的提示信息
int 21h
mov ah, 02h ; 调用中断 21H 的 02H 功能
mov dl, maxNum ; 显示最大值
add dl, 30h ; 将数字转换成字符
int 21h ; 显示字符
mov dl, 0Ah ; 换行
int 21h ; 显示字符
mov dl, 0Dh ; 回车
int 21h ; 显示字符
mov ah, 09h ; 调用中断 21H 的 09H 功能
mov dx, offset minMsg ; 显示最小值的提示信息
int 21h
mov ah, 02h ; 调用中断 21H 的 02H 功能
mov dl, minNum ; 显示最小值
add dl, 30h ; 将数字转换成字符
int 21h ; 显示字符
mov dl, 0Ah ; 换行
int 21h ; 显示字符
mov dl, 0Dh ; 回车
int 21h ; 显示字符
ret ; 返回
; 调用中断 21H 的 01H 功能,读入一个字符
input:
mov ah, 01h ; 调用中断 21H 的 01H 功能
int 21h ; 读入一个字符
mov buffer, al ; 将读入的字符保存到 buffer 数组
ret ; 返回
; 显示最大值的提示信息
maxMsg db 'The maximum number is: $'
; 显示最小值的提示信息
minMsg db 'The minimum number is: $'
code ends
end start
```
希望这个程序对你有所帮助!
阅读全文