2

我想编写一个 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    
结束

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

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

4

1 回答 1

3

实际上我自己想出了答案,我使用字符串命令将字符串 2 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
于 2013-02-03T20:04:50.777 回答