gpt4 book ai didi

string - 在 8086 程序集中对字符串进行排序

转载 作者:行者123 更新时间:2023-12-04 05:14:07 25 4
gpt4 key购买 nike

我想编写一个 8086 汇编程序,它从用户那里获取 5 个字符串作为输入,然后对这些字符串进行排序并打印排序结果作为输出。我实际上什么都做,但我在排序部分有一个大问题。我知道如何使用例如冒泡排序对从特定地址开始的数组中的项目进行排序,但在这里我有 5 个不同的字符串,它们不在同一个数组中。每个字符串都有自己的地址和自己的字符。我尝试将每个字符串的最后一个字符相互比较,然后如果一个比另一个大,我交换整个字符串,然后我继续对所有字符串的整个字符执行此操作到第一个。

例如,如果我们的输入字符串是:

eab    
abe
cbd
cda
adb

我将首先对每个字符串的最后一个字符进行排序,然后我想出了这个:
cda    
eab
adb
cbd
abe

然后我将通过中间字符比较它们:
eab    
cbd
abe
cda
adb

最后是第一个字符,所有内容都已排序:
abe
adb
cbd
cda
eab

但这实际上是我的想法,我不知道由谁来为我的工作实现。

;多段可执行文件模板。

数据段
数据 1 db 64,?,64 dup(?)
data2 db 64,?,64 dup(?)
data3 db 64,?,64 dup(?)
data4 db 64,?,64 dup(?)
数据 5 db 64,?,64 dup(?)

更改 db 66 dup(?)

msg db 0ah,0dh,"您输入了错误的选项",0ah,0dh,"再试一次",0ah,0dh,"$"
prompt db 0ah,0dh,"选择一个选项:",0ah,0dh,"$"
prompt1 db ".a: 按升序排序",0ah,0dh,"$"
prompt2 db ".d: 按降序排序",0ah,0dh,"$"
prompt3 db ".q: Quit",0ah,0ah,0dh,"$"
输入db 0ah,0ah,0dh,"输入5个字符串:",0ah,0dh,"$"
pkey db 0ah,0dh,"按任意键...$"
结束

堆栈段
dw 128 重复 (0)
结束

代码段
主进程远
;设置段寄存器:
mov ax, 数据
mov ds, ax
移动,斧头

再次:
;为用户打印提示
lea dx, 提示
移动啊,09h
21 小时

lea dx, prompt1
移动啊,09h
21 小时

lea dx, prompt2
移动啊,09h
21 小时

lea dx, prompt3
移动啊,09h
21 小时

;从用户那里获取一个字符作为输入
移动啊,01h
21 小时

;确定用户选择哪个选项
cmp al, 'a'
je 上升
cmp al, 'd'
je 下降
cmp al, 'q'
我不干了

;这是用户输入错误字符的时间
铅 dx, 消息
移动啊,09h
21 小时
再次 jmp ;再次调用应用程序启动

升序:
调用输入
调用升序排序
再次 jmp ;再次调用应用程序启动

降序:
调用输入
调用降序排序
再次 jmp ;再次调用应用程序启动

退出:
lea dx, pkey
动啊,9
整数 21 小时; ds:dx 处的输出字符串

;等待任何键....
动啊,1
21 小时

移动斧头,4c00h;退出操作系统。
21 小时
主端
;……………………………………………………………………………………………………………………………………………………………………………………
;这个子程序从用户那里获取输入
输入过程

领导 dx,输入
移动啊,09h
21 小时
调用换行符

移动啊,0啊
铅 dx, 数据 1
21 小时
调用换行符

移动啊,0啊
领导 dx,数据 2
21 小时
调用换行符

移动啊,0啊
领导 dx, 数据 3
21 小时
调用换行符

移动啊,0啊
领导 dx,数据 4
21 小时
调用换行符

移动啊,0啊
铅 dx, 数据 2
21 小时
调用换行符

回复
输入端
;……………………………………………………………………………………………………………………………………………………………………
;按升序对字符串进行排序
升序排序过程

mov si, 65
领导 dx,改变
mov al, data1[si]
cmp al, data2[si]
ja l1
?????

回复
升序排序结束
;……………………………………………………………………………………………………………………………………………………………………
;按降序对字符串进行排序
降序排序过程

回复
降序排序
;……………………………………………………………………………………………………………………………………………………………………
;换行
换行过程

动啊,02h
mov dl, 0ah
21 小时

mov dl, 0dh
21 小时

回复
换行符
结束

结束主要;设置入口点并停止汇编程序。

用于对这些整个字符串进行排序的任何其他算法也将受到赞赏。

最佳答案

我实际上自己找出了答案,我使用字符串命令将字符串 2 x 2 相互比较,看看它们是更大、更小还是相等。类似于下面特定宏中的代码,它需要两个字符串来检查它们并执行所需的操作,例如交换字符串以使它们排序:

check macro a, b
local next, finish
cld
mov cx, 64 ; the size of our buffer that saves the string
mov si, a
mov di, b

repe cmpsb ; comparing two strings with each other
ja next
jmp finish

next:
; swaping our strings if needed
mov cx, 64
mov si, a
lea di, change
rep movsb

mov cx, 64
mov si, b
mov di, a
rep movsb

mov cx, 64
lea si, change
mov di, b
rep movsb

finish:

endm

关于string - 在 8086 程序集中对字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14507086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com