2013-10-27 3 views
0

C, 어셈블리 : 스위치 상태를 이해하고, EDX EAX ECXC, 어셈블리 : 스위치 상태를 이해하고, EDX EAX ECX

나는 C와 어셈블리 코드의 스위치 조건 코드가 있습니다. 하지만 edx 또는 eax 또는 ecx를 설정하는 것이 나에게 매우 자의적으로 보입니까? edx, epx, ecx, ebp의 차이점을 어떻게 알 수 있습니까? 교과서조차도 충분한 설명을하지 못합니다.

#include <stdio.h> 

// Enumerated type creates set of constants 
// numbered 0 and upward 
typedef enum {MODE_A, MODE_B, MODE_C, MODE_D, MODE_E} mode_t; 

int switchmode(int *p1, int *p2, mode_t action) 
{ 
    int result = 0; 
    switch(action) { 
    case MODE_A: 
     result = *p1; 
     *p1 = *p2; 
     break; 
    case MODE_B: 
     *p2 += *p1; 
     result = *p2; 
     break; 
    case MODE_C: 
     *p2 = 15; 
     result = *p1; 
     break; 
    case MODE_D: 
     *p2 = *p1; 
     /* Fall Through */ 
    case MODE_E: 
     result = 17; 
     break; 
    default: 
     result = -1; 
    } 
    return result; 
} 

int main(int argc, const char * argv[]) 
{ 
    int num1 = 10; 
    int num2 = 20; 

    printf("MODE_A: %d \n", switchmode(&num1, &num2, MODE_A)); // 10 
    printf("MODE_B: %d \n", switchmode(&num1, &num2, MODE_B)); // 40 
    printf("MODE_C: %d \n", switchmode(&num1, &num2, MODE_C)); // 20 
    printf("MODE_D: %d \n", switchmode(&num1, &num2, MODE_D)); // 17 
    printf("MODE_E: %d \n", switchmode(&num1, &num2, MODE_E)); // 17 
    printf("NULL: %d \n", switchmode(&num1, &num2, (mode_t) NULL)); // 20 
    return 0; 
} 

어셈블리 코드

인수이다 %의 EBP에서 P1 + %의 EBP에서 8 P2 + %의 EBP 12 액션 + 16 등록 %의 EDX 결과 (초기화 -1)

.L17: // MODE_E 
    movl $17, %edx 
    jmp .L19 
.L13: // MODE_A 
    movl 8(%ebp), %eax 
    movl (%eax), %edx 
    movl 12(%ebp), %ecx 
    movl (%ecx), %eax 
    movl 8(%ebp), %ecx 
    movl %eax, (%ecx) 
    jmp .L19 
.L14: // MODE_B 
    movl 12(%ebp), %edx 
    movl (%edx), %eax 
    movl %eax, %edx 
    movl 8(%ebp), %ecx 
    addl (%ecx), %edx 
    movl 12(%ebp), %eax 
    movl %edx, (%eax) 
    jmp .L19 
.L15: // MODE_C 
    movl 12(%ebp), %edx 
    movl $15, (%edx) 
    movl 8(%ebp), %ecx 
    movl (%ecx), %edx 
    jmp .L19 
.L16: // MODE_D 
    movl 8(%ebp), %edx 
    movl (%edx), %eax 
    movl 12(%ebp), %ecx 
    movl %eax, (%ecx) 
    movl $17, %edx 
.L19: // default 
    movl %edx, %eax // set return value 

내 질문 가 어떻게 EAX가 무엇을 알고 있는가? 그것은 논쟁 중 하나입니까? 그렇다면 내가 어떻게 eax와 ecx이고 어느 것이 edx인지 알 수 있습니까? 사전에

감사합니다!

+3

왜 신경 쓰시겠습니까? 교과서는 도움이되지 않습니다. 컴파일러를 되돌려 야합니다. –

+0

만약 당신이 ebp가 무엇인지 알고 있다면 eax가 레지스터 목록의 첫 번째 항목에 자주 나타나는 경우 eax를 모른다. –

답변

0

대부분의 어셈블리 코드에서 % eax에있는 값은 함수에서 반환 된 값입니다. 그래서 .L19 블록에서 % edx에 있던 것이 % eax로 옮겨집니다. 다시 돌아 보면, result을 설정하면 코드는 그 값을 % edx로 이동 시키므로 코드가 .L19로 점프하면 기본값은 % eax에 배치됩니다.
이 32 비트 시스템처럼 보이는, 그래서 8 개의 범용 레지스터가 있습니다

  • 퍼센트의 EBX을, % ECX, % EDX % ESI, 그리고 %의 EDI 레지스터는 주로 저장 어떤 데이터가되는입니다 주어진 시간에 그들이 잡는 데 필요합니다.
  • % eax는 함수의 반환 값을 저장합니다. 그것을 호출 한 함수는 % eax를 변경하기 전에 해당 함수의 반환 값을 % eax에서 찾을 것입니다.
  • % ebp 및 % esp는 기본적으로 다양한 함수 호출을 위해 스택에서 공간을 관리하고 할당하는 특수 레지스터입니다.

인수가 배치되는 곳을 보려면 해당 코드에서 데이터가 참조되는 위치를 확인하십시오. 예를 들어 .L13에서 프로그램은 % ebp + 8 (p1)을 % eax에 놓은 다음 해당 주소 (* p1)의 값을 % edx에 배치합니다. 이제 % edx는 p1이 가리키는 값을 보유합니다.

레지스터는 함수에 대한 인수를 보유하지 않습니다. % edx에는 기본적으로 switchmode()에 대한 인수 중 하나가 포함되어 있다고 생각하지 마십시오. 인수는 항상 스택에 배치됩니다.

관련 문제