0

NASM を使用して行列を実装するプログラムを作成しようとしています。初心者として、NASM で次の C コードを書き直そうとします。C コード:

    for(i = 0 ; i< 3; i++){
        for(j = 0 ;j < 3; j++)
            a[i][j] = 0 ;
    }

私のNASMコードの実装は次のとおりです。

    section .data
          msg db "%d"
          four dd 4
          spce db " ",0
          nl db 10
    section .bss
          arr1 resd 4
          arr2 resd 4
    section .text
          global main
          extern printf
    main:
          nop   
          xor ecx,ecx
          xor eax,eax
          xor ebx,ebx
   lp1:                                 ;to implement "for(r = 0 ; r < 4; r++)"
          mov ebx, arr1
          mov eax,ecx
          mul dword[four]   
          add ebx,eax   
          cmp ecx,4
          jl entryOflp2
              jmp done
   entryOflp2:                           ; to implement for(c = 0 ; c < 4; c++)
          push ebx
          push ecx
          xor ebx,ebx
          xor edx,edx
   lp2:
          mov ebx, arr2
          mov eax,edx   
          mul dword[four]
          add ebx,eax

          mov dword[ebx],0              ; to initial a[r][c]=0
          inc edx
          cmp edx,4
          jl lp2
   endOflp2:
          pop ecx
          pop ebx

              inc ecx
          cmp ecx,4
          jl lp1
    done:
              ret

しかし、プログラムが無限ループで失敗し、最も顕著なのは edx の値が増加していないことがわかりました。初心者として、この方法でマトリックスを実装する必要があるかどうかについて、私はほとんど疑問を持っていません。

メンターからのアドバイスを待っています。UBUNTU 11.04 OS を使用しています。

私の質問の更新:

メンターのブレンドンのアドバイスに従って、上記のコードを次のように変更します。それでも、目的の出力が得られません。

   section .bss
     arr1 resd 9    
   section .text
     global main
     extern printf
   main:
      nop   
      xor ecx,ecx
      xor eax,eax
      xor ebx,ebx
      mov ebx, arr1
   forI:
      xor esi,esi
      cmp ecx,3
      jl forJ
      jmp print
   forJ:
       cmp esi,3
       jl initialization
       inc ecx
       jmp forI
   initialization: ; it will give base address+4(number 
                   ;of colums*rowIndex+columIndex).  
                   ;ecx=row index,esi=column index; I am using Row major represntation
       mov eax,ecx
       mul dword[three]
       add eax,esi
       mul dword[four]
       add ebx,eax        
       mov dword[ebx],0       ;set a[i][j]=0

       inc esi
       jmp forJ
    print:
       xor ecx,ecx
       xor eax,eax
       xor ebx,ebx
       mov ebx, arr1
   forI_2:
       xor esi,esi
       cmp ecx,3
       jl forJ_2        
       jmp done
   forJ_2:
        cmp esi,3
        jl print_task
        pusha
        push nl
        call printf
        add esp,4
        popa
        inc ecx
        jmp forI_2
    print_task:
        mov eax,ecx
        mul dword[three]
        add eax,esi
        mul dword[four]
        add ebx,eax 
        pusha
        push dword[ebx]
        push msg
        call printf
        add esp,8
        popa
        pusha
        push spce
        call printf
        add esp,4
        popa    

        inc esi
            jmp forJ_2
    done:
         nop

私の意図した出力は

    0 0 0
    0 0 0
    0 0 0

しかし、ここに出力されるのは 0123012301230 0 0 セグメンテーション違反です

それでも私はあなたのアドバイスを探しています。ありがとうございました。

4

1 に答える 1