我试图在程序集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
答案 0 :(得分:2)
它给出错误答案的原因:
mov cx, 18
- 他们两个,如果你想排序18个元素,不要排序19个([i] vs [i + 1],0< = i< 18→ [17] vs [18]是bug)。在每个外部循环之后加上内部循环中的一个元素就足够了,因为最后一个元素已经包含了最高值,但这只是效率低下而不是bug。
lea di, [si + 2]
- 为什么?你真的想做什么?内存中的单个元素有多大?
cmp si, di
- 如di = si + 2,此cmp
将始终"低于"。不要比较地址,但你需要价值观。 (如果你需要比较的值,那么在那之后直接写#34; swap"而不是调用其他函数并再次从内存*中读取值,这是有意义的。)
BTW loop
is slow。
交换功能正常。