在8086中编写从键盘输入一个字符串(包含数字和字母),找出其中的数字字符将其排序后输出到屏幕上
时间: 2024-04-05 21:29:01 浏览: 177
好的,我来为你展示一下如何使用 8086 汇编语言来实现这个程序。下面的代码使用的是 DOSBox 环境下的汇编器 TASM。
```assembly
.model small
.stack 100h
.data
prompt db "请输入一个字符串:$"
digits db 10 dup(0) ; 最多存储 10 个数字字符
newline db 0Dh, 0Ah, "$"
output db "排序后的数字字符为:$"
len_output equ $-output
.data?
buffer db 256 dup(0) ; 存储用户输入的字符串
.code
mov ax, @data
mov ds, ax
; 输出提示信息
mov ah, 9
lea dx, prompt
int 21h
; 读取用户输入的字符串
mov ah, 0Ah
lea dx, buffer
int 21h
; 找出数字字符并存储到 digits 数组中
lea si, buffer+1
lea di, digits
xor cx, cx ; cx 用于记录 digits 中数字字符的个数
find_digits:
mov al, [si]
cmp al, '$' ; 如果当前字符为 '$',则退出循环
je sort_digits
cmp al, '0'
jl not_digit
cmp al, '9'
jg not_digit
mov [di], al
inc di
inc cx
not_digit:
inc si
jmp find_digits
; 对 digits 数组进行排序
sort_digits:
mov bx, cx ; bx 用于记录 digits 中数字字符的个数
dec di ; di 此时指向 digits 数组最后一个元素
sort_loop:
mov cx, bx
dec cx
lea si, digits
inner_loop:
mov al, [si]
cmp al, [si+1]
ja swap
inc si
loop inner_loop
dec bx
jnz sort_loop
jmp print_digits
; 交换两个元素的值
swap:
xchg [si], [si+1]
inc si
ret
; 输出排序后的数字字符
print_digits:
mov ah, 9
lea dx, output
int 21h
lea si, digits
mov cx, bx ; cx 用于循环计数,初始值为 digits 中数字字符的个数
print_loop:
mov al, [si]
cmp al, '$' ; 如果当前字符为 '$',则退出循环
je end_program
mov dl, al
mov ah, 2
int 21h
inc si
loop print_loop
; 输出换行符并退出程序
end_program:
lea dx, newline
mov ah, 9
int 21h
mov ah, 4Ch
int 21h
```
这个程序首先会输出一个提示信息,然后调用 DOS 系统调用 `ah=0Ah` 读取用户输入的字符串。接着,程序会遍历用户输入的字符串,找出其中的数字字符,并存储到一个名为 `digits` 的数组中。这里我们假设最多只会有 10 个数字字符,因此 `digits` 数组的大小为 10 字节。
接下来,程序会对 `digits` 数组进行排序。这里我们使用冒泡排序算法。排序结束后,程序会输出一个提示信息,然后遍历 `digits` 数组,依次输出其中的数字字符。最后,程序会输出一个换行符并退出。
需要注意的是,这个程序使用了 DOS 系统调用。如果你的操作系统不是 DOS,那么你需要使用相应的系统调用来实现相同的功能。
阅读全文