从键盘输入10个带符号字节数据(如-56),将其从小到大排序,并将结果在显示器上以十进制形式显示输出。(要求写出主程序调用子程序的程序段。)
时间: 2023-05-31 19:17:46 浏览: 179
### 回答1:
主程序调用子程序的程序段:
```
.model small
.stack 100h
.data
arr db 10 dup(?) ; 存储输入的10个带符号字节数据
n db 10 ; 数据个数
.code
main proc
mov ax, @data
mov ds, ax
; 从键盘输入10个带符号字节数据
mov cx, 10
lea di, arr
input_loop:
mov ah, 01h ; 读入一个字符
int 21h
cmp al, '-' ; 判断是否为负号
jne not_minus
mov bl, al
mov ah, 01h ; 读入下一个字符
int 21h
sub al, '' ; 将数字字符转换为数字
neg al ; 取反
mov bh, al
or bh, 80h ; 设置符号位
mov [di], bh ; 存储带符号字节数据
inc di
jmp input_end
not_minus:
sub al, '' ; 将数字字符转换为数字
mov [di], al ; 存储带符号字节数据
inc di
input_end:
loop input_loop
; 调用排序子程序
lea si, arr
mov al, n
call sort
; 将排序后的结果在显示器上以十进制形式显示输出
mov cx, 10
lea si, arr
output_loop:
mov ah, 02h ; 显示一个字符
mov dl, '['
int 21h
mov ah, 02h ; 显示一个字符
mov al, [si]
cmp al, 80h ; 判断符号位
jne not_negative
neg al ; 取反
mov bl, '-'
mov ah, 02h ; 显示一个字符
mov dl, bl
int 21h
not_negative:
add al, '' ; 将数字转换为数字字符
mov ah, 02h ; 显示一个字符
mov dl, al
int 21h
mov ah, 02h ; 显示一个字符
mov dl, ']'
int 21h
inc si
loop output_loop
mov ah, 4ch
int 21h
main endp
; 排序子程序
; 输入:si-存储带符号字节数据的数组的首地址,al-数据个数
; 输出:si-排序后的数组的首地址
sort proc
push ax
push bx
push cx
push di
mov cx, al ; 数据个数
dec cx
outer_loop:
mov di, si ; 每次循环开始时,将di指向数组的首地址
mov bx, di ; 将bx指向数组的首地址
inner_loop:
mov al, [bx+1] ; 取出下一个字节数据
cmp al, [bx] ; 比较当前字节数据和下一个字节数据的大小
jge not_swap ; 如果当前字节数据小于下一个字节数据,则不需要交换
xchg al, [bx] ; 交换当前字节数据和下一个字节数据
mov [bx+1], al ; 将下一个字节数据存回数组
not_swap:
inc bx
loop inner_loop
dec cx
jnz outer_loop
pop di
pop cx
pop bx
pop ax
ret
sort endp
end
```
### 回答2:
主程序调用子程序的程序段:
```
TITLE sort_by_byte ;程序名称
INCLUDE Irvine32.inc ;包含库函数
.data ;定义数据段
arr BYTE 10 DUP(?) ;定义10字节符号数组
.code ;定义代码段
main PROC ;主程序开始
mov ecx, LENGTHOF arr ;把数组的长度赋给ecx寄存器
lea ebx, arr ;把数组地址赋给ebx寄存器
mov edi, 0 ;把计数器清零,并赋给edi寄存器
input_loop: ;输入字节数据
mov edx, OFFSET arr_msg ;输出提示信息
call WriteString
mov edx, OFFSET arr[edi] ;输出当前位置提示信息
call WriteString
call ReadChar ;读取符号
mov [ebx+edi], al ;存储字节数据
inc edi ;计数器自增1
loop input_loop ;如果还未输入完10个数据,则跳转到input_loop
call sort_byte ;调用排序子程序
mov ecx, LENGTHOF arr
lea ebx, arr
output_loop: ;输出排序后的结果
mov edx, OFFSET sorted_arr_msg ;输出排序后的提示信息
call WriteString
mov edx, OFFSET arr[edi] ;输出当前位置的数据
call WriteString
call WriteDec ;以十进制形式输出
inc edi ;计数器自增1
loop output_loop ;如果还未输出完排序后的结果,则跳转到output_loop
call Crlf ;换行
exit ;退出程序
main ENDP ;主程序结束
;字节排序子程序开始
sort_byte PROC
push ebp ;保留ebp现场
mov ebp, esp ;移动esp值到ebp
push esi ;保留esi现场
push edi ;保留edi现场
xor ecx, ecx ;清零ecx寄存器
mov esi, [ebp+8] ;获取数组地址,并赋给esi寄存器
mov edx, LENGTHOF arr ;获取数组长度,并赋给edx寄存器
byte_loop:
mov al, [esi+ecx]
mov ebx, ecx ;ebx = i
cmp ebx, edx ;比较i是否小于数组长度
jge byte_done ;如果i>=数组长度,那么证明已经排好序了,跳转到byte_done
inner_loop:
mov dl, [esi+ebx+1]
cmp al, dl
jle nobyte_swap
;如果arr[i] > arr[j],则交换两个元素的位置
mov dl, [esi+ecx]
mov [esi+ecx], byte dl
mov [esi+ecx+1], byte al
mov al, dl
nobyte_swap:
inc ebx
cmp ebx, edx
jl inner_loop
inc ecx ;处理下一个字节
jmp byte_loop ;跳转到byte_loop继续排序
byte_done:
pop edi ;恢复现场
pop esi
pop ebp
ret
sort_byte ENDP ;字节排序子程序结束
arr_msg BYTE "请输入第", 0
sorted_arr_msg BYTE "排序后的结果:", 0
main ENDP
END main ;结束程序
```
按照以上代码,我们便可以将10个符号字节数据从小到大排序,并以十进制形式输出到显示器上。
### 回答3:
题目要求输入10个带符号字节数据,并且要求进行从小到大排序,最后以十进制形式将结果输出。我们可以采用冒泡排序算法来对这些数据进行排序。主程序调用子程序的程序段如下所示:
```
;定义数据区
Data1 DB -56, 23, 34, 12, -45, 67, 0, 54, -23, 9
;定义变量
Temp DB 0
Index1 DB 0
Index2 DB 0
Counter DB 0
Main:
;排序
Mov Counter, 10 ;设置计数器为10
Sort:
Mov Index1, 0 ;设置第一个索引
Next:
Mov Index2, Index1 + 1 ;设置第二个索引
Cmp Counter, Index2 ;比较计数器和索引2
Je Done ;如果相等,则跳转到结束
Mov Al, Data1[Index1] ;取数据1中的值
Cmp Al, Data1[Index2] ;比较两个值
Jle Skip ;如果第一个值小于第二个值,则跳过交换
Mov Temp, Data1[Index1] ;交换两个值
Mov Data1[Index1], Data1[Index2]
Mov Data1[Index2], Temp
Skip:
Inc Index1 ;增加索引1
Jmp Next ;跳转到下一个
Done:
;输出结果
Mov Counter, 10 ;重新设置计数器为10
Print:
Mov Al, Data1[Index1] ;取数据1中的值
Cbw ;扩展符号位
Call DispInt ;调用子程序DispInt显示结果
Inc Index1
Dec Counter ;减少计数器
Jnz Print ;如果计数器不为0,则跳转到输出
;结束程序
Mov Ax, 4C00h ;调用系统中断
Int 21h
;子程序DispInt
DispInt:
;将十进制数转换为字符串
Push Bx
Mov Bx, 10
Div Bx
Push Ax
Cmp Al, 0
Jz Next
Call DispInt
Next:
Pop Ax
Add Al, 48
Mov Ah, 02h
Int 21h
Pop Bx
Ret
```
在这个程序段中,我们首先在数据区定义了10个带符号字节数据。然后,在主程序中对这些数据进行排序,并将排序后的结果以十进制形式输出。我们使用计数器来控制循环次数,使用索引来比较每个数据的大小并交换它们的位置。在输出结果的循环中,我们先将每个字节数据扩展符号位,然后调用子程序DispInt将其转换为字符串并输出。子程序DispInt利用递归方式将每个字节转换为字符串,并将结果以ASCII码的形式输出到屏幕上。
需要注意的是,这里我们采用了冒泡排序算法,它的时间复杂度为O(n^2),虽然它的算法复杂度较高,但是由于数据规模较小,所以使用冒泡排序算法并不会影响程序的执行速度。