【发布时间】:2018-05-09 00:14:58
【问题描述】:
我正在尝试在程序集 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
【问题讨论】:
-
“它不起作用”不足以描述问题所在。见minimal reproducible example。它会崩溃吗?它会给出错误的答案吗?使用调试器查看寄存器值是否符合您的预期。此外,将
swap放在单独的函数中会使您的代码更加复杂。 -
我可以看到至少 1 个问题:您比较
si和di而不是它们指向的数据。 -
工作 8086 bubble sort implementation,用于 8 位元素。
-
再次阅读minimal reproducible example。它给出了什么答案?如果我们知道这一点,那么找出可能出错的地方要容易得多,例如对于某些输入,或前几个,或 IDK 什么,它会留下最后几个元素未排序。