2016-05-15 69 views
1

我一直非常惱火以完成這個.asm代碼。 必須使用Insertion_Sort按順序打印此結果。x86彙編:作爲初學者編程Insertion_sort

我實際上嘗試了Bubble_Sort,以防算法的邏輯可能出錯。我想請您閱讀這些代碼。任何建議將是非常受歡迎的。我真的很想知道我錯過了什麼。

這是我到目前爲止的結果:(Bubble排序的rlt也很奇怪,因爲我不知道如何在asm中調試,所以我不禁一遍又一遍讀代碼。 。絕望在幫助)

%include "asm_io.inc" 
section .data 
    array dd 3,1,5,7,2,8,4,9,6,10 
    size dd 10 
    segment .bss 
    next resw 1 
segment .text 
global main 
main: 
    enter 0,0 
    pusha 
    ; Insertion Sort Start from here 
    mov eax,[array+4*ecx] 
    mov [next], eax 
    ; j = i-1 
    mov ebx, ecx 
    dec ebx 
while2: 
    cmp ebx,0 
    jl EndLoop2 
    mov eax, [next] 
    cmp [array+4*ebx],eax 
    jle EndLoop2 
    ;array[j+1] = array[j] 
    mov eax, [array+4*ebx] 
    mov [array+4*(ebx+1)], eax 
    ; j-- 
    dec ebx 
    ; Go back to the top of this loop 
    jp while2 
EndLoop2: 
    mov eax, [next] 
    mov [array+4*(ebx+1)],eax 
    inc ecx 
    jmp while1 
EndLoop1: 
    mov ecx,0 
nextInt: 
    mov eax, [array+4*ecx] 
    call print_int 
    call print_nl 
    inc ecx 
    cmp [size], ecx 
    jne nextInt 
    popa 
    mov eax, 0 
    leave 
    ret 
+1

你應該學習如何在asm中調試。它應該比調試高級語言更容易,因爲每個asm指令只做一件事。 (當你這樣做時,你可能會注意到'jp'上的一些有趣的東西。) –

+0

給自己一個調試器!有很多可用的。當程序逐步執行時,可以更容易地理解程序的功能。我注意到你忘了問一個問題。你有什麼問題? –

回答

1

的錯誤包括:

  • 您使用mov eax,[array+4*ecx]中的ECX寄存器,但無法預先設置它。

  • 隨着mov [next], eax你寫一個DWORD在被定義爲的變量。

  • jmp while1這是哪裏?沒有這樣的標籤!

  • 不確定彙編器是否可以理解此尋址:mov [array+4*(ebx+1)], eax。也許將其更改爲:mov [array+4*ebx+4], eax

  • jp while2這不應該僅僅是一個jmp?這裏沒有可以檢查的點數。

首先解決所有這些...

0

我不知道,爲什麼我登錄另一個帳戶,並質疑,上述一個(user3787105)是我的,我只想說,我解決問題。而這些錯誤讓我瘋狂是由於不必要地使用了「DEC」和「INC」造成的。 謝謝,夥計們。對於我忘記user3787105賬戶的密碼的原因,我感到遺憾。