用汇编语言在软件emu8086上编写以下程序:从键盘输入二个字符串,将二个字符串的字符合并后排序输出。
时间: 2024-03-20 19:41:19 浏览: 119
好的,以下是汇编程序的代码:
```
.model small
.stack 100h
.data
msg1 db 'Enter first string: $'
msg2 db 'Enter second string: $'
msg3 db 'Merged and sorted string: $'
input1 db 20,?,dup('$') ; 存放第一个字符串
input2 db 20,?,dup('$') ; 存放第二个字符串
merged db 40,?,dup('$') ; 存放合并后的字符串
nl db 10,13,'$' ; 换行符
.code
main proc
mov ax, @data
mov ds, ax ; 初始化数据段寄存器
; 输出提示信息,获取第一个字符串
lea dx, msg1
mov ah, 9
int 21h
lea dx, input1
mov ah, 0Ah
int 21h
; 输出提示信息,获取第二个字符串
lea dx, msg2
mov ah, 9
int 21h
lea dx, input2
mov ah, 0Ah
int 21h
; 合并两个字符串
lea si, input1
lea di, merged
mov cx, [si] ; 获取第一个字符串的长度
movsb ; 复制第一个字符串
lea si, input2
mov cx, [si] ; 获取第二个字符串的长度
movsb ; 复制第二个字符串
mov byte ptr [di], '$' ; 添加字符串结束符
; 排序合并后的字符串
lea si, merged ; SI 指向合并后的字符串
mov cl, [si] ; 获取字符串的长度
dec cl ; 长度减一,因为要去掉字符串结束符
mov di, si ; DI 指向字符串的开头
inc di ; DI 指向第一个字符
mov bx, di ; BX 存储当前比较字符的地址
sort_loop:
cmp cl, 0 ; 如果字符串已经排序完成,跳出循环
jle sort_done
mov cx, cl ; CX 存储当前字符串的长度
mov si, di ; SI 存储当前比较字符的地址
inc si ; SI 指向下一个字符
inner_loop:
cmp cx, 0 ; 如果已经比较完整个字符串,跳出循环
jle inner_done
mov al, [bx] ; AL 存储当前比较字符的值
mov dl, [si] ; DL 存储下一个字符的值
cmp al, dl ; 比较两个字符
jle no_swap ; 如果不需要交换,跳过
mov ah, [bx] ; 交换字符
mov al, [si]
mov [bx], al
mov [si], ah
no_swap:
inc si ; SI 移动到下一个字符
dec cx ; CX 减一
jmp inner_loop
inner_done:
inc di ; DI 移动到下一个字符
dec cl ; CX 减一
mov bx, di ; BX 存储当前比较字符的地址
jmp sort_loop
sort_done:
; 输出合并后的字符串
lea dx, msg3
mov ah, 9
int 21h
lea dx, merged
mov ah, 9
int 21h
lea dx, nl
mov ah, 9
int 21h
mov ah, 4ch
int 21h ; 程序结束
main endp
end main
```
上述程序使用 `int 21h` 中断来进行输入和输出操作,并使用字符串指针和字符串指令来处理字符串。它将两个输入的字符串合并为一个字符串,并对合并后的字符串进行冒泡排序。最后,它输出排序后的合并字符串。
阅读全文