我正在尝试使用 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 操作系统。
我的问题的更新:
按照 Brendon 导师的建议,我以下列方式更改了上面的代码;仍然没有得到我想要的输出:
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 Segmentation fault
我仍然在寻找你的建议。谢谢你。