2013-10-06 20 views
1

我寫彙編程序的任務分配時,我需要一個數組,讓我們說分段錯誤做嵌套循環組裝

array: DB 1, 2, 3, 4, 5 

,我需要通過它循環並打印相應的星級數組中的數字。所以在程序上面的例子應該輸出:

* * * * * 
    * * * * 
    * * * 
     * * 
     * 

我的問題是我收到分段錯誤的地方在代碼中,我無法準確判斷。任何人都有任何想法發生這種情況?

代碼:

%INCLUDE "csci224.inc" 

SEGMENT  .data 
array:  DB  1, 2, 3, 4, 5, 4, 3, 2, 1 
star:  DB  "*",0,10 
n:   DB  0 

SEGMENT  .text 
main: 
    mov   edx, 9     ;length of array 
    mov   ecx, 0     ;loop counter 
    jmp   outerloop    ;begin outerloop 

outerloop: 

    mov   ah, [array+ecx]   ;move (array element + loop counter) to ah 

    movzx  ebx, ah     ;zero extend ah to ebx 
    mov   [n], ebx    ;copy value of array element to variable 
    mov   eax, ebx 

    inc   ecx 

    ;call  WriteInt  
    dec   edx 
    jnz   innerloop    ;jump to innerloop 

innerloop:        ;cycle through '[n]', printing a star each time 
     mov  edi, [n] 
     mov  eax, [star] 
     call WriteString    ;print star 
     dec  edi      ;decrement counter 
     jnz  innerloop    ;is edi zero? if no, loop again 
     cmp  ecx, byte 0    ;if yes, go back to outerloop 
     jz  outerloop 


    ret 
+0

你可以找出分段錯誤使用調試器發生。你知道怎麼做嗎?我建議gdb。 –

+0

'n'只是一個字節,而你正在移動一個雙字! 'mov eax,[star]'(「[contents]」)幾乎肯定應該是'mov eax,star'(地址)。您可能需要在'main'周圍保存和恢復'ebx','esi'和'edi'。 –

回答

1

首先,在ret你必須在年底,是不是要結束你的程序的正確方法!在Windows中,如果鏈接到C庫,則可以使用ExitProcess或致電exit。在Linux中,如果鏈接到C庫,則可以使用int 80H - sys_exitsyscall - 60exit

當使用嵌套循環時,首先讓你的外循環首先工作;打印出數組中的每個值。一旦你有這個工作,添加你的「內部」循環打印星星。

在下面的代碼中,我使用了esiebx,因爲這些必須由被調用者保存,所以我們不需要擔心保存這些值。

extern printf, exit 
global main 

SEGMENT  .data 
array:  DB  1, 2, 3, 4, 5, 4, 3, 2, 1 
array_len equ  $ - array 
star:  DB  "*", 0 

SEGMENT  .text 
main: 
    mov  esi, 0     ;loop counter 

.ArrayLoop: 
    ;~ Get array value to use as PrintStars loop counter, esi is index into array 
    movzx ebx, byte [array + esi] 
    ;~ increase ArrayLoop "Outer Loop" counter 
    inc  esi 
    cmp  esi, array_len 
    ;~ if esi > array_len, we are done 
    jg  .Done 

.PrintStars: 
    ;~ print stars here 

    ;~ decrease "Inner Loop" counter 
    dec  ebx 
    ;~ If ebx != 0, continue "Inner Loop" 
    jnz  .PrintStars 

    ;~ ebx == 0, print new line char and continue "Outer Loop"  
    ;~ print newline char here 
    jmp  .ArrayLoop 

.Done: 
    call exit 

這將打印出來的星星一樣:根據您的源陣列 Star thing

如果你想作一個金字塔,讀this