【发布时间】:2013-01-08 13:09:06
【问题描述】:
我想编写一个 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 结束 结束主要;设置入口点并停止汇编程序。任何其他排序这些整个字符串的算法也将受到赞赏。
【问题讨论】:
-
您选择的基数(又名分布)排序适用于短且具有固定长度的字符串。一般来说,排序是一个足够复杂的问题,我会先用高级语言编写一个版本,以使我的算法直截了当,然后将其移植到汇编程序。
-
您是否总是对 5 个字符串进行准确排序,永远不会多也不会少?那么你应该调查sort networks。这些比一般的排序算法更快、更简单。
-
是的,输入就是需要排序的5个字符串,不多也不少。
-
我并不坚持这种基数排序,而且我知道如何在 Java 中实现这种排序,但在汇编中一切都变成了一场噩梦。任何其他更简单的算法都会很好。
标签: string sorting assembly x86 x86-16