Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 汇编语言中的数组冒泡排序_Arrays_Assembly_X86_Bubble Sort - Fatal编程技术网

Arrays 汇编语言中的数组冒泡排序

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:

问题是,为什么只对最后一个元素排序,然后在每个索引上加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:
    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:
从外表中获得灵感