Luk*_*vas 5 sorting assembly tasm bubble-sort
我正在使用tasm编写程序集.我的任务是编写一个程序,使用冒泡排序按字母顺序对输入的字符串进行排序.防爆.如果你输入"你好",它应该写"ehllo".我已经写了乞求输入字符串并对它进行排序(我认为它工作直到它应该打印出结果的结尾,但最后它只是写了我的.data一次并完成它的工作)PS对不起英语
.model small
.stack 100h
.data
request     db 'This program is using bubblesort to get alphabetical order of your enterd string', 0Dh, 0Ah, 'Enter your string:', 0Dh, 0Ah, '$'
result      db 0Dh, 0Ah, 'Result:', 0Dh, 0Ah, '$'
buffer      db 100, ?, 100 dup (0)
.code
start:
MOV ax, @data                   
MOV ds, ax                      
MOV ah, 09h
MOV dx, offset request
int 21h
MOV dx, offset buffer           
MOV ah, 0Ah                     
INT 21h                         
MOV si, offset buffer           
INC si                          
MOV bh, [si]                    
INC si                          
sort:
mov cx, [si] 
mov bx, [si]     
nextelement:
mov ax, [bx+si]     
cmp ax, [bx+si+1]   
jge noswap          
xchg ax, [bx+si+1]
mov ax, [bx+si]
noswap:
inc si              
cmp cx, si          
jl nextelement      
loop nextelement 
MOV ah, 09h
MOV dx, offset result
int 21h
char:
LODSB                           
MOV ah, 2                       
MOV dl, al                      
INT 21h                        
DEC bh                          
JZ ending                       
JMP char                        
ending:
MOV ax, 4c00h               
INT 21h                         
end start
Run Code Online (Sandbox Code Playgroud)
    1)对于冒泡排序,您需要两个嵌套循环。外循环重置内循环的启动参数,直到没有任何内容可以交换。
2)你对字符进行排序。这是 8 位值(字节)。您不能将它们直接加载到 16 位寄存器 ( mov ax, [bx+si]) 中。
3) [bx+si]& [bx+si+1]:这是错误的,我无法解释这个错误:-)。
我没有更正您的代码,而是“从头开始”编写了一个示例:按照http://en.wikipedia.org/wiki/Bubble_sort中的插图:

.MODEL small
.STACK 1000h                        ; Don't skimp with stack!
.DATA
    Struct0A EQU $                  ; Buffer for INT 21h/0Ah (max,got,buf)
        max db 100                  ; Maximum characters buffer can hold (incl. CR (0Dh))
        got db 0                    ; Number of characters actually read, (excl. CR (0Dh))
        buf db 100 dup (0)          ; Actual characters read, including the final carriage return (0Dh)
    Linefeed db 13, 10, '$'
    GetString   db 'Enter string: $'
.CODE
start:
    mov ax, @DATA                           ; Initialize DS
    mov ds, ax
    ; Input String
    mov ah, 09h
    mov dx, OFFSET GetString
    int 21h
    mov dx, OFFSET Struct0A
    mov ah, 0Ah
    INT 21h
    mov si, OFFSET buf                      ; Base for [si + bx] 
    xor bx, bx                              ; Prepare BX for following byte load
    mov bl, got                             ; Load length of string = 0Dh at the end
    mov BYTE PTR [si + bx], '$'             ; Delimiter for int 21h / 09h
    outer:
    dec bx                                  ; The last character is already at the right place
    jz done                                 ; No characters left = done
    mov cx, bx                              ; CX: loop variable
    mov si, OFFSET buf
    xor dl, dl                              ; DL (hasSwapped) = false
    inner:
    mov ax, [si]                            ; Load **two** characters
    cmp al, ah                              ; AL: 1. char, AH: 2. char
    jbe S1                                  ; AL <= AH - no change
    mov dl, 1                               ; hasSwapped = true
    xchg al, ah                             ; Swap characters
    mov [si], ax                            ; Store swapped characters
    S1:
    inc si                                  ; Next pair of characters
    loop inner
    test dl, dl                             ; hasSwapped == true?
    jnz outer                               ; yes: once more
    done:
    ; Print result
    mov dx, OFFSET Linefeed
    mov ah, 09h
    int 21h
    mov dx, OFFSET buf
    mov ah, 09h
    int 21h
    mov ax, 4C00h
    int 21h
END start
Run Code Online (Sandbox Code Playgroud)
这是另一个“动画”插图:
https://www.youtube.com/watch?v=lyZQPjUT5B4