从键盘输入10个带符号字节数据(如-56),将其从小到大排序,并将结果在显示器上以十进制形式显示输出。(要求写出主程序调用子程序的程序段。)
时间: 2024-05-04 17:18:53 浏览: 10
以下是使用选择排序算法实现的子程序,可以实现对带符号字节数据从小到大排序:
```
; 子程序:选择排序
; 输入:数组的地址(参数1),数组长度(参数2)
; 输出:无
; 副作用:原数组按照从小到大排序
SelectionSort PROC
push bp
mov bp, sp
push bx
push cx
push dx
push si
push di
mov si, [bp+4] ; 数组的地址
mov cx, [bp+6] ; 数组长度
mov di, si ; 初始化指针
mov bl, [si] ; 初始化最小值
OuterLoop:
mov si, di ; 从当前位置开始查找最小值
mov al, [si]
mov bx, si
InnerLoop:
cmp al, [si+1] ; 比较当前值和下一个值
jle NextValue
mov al, [si+1] ; 更新最小值
mov bx, si+1
NextValue:
inc si ; 指向下一个值
loop InnerLoop ; 循环比较
cmp di, bx ; 如果最小值不在当前位置,则交换
je SkipExchange
mov dl, [di]
xchg dl, [bx]
mov [di], dl
SkipExchange:
inc di ; 指向下一个位置
loop OuterLoop ; 循环排序
pop di
pop si
pop dx
pop cx
pop bx
pop bp
ret
SelectionSort ENDP
```
下面是主程序调用子程序的程序段:
```
.MODEL SMALL
.STACK 100h
.DATA
arr DB 10 DUP(?) ; 定义长度为10的数组
.CODE
MAIN PROC
mov ax, @data ; 初始化数据段寄存器
mov ds, ax
; 从键盘输入10个带符号字节数据
mov cx, 10
mov si, offset arr
InputLoop:
mov ah, 01h ; 读取键盘输入的字符
int 21h
cmp al, '-' ; 判断是否为负数
jne NotNegative
neg al ; 转换为负数
NotNegative:
mov [si], al ; 存储到数组中
inc si
loop InputLoop ; 循环输入
; 调用选择排序子程序对数组进行排序
mov si, offset arr
mov cx, 10
call SelectionSort
; 在显示器上以十进制形式显示排序后的数组
mov cx, 10
mov si, offset arr
OutputLoop:
mov dl, [si]
add dl, 30h ; 转换为ASCII码
mov ah, 02h ; 输出字符
int 21h
inc si
loop OutputLoop ; 循环输出
mov ah, 4ch ; 结束程序
int 21h
MAIN ENDP
END MAIN
```