2013-10-30 3 views
1

나는 숙제로 인해 혼란 스럽다. 아래에 나열된 C 코드와 어셈블리가 제공됩니다. 이것은 x86 어셈블리입니다. 어떤 도움이라도 대단히 감사하겠습니다. 나는 내가 이해하고있는 것에 기초하여 그것을 해결하려고 시도했다.어셈블리와 C 매트릭스 assays

C 코드 : 만 내부 루프에 대한

void transpose(Marray_t A) { 
    int i, j; 
    for (i = 0; i < M; i++) 
     for (j = 0; j < i; j++) { 
      int t = A[i][j]; 
      A[i][j] = A[j][i]; 
      A[j][i] = t; 
     } 
} 

어셈블리 코드 :

A. M의 값이 무엇을 : 여기

1 .L3: 
2 movl (%ebx), %eax  //is this getting the mem location of %ebx and setting to %eax? 
3 movl (%esi,%ecx,4), %edx //ecx * 4 + esi into edx 
4 movl %eax, (%esi,%ecx,4) // 
5 addl $1, %ecx    //add 1 to ecx 
6 movl %edx, (%ebx)   //move edx to mem location of ebx??? 
7 addl $52, %ebx   //I think this is M but I could be wrong 
8 cmpl %edi, %ecx   //compare edi & ecx 
9 jl .L3 

내가 대답 할 필요가 무엇인가? ... 나는 이것이 52라고 생각한다 ...?

B. 어떤 레지스터가 프로그램 값 i와 j를 유지합니까? ... 나는 edx와 eax라고 생각 하나?

C.이 루프에서 발생하는 최적화 을 사용하는 transpose의 C 코드 버전을 작성하십시오. 숫자 상수가 아닌 코드에서 M 매개 변수를 사용하십시오. (C)에서

시도 :이 코드에 따라서

void tranpose(Marray_t A) { 
    int i, j; 
    for(i = 0; i < M; i++) { 
     for(j = 0; j < i; j++) { 
      int *row = &A[i][0]; 
      int *col = &A[0][j]; 

      int value = (*row * 4) + *col; 
     } 
    } 
} 
+0

이 아마도 당신이 검토 할 (그리고 내 대답 해당되는 경우를 동의) 어셈블리의 다른 질문에 대한 것 (배열 요소 크기가 4로) - 더 가기 전에> C? –

+0

그게 내가 뭘 혼란 스러웠는지 모르겠다. 나는 이것을 모른 채 텍스트 책에서 똑바로 복사했습니다. – user1758231

답변

1
1 .L3: 
2 movl (%ebx), %eax   // eax := read memory word at ebx 
3 movl (%esi,%ecx,4), %edx // edx := read memory word at esi + 4*ecx 
4 movl %eax, (%esi,%ecx,4) // store eax into that location 
5 addl $1, %ecx    // add 1 to ecx 
6 movl %edx, (%ebx)   // store edx into memory at ebx 
7 addl $52, %ebx   // add 52 to ebx 
8 cmpl %edi, %ecx   // compare edi & ecx 
9 jl .L3 

. %ebxA[j][i]의 주소이고 %esiA[i]의 주소이고 %ecx은 j입니다. M은 아마 13, 그래서 52 sizeof(A[j])입니다

+0

이제는 C로 변환하는 데 정말로 고심하고 있습니다. 지금까지 가지고있는 코드를 게시했지만 여전히 도움이 필요합니다. – user1758231