2017-11-25 20 views
-2

버블 정렬 기능을 어셈블리 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 

이 좋아, 당신은 내가 내 실수의 일부를 understude이 코드에 대해 어떻게 생각하십니까 (편집 한), 코드는 지금 작동하지만 난 (터치)를 이동 생각

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

"작동하지 않습니다"무엇이 잘못 되었나요? [mcve]를 참조하십시오. 그것은 추락합니까? 그것은 잘못된 대답을 주는가? 디버거를 사용하여 레지스터 값이 예상 한 값인지 확인하십시오. 또한'swap'을 별도의 함수에 넣으면 코드가 훨씬 복잡해집니다. –

+0

적어도 하나의 문제가 있음을 알 수 있습니다 : 그들이 가리키는 데이터 대신에'si'와'di'를 비교합니다. –

+0

8 비트 요소의 경우 [8086 버블 정렬 구현] (https://stackoverflow.com/questions/26318043/assembly-bubble-sort-for-sorting-string/26324630#26324630). –

답변

1

이유 :

mov cx, 18을 - 둘 다, 당신이, 18 개 요소를 정렬 할 아닌 경우 그 종류 19 ([I] VS는 [I + 1], 0 < = 난 [17] vs [18]은 버그입니다.) . 마지막으로 하나의 값이 이미 포함되어 있기 때문에 각 외부 루프 후에 더 적은 요소를 내부 루프에 정렬하는 것만으로도 충분하지만 이는 버그가 아니라 단지 비효율적입니다.

lea di, [si + 2] - 왜? 당신은 정말로 무엇을하고 싶습니까? 메모리에 단일 요소의 크기는 얼마나됩니까?

cmp si, di - di = si + 2와 같이,이 cmp은 항상 "아래"입니다. 주소를 비교하지 말고 값이 필요합니다. (비교를 위해 값이 필요한 경우 다른 함수를 호출하고 메모리 *에서 값을 다시 읽지 않고 "swap"을 직접 작성하는 것이 좋습니다.

BTW loop is slow.

스왑 기능이 정상입니다.

+0

관련 사항 : [x86 코드 16 바이트 (기계어 코드 20 바이트)] (https://codegolf.stackexchange.com/questions/77836/sort-an-integer-list/149038#149038). 이 모든 엉터리 부풀린 버블 정렬 구현은 나를 미치게 만들었습니다. –

+0

@PeterCordes 필자는 눈을 즐겁게하기 위해 코드 골프 솔루션을 필요로하지 않지만, 스택 호출과 컨벤션 콜과 스왑을 통한 이상한 기능 분리로 고통 스러웠다 ... 이제는 내가 잊어 버리려 고 노력하고있다. 여기에서 본 ... – Ped7g