2014-12-28 95 views
2

我在32位彙編中遇到了一個問題,它在Linux上與NASM進行彙編。 這是我實現插入排序未指定操作大小

myInsertionSort: 
push ebp 
mov ebp, esp 
push ebx 
push esi 
push edi 
mov ecx, [ebp+12] ;put len in ecx, our loop variable 
mov eax, 1 ; size of one spot in array, one byte 
mov ebx, 0 
mov esi, [ebp+8] ; the array 
loop loop_1 
loop_1: 
    cmp eax, ecx ; if we're done 
    jge done_1 ; then done with loop 
    push ecx ; we save len, because loop command decrements ecx 
    mov ecx, [esi+eax] ; ecx now array[i] 
    mov ebx, eax 
    dec ebx ; ebx is now eax-1, number of times we should go through inner loop 
    loop_2: 
     cmp ebx, 0 ; we don't use loop to not affect ecx so we use ebx and compare it manually with 0 
     jl done_2 
     cmp [esi+ebx], ecx ;we see if array[ebx] os ecx so we can exit the loop 
     jle done_2 
     mov edx, esi 
     add edx, ebx 
     push [edx] ; pushing our array[ebx] ***************************** 
     add edx, eax 
     pop [edx] ; poping the last one ********************************* 
     dec ebx ; decrementing the loop iterator 
     jmp loop_2 ; looping again 
    done_2: 
     mov [esi+ebx+1], ecx 
     inc eax ; incrementing iterator 
     pop ecx ; len of array to compare now to eax and see if we're done 
     jmp loop_1 
done_1: 
    pop edi 
    pop esi 
    pop ebx 
    pop ebp ; we pop them in opposite to how we pushed (opposite order, it's the stack, LIFO) 
    ret 

的現在...當我嘗試編譯我的代碼以NASM,我得到的錯誤,在包含在評論中星號線「的操作規模沒有指定」:P 這是基本的插入排序,我不確定會出現什麼問題。 請賜教。

回答

6

[edx]的數據可能是任何東西,所以彙編程序不知道它的大小。你必須指定你想推/推的數據的大小。例如,如果你想推/彈出一個dword(32位),你會寫:

push dword [edx] 
pop dword [edx] 

順便說一句,你可以將這些行:

mov edx, esi 
add edx, ebx 

到:

lea edx,[esi + ebx] 
+0

確實,謝謝。另一件事,如果我可以:http://pastebin.com/dz4UmJ0Q 你可以在這裏看到一個問題?它打印垃圾值和隨機數的TONS並在printArray中發佈分段錯誤 – Jack

+0

在調用'printf'之前,您只需要按下一個項目! –

+0

@FRankKotler是的。現在我已經解決了這個問題,但是在插入排序的loop_2中會彈出一個分段錯誤,請問能否幫我找到問題? http://pastebin.com/dbRh58f2 – Jack