我想编写一个 8086 汇编程序,它从用户那里获取 5 个字符串作为输入,然后对这些字符串进行排序并将排序结果打印为输出。我实际上做了所有事情,但排序部分有一个大问题。我知道如何使用例如冒泡排序对数组中从特定地址开始的项目进行排序,但在这里我有 5 个不同的字符串,它们不在同一个数组中。每个字符串都有自己的地址和自己的字符。我尝试将每个字符串的最后一个字符相互比较,然后如果一个大于另一个,我交换整个字符串,然后我继续对所有字符串的整个字符执行此操作到第一个。
例如,如果我们的输入字符串是:
eab
abe
cbd
cda
adb
我将首先对每个字符串的最后一个字符进行排序,然后得出以下结论:
cda
eab
adb
cbd
abe
然后我将通过中间字符进行比较:
eab
cbd
abe
cda
adb
最后是第一个字符,所有内容都已排序:
abe
adb
cbd
cda
eab
但这实际上是我的想法,我不知道谁来为我的工作实施它。
; 多段可执行文件模板。 数据段 data1 db 64,?,64 dup(?) data2 db 64,?,64 dup(?) data3 db 64,?,64 dup(?) data4 db 64,?,64 dup(?) data5 db 64,?,64 dup(?) 更改 db 66 重复(?) msg db 0ah,0dh,"你输入了错误的选项",0ah,0dh,"再试一次",0ah,0dh,"$" 提示 db 0ah,0dh,"选择一个选项:",0ah,0dh,"$" prompt1 db ".a: 升序排序",0ah,0dh,"$" prompt2 db ".d: 降序排序",0ah,0dh,"$" prompt3 db ".q: 退出",0ah,0ah,0dh,"$" 输入 db 0ah,0ah,0dh,"输入 5 个字符串:",0ah,0dh,"$" pkey db 0ah,0dh,"按任意键...$" 结束 堆栈段 dw 128 重复(0) 结束 代码段 主要过程远 ; 设置段寄存器: mov 斧头,数据 mov ds, ax 移动,斧头 再次: ; 为用户打印提示 领导 dx,提示 mov 啊, 09h 整数 21 小时 铅dx,提示1 mov 啊, 09h 整数 21 小时 铅dx,提示2 mov 啊, 09h 整数 21 小时 铅dx,提示3 mov 啊, 09h 整数 21 小时 ; 从用户那里获取一个字符作为输入 mov 啊, 01h 整数 21 小时 ; 确定用户选择哪个选项 cmp al, 'a' je 上升 cmp al, 'd' je 下降 cmp al, 'q' 退出 ; 这是用户输入错误字符的时间 铅dx,味精 mov 啊, 09h 整数 21 小时 再次跳转;再次调用应用程序启动 上升: 呼叫输入 调用 AscendSort 再次跳转;再次调用应用程序启动 降序: 呼叫输入 调用 DescendSort 再次跳转;再次调用应用程序启动 辞职: 铅 dx, pkey 动啊,9 诠释 21 小时;在 ds:dx 处输出字符串 ; 等待任何关键.... 动啊,1 整数 21 小时 移动斧头,4c00h;退出操作系统。 整数 21 小时 主要终端 ;.................................................. ; 这个子程序从用户那里得到输入 输入过程 领导 dx,输入 mov 啊, 09h 整数 21 小时 调用换行符 动啊,0啊 铅dx,数据1 整数 21 小时 调用换行符 动啊,0啊 铅dx,数据2 整数 21 小时 调用换行符 动啊,0啊 铅dx,数据3 整数 21 小时 调用换行符 动啊,0啊 铅dx,data4 整数 21 小时 调用换行符 动啊,0啊 铅dx,数据2 整数 21 小时 调用换行符 ret 输入端 ……………………………………………………………………………………………………………… ; 按升序对字符串进行排序 AscendSort 过程 mov si, 65 领导 dx,改变 移动,数据1[si] cmp al, data2[si] ja l1 ??? ret 升序排序结束 ……………………………………………………………………………………………………………… ; 按降序对字符串进行排序 DescendSort 过程 ret 降序排序结束 ……………………………………………………………………………………………………………… ; 新队 换行程序 mov 啊, 02h mov dl, 0ah 整数 21 小时 移动 dl, 0dh 整数 21 小时 ret 换行符 endp 结束 结束主要;设置入口点并停止汇编程序。
用于对这些整个字符串进行排序的任何其他算法也将受到赞赏。