2
我希望在彙編語言中對矩陣操作有所幫助。 我的代碼在C和ASM中進行Cholesky分解並比較它們的速度。 我已經創建了嵌套循環,它的工作正常,我不知道如何正確地選擇矩陣來訪問它的元素。矩陣在C中是DOUBLE,我設法將其地址(第一個元素)轉換爲程序集。Double Type Matrix [n] x [n]轉換爲彙編
Cholesky_double proc \
tab_addr:DWORD, \ ; begin adres of matrix
num_elem:DWORD ; element count in row/column (n of Matrix[n][n])
LOCAL i:DWORD, k:DWORD, j:DWORD, skoczek:DWORD
;skoczek is for operation count check (ex.should be 13 for 3x3 matrix)
; push register on stack
push edx
push ecx
push ebx
push esi
push edi
mov k, 0
mov skoczek, 0
for0start:
inc skoczek
mov eax, k
mov i, eax
inc i
;there should be MATRIX[k][k] = sqrt(MATRIX[k][k])
mov eax, num_elem
sub eax, i
cmp eax, 0
je for1end
for1start:
inc skoczek
;MATRIX[i][k]=MATRIX[i][k]/MATRIX[k][k]
for1koniec:
inc i
mov eax, num_elem
sub eax, i
cmp eax, 0
jne for1start
for1END:
mov eax, k
mov j, eax
inc j
mov eax, num_elem
sub eax, j
cmp eax, 0
je for2end
for2start:
inc skoczek
mov eax, j
mov i, eax
for3start:
inc skoczek
;MATRIX[i][j] = MATRIX[i][j]-MATRIX[i][k]*MATRIX[j][k]
for3koniec:
inc i
mov eax, num_elem
sub eax, i
cmp eax, 0
jne for3start
for2koniec:
inc j
mov eax, num_elem
sub eax, j
cmp eax, 0
jne for2start
for2end:
for0koniec:
inc k
mov eax, num_elem
sub eax, k
cmp eax, 0
jne for0start
koniec:
pop edi
pop esi
pop ebx
pop ecx
pop edx
mov eax, skoczek
ret
; return with operation count in eax
Cholesky_double endp
用C通過與
extern "C" int __stdcall Cholesky_double(double* tab_adr, int num_el);
矩陣我使用Visual Studio 2010和解決方案與創建裝配庫和項目在C++代碼,可以用匯編功能項目。
我不是要求爲我填寫代碼,只是爲了幫助正確地使用矩陣來正確訪問它的元素。如果你預見到更多的問題到了這裏(像開方在ASM我會非常高興具有一定的指導