gpt4 book ai didi

sorting - 组装 - 用于对字符串进行排序的冒泡排序

转载 作者:行者123 更新时间:2023-12-02 11:04:24 28 4
gpt4 key购买 nike

我正在使用 tasm 编写汇编程序。我的任务是编写一个程序,该程序将使用冒泡排序按字母顺序对输入的字符串进行排序。前任。如果你输入“hello”,它应该写成“ehello”。我已经写了请求输入字符串并对其进行排序(我认为它工作正常,直到最后它应该打印出结果,但最后它只写了一次我的.data并完成了它的工作)P.S抱歉不好英语

.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

最佳答案

1) 对于冒泡排序,您需要两个嵌套循环。外循环重置内循环的启动参数,直到没有任何东西可以交换。

2) 您对字符进行排序。这是 8 位值(字节)。您无法将它们直接加载到 16 位寄存器中 (mov ax, [bx+si])。

3) [bx+si] & [bx+si+1]:这是错误的,我无法解释这个错误:-)。

我没有更正您的代码,而是“从头开始”编写了一个示例:按照 http://en.wikipedia.org/wiki/Bubble_sort 中的插图进行操作:

Bubble sort animation

.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

这是另一个“动画”插图:

https://www.youtube.com/watch?v=lyZQPjUT5B4

关于sorting - 组装 - 用于对字符串进行排序的冒泡排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26318043/

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