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 セグメンテーション違反です
それでも私はあなたのアドバイスを探しています。ありがとうございました。