2
어셈블리 언어의 매트릭스 작업에 도움이 필요합니다. 내 코드는 C와 ASM에서 Cholesky Decomposition을 수행하고 속도를 비교합니다. 중첩 된 루프를 이미 만들었고 정상적으로 작동합니다. 올바르게 요소를 액세스하기 위해 행렬을 올바르게 계산하는 방법을 모릅니다. Matrix는 C 언어에서 DOUBLE이며 주소 (첫 번째 요소)를 어셈블리로 전송합니다.더블 타입 매트릭스 [n] x [n] 어셈블리로 전송
extern "C" int __stdcall Cholesky_double(double* tab_adr, int num_el);
와 C에 전달
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 코드 ++로 조립 라이브러리와 프로젝트를 만들고 프로젝트의 Visual Studio 2010 솔루션을 사용합니다.
필자가 작성한 코드를 요구하지는 않습니다. 행렬을 올바로 액세스하기 위해 행렬을 올바르게 주소 지정하는 데 약간 도움이됩니다. 당신이 ASM 여기 (SQRT 같은 오는 더 많은 문제를 예견 경우 내가 몇 가지 지침에 기뻐할 것입니다