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인지 알 수 있습니까? 사전에
감사합니다!
왜 신경 쓰시겠습니까? 교과서는 도움이되지 않습니다. 컴파일러를 되돌려 야합니다. –
만약 당신이 ebp가 무엇인지 알고 있다면 eax가 레지스터 목록의 첫 번째 항목에 자주 나타나는 경우 eax를 모른다. –