2010-12-31 3 views
0

우리는 foo 문을 호출한다고 가정합니다. 그래서 어셈블러가 호출 문을 만나면 -x86 함수 호출 중에 jmp 주소를 찾는 방법은 무엇입니까?

push ip + 6 
jmp <addr of foo> 

나는 ebx 레지스터에 반송 주소를 가지고있다. 이제 나는 "addr of foo"를 찾고 싶다. 어떻게해야합니까? push 문이 jmp 앞에 있는지 확인하고 싶습니다. 메모리 맵은 이와 비슷한 모양입니까?

------- 
push (what will be the value stored in this byte?? opcode ??) 
------- 
jmp (what will be the value stored in this byte?? opcode ??) 
------- 
jmp byte 1 
------- 
jmp byte 2 
------- 
jmp byte 3 
------- 
jmp byte 4 
------- 
return address stored in ebx 
------- 

푸시 및 jmp의 opcode는 무엇입니까?

+1

'call'은 프로세서에서 실행하는 명령어입니다. 어셈블러에서는 변환하지 않습니다. 'push '와'jmp'와 동등한 것으로 생각할 수 있지만, 그들은 같은 것이 아닙니다. – wj32

+0

@ wj32 : 프로세서에서 호출을 실행하면 정상입니다. 점프 장소의 주소는 어떻게 얻습니까? – Bruce

+0

@ wj32 : call 문의 메모리 맵은 무엇입니까? – Bruce

답변

4

어셈블러는 call을 두 가지 명령으로 분해하지 않습니다. call은 자체 기계어 opcode가있는 별도의 명령어입니다.

통화 유형 (상대 값 또는 간접적으로 메모리 내용 등에 제공되는 근거리 또는 원거리 주소)에 따라 call에 대한 다양한 opcode가 있습니다. 32 비트 모드에서 일반적인 유형의 호출 호출)을 사용하는 경우 다음에 오는 명령에 상대적인 목표 주소를 지정하는 opcode E8과 4 바이트 값이 이어집니다.

자세한 내용은 위의 의견에 말한다 wj32 @으로하여 Intel Manual에서 call에 대한 항목, 볼륨 2

+0

통화 코드가있는 참조 번호를 알려주십시오. – Bruce

+0

@ Bruce : 표준 참조에 대한 링크를 추가했습니다. – interjay

1

call 유형에 따라 다릅니다. Intel manuals에서 필요한 모든 정보를 얻을 수 있습니다.

대상 피연산자 중 어느 코드 세그먼트 (코드 세그먼트의베이스로부터 오프셋 오프셋 절대 지정이 난 (근처 통화) 아래의 중요한 비트를 인용 할 것이다 명령어 인코딩 등을 포함) 또는 상대 오프셋 (EIP 레지스터의 명령어 포인터의 현재 값에 대한 상대 부호 첨부 변위 )이 값 은 CALL 명령어 다음의 명령어를 가리 킵니다. CS 레지스터가 근거리 전화에서 변경된 이 아닙니다.

0

dissembler를 사용하면 foo의 절대 주소로 끝날 수도 있습니다. 링커가 그렇게하고 컴파일 된 코드에 이름이 없기 때문입니다. 전역 변수에 대해서도 동일합니다. 예를 들어 u를 어셈블하면 j가 foo가됩니다. 하지만 compile then dissamble nd ull get j 0X45335

+0

어느 디셈 블러를 사용합니까? – Bruce

관련 문제