用emu8086格式,已知在 DATA 开始的字单元中存放有 10 个无符号整数,试编制程序挑选出其 中的最大值和最小值并显示。
时间: 2024-04-30 17:22:31 浏览: 12
以下是使用emu8086格式编写的程序,可以找到给定数据中的最大值和最小值并将它们显示出来:
```
org 100h
section .data
arr dw 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ; 数据存储在 DATA 段中
section .text
mov ax, 0
mov bx, 0
mov cx, 10
; 查找最大值
find_max:
mov dx, [arr + bx] ; 从数组中获取一个数
cmp dx, ax ; 比较该数和当前已知的最大值
jle next ; 如果该数小于或等于当前最大值,则跳过
mov ax, dx ; 否则将该数作为新的最大值
next:
add bx, 2 ; 获取下一个数
loop find_max ; 继续查找,直到所有数都被处理过
; 查找最小值
mov ax, 65535 ; 将最大值赋给 ax
mov bx, 0
mov cx, 10
find_min:
mov dx, [arr + bx] ; 从数组中获取一个数
cmp dx, ax ; 比较该数和当前已知的最小值
jge next2 ; 如果该数大于或等于当前最小值,则跳过
mov ax, dx ; 否则将该数作为新的最小值
next2:
add bx, 2 ; 获取下一个数
loop find_min ; 继续查找,直到所有数都被处理过
; 显示结果
mov ah, 9
lea dx, [msg1]
int 21h
mov ax, [arr]
call print_num
mov ah, 9
lea dx, [msg2]
int 21h
mov ax, [arr + 18]
call print_num
jmp exit
print_num:
push ax
push bx
push cx
push dx
mov bx, 10
xor cx, cx
cld
divide:
xor dx, dx
div bx
push dx
inc cx
cmp ax, 0
jne divide
print:
pop ax
add al, 30h
mov dl, al
mov ah, 2
int 21h
pop dx
dec cx
cmp cx, 0
jne print
pop cx
pop bx
pop ax
ret
msg1 db 'Maximum value: ', 13, 10, '$'
msg2 db 'Minimum value: ', 13, 10, '$'
exit:
mov ah, 4ch
int 21h
```
在上面的程序中,我们首先定义了一个包含 10 个数字的数组。然后,我们使用两个循环来查找数组中的最大值和最小值。最大值的查找过程与最小值的查找过程类似,只是我们要将初始值设置为一个很小的数(例如,0),而不是一个很大的数。
一旦我们找到了最大值和最小值,我们使用一个名为 `print_num` 的子例程来将它们打印出来。该子例程将数字转换为字符串,并将其打印到屏幕上。
最后,我们显示一些消息,然后退出程序。