2017-10-16 25 views
0

[편집] 누군가이 문제에서 M과 N의 값을 얻는 방법을 설명해 주시겠습니까? 해당 어셈블리 코드의 각 행을 살펴보십시오.IA32 32 비트 AT & T 어셈블리 코드를 C 언어로 분해합니다

난 항상 movl array2 부분에 난처한 얻을. 어떻게 우리가 상수 M과 N의 값을 추론 않습니다

M과 N은 상수 위의 코드는 다음 어셈블리 코드를 생성하는 경우 #DEFINE

#define M <some value> 
#define N <some value> 

int array1[M][N]; 
int array2[N][M]; 
int copy(int i, int j) 
{ 
array1[i][j] = array2[j][i]; 
} 

을 사용하여 정의됩니다?

copy: 
    pushl %ebp 
    movl %esp, %ebp 
    pushl %ebx 
    movl 8(%ebp), %ecx 
    movl 12(%ebp), %ebx 
    leal (%ecx, %ecx, 8), %edx 
    sall $2, %edx 
    movl %ebx, %eax 
    sall $4, %eax 
    subl %ebx, %eax 
    sall $2, %eax 
    movl array2(%eax, %ecx, 4), %eax 
    movl %eax, array1(%edx, %ebx, 4) 
    popl %ebx 
    movl %ebp,%esp 
    popl %ebp 
    ret 
+2

정말로 모든 것을 입력 할 것으로 기대합니까? 코드 이미지를 게시하지 마십시오! 질문을 수정하십시오. – ikegami

+0

왜 코드 이미지로 ??? –

+0

"우리가 M과 N의 가치를 얻는다"고 말할 때 당신은 무엇을 의미합니까? 'i'와'j'라는 뜻 이었습니까? – ikegami

답변

0

대단한 연구 끝에 해결책을 찾을 수있었습니다. 내가 틀렸다면 나를 바로 잡아라.

그래서 공정의 다음 조립 공정을 거치지 (편의상 추가 행 번호)

M 및 N은 스택

로 #DEFINE

int array1[M][N]; 
int array2[N][M]; 
int copy(int i, int j) 
{ 
array1[i][j] = array2[j][i]; 
} 

copy: 
    1 pushl %ebp 
    2 movl %esp, %ebp 
    3 pushl %ebx 
    4 movl 8(%ebp), %ecx 
    5 movl 12(%ebp), %ebx 
    6 leal (%ecx, %ecx, 8), %edx 
    7 sall $2, %edx 
    8 movl %ebx, %eax 
    9 sall $4, %eax 
    10 subl %ebx, %eax 
    11 sall $2, %eax 
    12 movl array2(%eax, %ecx, 4), %eax 
    13 movl %eax, array1(%edx, %ebx, 4) 
    14 popl %ebx 
    15 movl %ebp,%esp 
    16 popl %ebp 
     ret 
  1. 푸시 %ebp를 사용하여 정의 상수

  2. 을 가리키면 %esp

  3. 스택

  4. %ecx

  5. 푸시 %ebxint i (어레이 액세스에 대한 인덱스)

  6. %ebx가 (어레이 액세스에 대한 인덱스) int j 동일

  7. %edx8 * %ecx + %ecx 또는 9i

  8. 동일 같음,962,203,210는 2

  9. %eax의 좌측 이진 시프트 후 36i 동일는

  10. %eax4

  11. %eax의 좌측 이진 시프트 후 16j 같음 %의 EBX 또는 j 동일 %eax - %ebx = 16j - j = 15j

  12. %eax 같다 는 60j과 같습니다. 배열 1은 %eax 또는 [4i + 60j]

개의 배열 요소의 교체가 대등 2

  • %eax의 좌측 이진 시프트 후의 인덱스 [ 4%ebx + %edx ] or [ 4j + 36i ]와 인덱스 [4%ecx + %ebx] or [4i + 60j]

  • 요소 배열 2 요소와 동일 % eax를 중간 등록자로 사용하여 12와 13에서 완료되었습니다.

    1. %ebx가의 요소 '이전 값이

    2. %ebp

    이제 우리는 array1[i][j] 가정 튀어 복원의'

  • %esp

    튀어를 액세스는 4Ni + 4j과 같습니다.

    그리고 array2[j][i]의 요소 액세스는 4Mj + 4i과 같아야합니다.

    (int는 4 바이트이고 i, j는 배열 시작 위치의 개별 오프셋 임) C는 행 주요 폼에 배열을 저장하기 때문에 마찬가지입니다.

    그래서 우리는 M = 15이고 N = 9가됩니다.

  • 1

    조립품의 다른 부품을 점검해야합니다. 당신이 8 모두로 M과 N을 정의하는 경우 예를 들어, 당신 때문에 내 컴퓨터에 조립

    array1: 
        .zero 256 
    array2: 
        .zero 256 
    

    에 다음을 찾을 것입니다, INT는 4 바이트, 8 64 8 번과 64 * 4 = 256 샘플 어셈블리는 here입니다.

    +0

    M과 N 값을 가정하지 않고도 답을 찾을 수있는 방법이 있지만 어셈블리의 다른 부분을 알 필요는 없다고 생각합니다. – 24dinitrophenylhydrazine