Arrays 汇编语言中的数组冒泡排序
问题是,为什么只对最后一个元素排序,然后在每个索引上加5? 我是第一次发帖,如果我的问题不清楚,我道歉Arrays 汇编语言中的数组冒泡排序,arrays,assembly,x86,bubble-sort,Arrays,Assembly,X86,Bubble Sort,问题是,为什么只对最后一个元素排序,然后在每个索引上加5? 我是第一次发帖,如果我的问题不清楚,我道歉 arr BYTE 5,4,3,2,1 arr1 BYTE 5 DUP(?) temp BYTE ? .code main PROC mov ecx,LENGTHOF arr mov esi,Offset arr mov edi,offset arr+1 L1: mov al,[esi] mov edx,ecx mov ecx,4 L2:
arr BYTE 5,4,3,2,1
arr1 BYTE 5 DUP(?)
temp BYTE ?
.code
main PROC
mov ecx,LENGTHOF arr
mov esi,Offset arr
mov edi,offset arr+1
L1:
mov al,[esi]
mov edx,ecx
mov ecx,4
L2:
mov bl,[edi]
cmp al,bl
JG L3
jmp L5
L3:
mov temp,al
mov [esi],bl
;mov dl,temp
mov [edi],al
inc edi
L5:
loop L2
mov ecx,edx
inc esi
loop L1
;Printing my array
mov ecx,LENGTHOF arr
mov al,arr[0]
CALL dumpRegs
mov al,arr[1]
CALL dumpRegs
mov al,arr[2]
CALL dumpRegs
mov al,arr[3]
CALL dumpRegs
CALL dumpRegs
exit
main ENDP
END main
问题是,为什么只对最后一个元素排序,然后在每个索引上加5?
L2 InnerLoop只与第一个数组元素一起工作,因为一旦它加载到AL
,就不会在ESI
中推进指针。因为这个特定的值恰好是数组中最大的值,所以它被存储在任何地方。L2 InnerLoop的固定计数也为4,此时它应该为
CurrentOuterLoopCount-1
正确的解决方案不需要两个不同的指针寄存器。要比较的数组元素总是彼此相邻,因此简单的偏移量为+1就可以了
这是一个有效的泡泡运动。了解它是如何工作的,不要只是复制它
arr BYTE 5,4,3,2,1
.code
main PROC
mov ecx, LENGTHOF arr
sub ecx, 1
jbe Done ; Array is empty or has but 1 element
OuterLoop:
mov edx, ecx ; 5 elements means 4 comparisons
mov esi, Offset arr
InnerLoop:
mov al, [esi]
mov bl, [esi+1]
cmp al, bl
jng NoSwap
mov [esi], bl
mov [esi+1], al
NoSwap:
inc esi
dec edx
jnz InnerLoop
dec ecx ; Next time 3 comparisons, then 2, and then 1
jnz OuterLoop
Done:
从外表中获得灵感