2013-07-14 2 views
0

C 프로그램에 IP 값을 등록하려면 어떻게해야합니까? 예를 들어, AXBX 값을 얻기위한 레지스터에는 의사 변수 _AX and _BX이 있습니다. IP 레지스터에 대한 의사 변수가 있습니까? 또는 다른 방법이 있습니까? 참고 : 실행될 다음 명령어의 오프셋 주소를 저장하기 때문에 IP 레지스터 값이 필요합니까?어떻게 IP 레지스터의 가치를 얻을 수 있습니까?

답변

3

C에는 CPU 레지스터에 대한 개념이 없으므로 일반 C에서는이 작업을 수행 할 수 없습니다. 어떤 컴파일러를 사용하는지에 따라 다음 중 하나를 사용해야합니다.

  • 컴파일러 내장;
  • 인라인 어셈블리; 또는
  • 외부 어셈블리 루틴

고유 사용할 수가 있는지 컴파일러의 설명서를 참조하십시오. 사용할 수있는 것이 없다고 가정하면 일종의 어셈블리가 유일한 옵션입니다. x86에는 IP 레지스터를 직접 읽을 수있는 명령이 없습니다. 대신에 call 명령어 (스택의 다음 IP를 저장)와 같은 것을 사용해야합니다.

여기 (& T 구문 AT) 86에서 IP를 얻을 수있는 하나 개의 방법 : 당신이 C 코드에서 다음

.globl get_ip 
get_ip: 
    mov 0(%sp), %ax 
    ret 

을, 당신은이 작업을 수행 할 수 있습니다

uint16_t get_ip(); 
... 
uint16_t ip = get_ip(); 

컴파일러가 인라인을 지원하는 경우 그런 다음 별도의 어셈블리 소스 파일이 필요없이 C 소스 코드 내에 get_ip 함수를 작성할 수 있습니다. 사용 가능한 경우 인라인 어셈블리 구문에 대한 컴파일러 설명서를 참조하십시오.

위의 과정은 16 비트 어셈블리에서 작업하고 있다고 가정합니다.이 어셈블리는 AX, BX 및 IP 레지스터에 대해 언급 한 이후로 가정합니다. 그러나 이것을 32 비트 코드에서 사용하려면 물론 레지스터의 이름을 %esp, %eax%eip으로 변경해야하고 get_eip()uint16_t 대신 uint32_t을 반환해야합니다.

+0

+1 멋진 답변 – pradipta

관련 문제