2013-03-15 26 views
0

我正在製作一個玩具NASM程序,它將在特定程序中添加所有值。 我現在正在與NASM一起玩,因爲我建立我的程序來感受一切如何運作。NASM不打印出我的所有說明;跳過一段代碼

遠在我的程序中,我已經放置了一系列的輸出,說「有效」,所以我可以縮小錯誤的位置。

目前,我期望看到五個打印輸出「工作」,但我只看到四個。顯然,Output:下的代碼沒有打印,但我不能爲了我的生活找出原因。

segment .data 
    ;studentInfo: db 10,'Program by Raphael Stein', 10, '6079652', 10, 10 ; 
    ;infoLen: equ $-studentInfo 

    NUM_ROWS: equ 5 
    NUM_COLUMNS: equ 5 
    NUM_ROW_BYTES: equ 10 

    ;Default matrix 
    matrix: dw 5, 4, 9, 7, 2 
     dw 1, 4, 6, 8, 7 
     dw 9, 9, 2, 3, 7 
     dw 6, 5, 8, 3, 4 
     dw 1, 2, 8, 2, 6 
    matrixLen: equ $-matrix 

    sum: db "The sum of the last column is: ", 10 

    ;FOR TESTING 
    works: db 'Works!', 10 
    worksLen: equ $-works 

segment .bss 
    counter resb 1 

segment .text 
    global main 

main: 
;------------------------------------------------------------------------ 
    mov eax, 4  ; system call 4 
    mov ebx, 1  ; standard output 
    mov ecx, works  ; Works!   1 
    mov edx, worksLen 
    int 0x80 
;------------------------------------------------------------------------- 
    ;mov CX, NUM_ROWS   ;Works! 
    mov ECX, counter 
    sub AX, AX 
    sub EBX, EBX 
    mov ESI, NUM_COLUMNS-1 


;------------------------------------------------------------------------ 
    mov eax, 4  ; system call 4 
    mov ebx, 1  ; standard output 
    mov ecx, works  ; Works!   2 
    mov edx, worksLen 
    int 0x80 
;------------------------------------------------------------------------ 


sum_loop:    
    add EAX, [matrix + EBX + ESI*2] 
    add EBX, NUM_ROW_BYTES 
    add ECX, 1 
    cmp EAX,ECX 
    mov esi, eax 
    jge Output 
    LOOP sum_loop 

;------------------------------------------------------------------------ 
    mov eax, 4  ; system call 4 
    mov ebx, 1  ; standard output 
    mov ecx, works  ; Works!   3 
    mov edx, worksLen 
    int 0x80 
;------------------------------------------------------------------------- 

Output: 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, works 
    mov edx, worksLen 
    int 0x80 


;------------------------------------------------------------------------ 
    mov eax, 4  ; system call 4 
    mov ebx, 1  ; standard output 
    mov ecx, works  ; Works!   4 
    mov edx, worksLen 
    int 0x80 
;------------------------------------------------------------------------- 

EXIT: 
    mov eax, 1 
    xor ebx, ebx 
    int 0x80 

回答

1

我在這裏看到一些問題。沒有特定的順序:

  • 你真的想要將ad-hoc調試打印指令序列抽象成一個單獨的函數。這將是一個很好的機會來練習。這樣做會消除代碼重複並可能消除一些錯誤。如...
  • 在sum_loop標籤下,第一條指令添加到EAX。根據最近的修改(看起來像打印複製/粘貼),EAX是4。
  • 因此在第一條ADD指令之後,EAX = 4 + address_of(矩陣)+ EBX + ESI * 2。這將會是一個相當大的數量(地址會使它變大)。該代碼將其與包含...'作品'字符串的偏移量的ECX進行比較。再一次,這看起來像一個錯誤,因爲複製/粘貼。 ECX可能應該是反面的,在前面的塊中定義。
  • 'jge Output'指令取自前一個CMP指令的結果,即「CMP EAX,ECX」。這樣做的最終結果是:「if(EAX> = ECX)然後轉到輸出」。數據段中指針的排列方式與(有時是偶然的)數學相結合意味着這是真實的。這意味着...
  • 輸出標籤下的代碼正在執行。至少,我的閱讀表明這一點。您的各種調試版本並不真正提供任何觸發的數據。我期望在之前的調試打印塊輸出標籤沒有被執行。
  • sum_loop被無意間短路可能是件幸事。否則,它永遠不會終止。請閱讀x86 LOOP指令 - 遞減ECX,如果ECX不是0,則它將分支。請注意,您通過每次迭代將1添加到ECX。所以,它是這樣做的:「ECX + = 1; if(--ECX!= 0)然後循環」。這永遠不會終止。

良好的開端和主動權。保持練習。

+0

好點數!謝謝 – CodyBugstein 2013-03-17 02:19:06