2013-03-04 1 views
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 같은 오는 더 많은 문제를 예견 경우 내가 몇 가지 지침에 기뻐할 것입니다

답변

3

먼저 주소를 선형화 할 수 있습니다.

&matrix[k][i] = matrix + i*sizeof(double) + k*N*sizeof(double); 
N은 (되는 N × N 행렬을 가정 행 폭

.)

fld [%eax]  // load to top of stack in FPU (assuming ia-32 system) 
    mov %rbx,[%rax]; // vs. load 64-bit register 
    movsd %xmm0, [%rax] // vs. load a double to lower 64-bits of xmm register 
으로로드 할 수 있습니다