汇编语言:从键盘输入10个任意长度字符串(20位以内),将其按照ASCII码大小排序,并在屏幕上显示出来。
时间: 2023-06-12 08:04:50 浏览: 358
以下是一个可能的汇编语言程序,它可以从键盘输入10个长度不超过20的字符串,并将它们按照ASCII码大小排序后在屏幕上显示出来。
```assembly
section .data
; 用于存储10个字符串的数组
strings db 10*21 dup(0)
; 用于存储每个字符串的长度
lengths db 10 dup(0)
section .text
global _start
_start:
; 初始化寄存器
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
; 循环输入10个字符串
mov esi, strings ; esi 指向字符串数组的起始位置
mov edi, lengths ; edi 指向长度数组的起始位置
mov ecx, 10 ; ecx = 10,循环10次
input_loop:
; 输出提示信息
mov eax, 4
mov ebx, 1
mov edx, len_prompt
mov ecx, prompt
int 0x80
; 读取字符串
mov eax, 3
mov ebx, 0
mov edx, 20 ; 最多读取20个字符
int 0x80
; 计算字符串长度
xor ecx, ecx
mov cl, al ; al 中保存了读取的字符数
mov [edi], cl ; 将长度保存到长度数组中
inc edi ; 指向下一个长度
; 复制字符串到数组中
mov ecx, eax ; eax 中保存了读取的字符数
mov edi, esi ; edi 指向当前字符串的起始位置
rep movsb ; 复制字符串
; 准备输入下一个字符串
add esi, 21 ; 指向下一个字符串的起始位置
dec ecx ; 循环计数器减 1
jnz input_loop ; 如果还有字符串要输入,继续循环
; 排序字符串
xor eax, eax
mov ebx, 1 ; ebx = 1,表示需要排序
sort_loop:
; 初始化循环变量
xor ecx, ecx ; ecx = 0,表示当前位置
mov edx, 1 ; edx = 1,表示下一个位置
inner_loop:
; 比较当前字符串和下一个字符串的第一个字符
mov al, [strings + ecx]
mov bl, [strings + edx]
cmp al, bl
jbe next
; 交换两个字符串
mov al, [lengths + ecx]
mov bl, [lengths + edx]
mov [lengths + ecx], bl
mov [lengths + edx], al
mov esi, strings + ecx*21
mov edi, strings + edx*21
mov ecx, 21
rep movsb
next:
; 准备比较下一对字符串
inc ecx
inc edx
cmp edx, 10
jl inner_loop
; 如果没有发生交换,说明排序完成
test ebx, ebx
jz sorted
; 否则继续排序
mov ebx, 0
jmp sort_loop
sorted:
; 输出排序后的结果
mov esi, strings
mov edi, lengths
mov ecx, 10
output_loop:
; 输出字符串
mov eax, 4
mov ebx, 1
mov edx, [edi]
mov ecx, esi
add esi, 21
int 0x80
; 输出换行符
mov eax, 4
mov ebx, 1
mov edx, 1
mov ecx, newline
int 0x80
; 准备输出下一个字符串
inc edi
dec ecx
jnz output_loop
; 退出程序
mov eax, 1
xor ebx, ebx
int 0x80
section .data
; 用于输出提示信息的字符串
prompt db "请输入字符串:", 0
len_prompt equ $-prompt
; 用于输出换行符的字符串
newline db 10, 0
```
请注意,这只是一个示例程序,可能有一些细节需要根据具体情况进行修改。例如,程序中假设输入的字符串数为10,每个字符串的长度不超过20个字符,如果有更多或更长的字符串,需要相应地调整数组的大小和循环计数器的值。
阅读全文