如何在 8086 汇编中进行冒泡排序
How to bubble sort in Assembly 8086
我正在尝试在程序集 8086 中执行冒泡排序功能,但出于某种原因,它给出了错误的答案,我无法找出原因。
我不能使用任何 .code、.data 和其中任何一个,因为我们还没有学习它,我不知道如何使用它。
据我所知,我使用的交换功能有效。
org 100h
jmp main
string db 'm', 'a', 'g', 's', 'h', 'i', 'm', 'i', 'm', 'v', 'e', 'n', 'e', 'h', 'e', 'n', 'i', 'm' ,0Dh,0Ah,'$'
main:
lea di,string
push di
call bubbleSort
mov ax, 0
mov ah, 0
int 16h
ret
swap proc
push bp
mov bp, sp
mov bx, [bp + 4]
mov al, [bx]
mov di, [bp + 6]
mov cl, [di]
mov [di], al
mov [bx], cl
mov sp, bp
pop bp
retn 4
swap endp
bubbleSort proc
push bp
mov bp, sp
mov si, [bp + 4]
mov cx, 18
outer_loop:
mov si, [bp + 4]
lea di, [si + 2]
mov bx, cx
mov cx, 18
inner_loop:
cmp si, di
ja finish:
;swap
pusha
push si
push di
call swap
popa
finish:
inc si
inc di
loop inner_loop
mov cx, bx
loop outer_loop
mov sp, bp
pop bp
retn 2
bubbleSort endp
(已编辑)
好吧,你觉得这段代码怎么样我理解我的一些错误,代码现在可以工作但我想我移动(触摸)'$'符号
bubbleSort proc
push bp
mov bp, sp
mov si, [bp + 4]
mov cx, 18
outer_loop:
mov si, [bp + 4]
mov bx, cx
mov cx, 18
inner_loop:
mov al, [si]
mov ah, 0h
mov dl, [si + 1]
mov dh, 0h
cmp dl, al
ja finish:
;swap
mov [si + 1], al
mov [si], dl
finish:
inc si
loop inner_loop
mov cx, bx
loop outer_loop
mov sp, bp
pop bp
retn 2
bubbleSort endp
答错原因:
mov cx, 18
- 两者,如果你想对 18 个元素进行排序,请不要对其中的 19 个元素进行排序([i] vs [i+1],0 <= i < 18 → [17 ] vs [18] 是错误)。另外,在每个外循环之后,在内循环中少排序一个元素就足够了,因为最后一个元素已经包含最高值,但这只是效率低下,而不是错误。
lea di, [si + 2]
- 为什么?你真正想做什么?内存中单个元素有多大?
cmp si, di
- 因为 di = si+2,这个 cmp
将永远是 "below"。不要比较地址,但你需要值。 (如果您需要比较值,那么直接在之后写入 "swap" 是有意义的,而不是调用其他函数并*再次*从内存中读取值)。
顺便说一句 loop
is slow.
交换功能正常
我正在尝试在程序集 8086 中执行冒泡排序功能,但出于某种原因,它给出了错误的答案,我无法找出原因。
我不能使用任何 .code、.data 和其中任何一个,因为我们还没有学习它,我不知道如何使用它。
据我所知,我使用的交换功能有效。
org 100h
jmp main
string db 'm', 'a', 'g', 's', 'h', 'i', 'm', 'i', 'm', 'v', 'e', 'n', 'e', 'h', 'e', 'n', 'i', 'm' ,0Dh,0Ah,'$'
main:
lea di,string
push di
call bubbleSort
mov ax, 0
mov ah, 0
int 16h
ret
swap proc
push bp
mov bp, sp
mov bx, [bp + 4]
mov al, [bx]
mov di, [bp + 6]
mov cl, [di]
mov [di], al
mov [bx], cl
mov sp, bp
pop bp
retn 4
swap endp
bubbleSort proc
push bp
mov bp, sp
mov si, [bp + 4]
mov cx, 18
outer_loop:
mov si, [bp + 4]
lea di, [si + 2]
mov bx, cx
mov cx, 18
inner_loop:
cmp si, di
ja finish:
;swap
pusha
push si
push di
call swap
popa
finish:
inc si
inc di
loop inner_loop
mov cx, bx
loop outer_loop
mov sp, bp
pop bp
retn 2
bubbleSort endp
(已编辑) 好吧,你觉得这段代码怎么样我理解我的一些错误,代码现在可以工作但我想我移动(触摸)'$'符号
bubbleSort proc
push bp
mov bp, sp
mov si, [bp + 4]
mov cx, 18
outer_loop:
mov si, [bp + 4]
mov bx, cx
mov cx, 18
inner_loop:
mov al, [si]
mov ah, 0h
mov dl, [si + 1]
mov dh, 0h
cmp dl, al
ja finish:
;swap
mov [si + 1], al
mov [si], dl
finish:
inc si
loop inner_loop
mov cx, bx
loop outer_loop
mov sp, bp
pop bp
retn 2
bubbleSort endp
答错原因:
mov cx, 18
- 两者,如果你想对 18 个元素进行排序,请不要对其中的 19 个元素进行排序([i] vs [i+1],0 <= i < 18 → [17 ] vs [18] 是错误)。另外,在每个外循环之后,在内循环中少排序一个元素就足够了,因为最后一个元素已经包含最高值,但这只是效率低下,而不是错误。
lea di, [si + 2]
- 为什么?你真正想做什么?内存中单个元素有多大?
cmp si, di
- 因为 di = si+2,这个 cmp
将永远是 "below"。不要比较地址,但你需要值。 (如果您需要比较值,那么直接在之后写入 "swap" 是有意义的,而不是调用其他函数并*再次*从内存中读取值)。
顺便说一句 loop
is slow.
交换功能正常