일부 저수준 코드를 작성 중이며 불필요한 수준의 함수 호출을 간접적으로 인식했으며 그 간접적 인 이유가 무엇인지 알지 못합니다.이상한 수준의 함수 호출 간접 호출
__declspec(noinline) int test123() { 0041FA70 sub esp,7Ch char buf[123]; return get_alignment(buf); 0041FA73 lea eax,[esp] 0041FA76 push eax 0041FA77 call get_alignment (40A38Fh) } ... get_alignment: 0040A38F jmp get_alignment (41FA60h) ... __declspec(noinline) int get_alignment(void * ptr) { return 1; 0041FA60 mov eax,1 }
그래서 : I는 ASM 모드 (Ctrl 키 +의 F11) I이 참조에 디버거 기능 검사()의 내부 코드를 단계별 나타나면
__declspec(noinline) int get_alignment(void * ptr)
{
return 1;
}
__declspec(noinline) int test123()
{
char buf[123];
return get_alignment(buf);
}
, 다음은 그 동작을 보여준다 더미 코드는 , 그 질문은 간접 참조의 여분의 레벨에 관한 것입니다 : get_alignment : 0040A38F jmp get_alignment (41FA60h)
WTF는 대략입니까? 난 그냥 그것을 얻지 않는다, 그것은 dll에서 함수를 가져올 수 없습니다, 그것은 실행 파일에 정의 된 로컬 함수입니다. 이 실행 파일은 모든 종류의 최적화 (링크 타임 코드 생성 제외)로 컴파일됩니다. get_alignment의 선언에 static
을 추가하면 여분의 간접 참조가 사라집니다. 그러나 나는 "고치기"를 찾고 있지 않다, 나는 그 여분의 도약이 왜 전혀 없는지 이해하고 싶었다.
내 실제 응용 프로그램에서는 실제로 .asm 파일로 작성된 함수를 사용하고 추가 점프가 생성 된 이유를 알 수 없습니다. 만약 내가 C- 모드 (C++이 아님)로 코드를 컴파일한다면 더 이상 간접적 인 수준을 보지 못할 것입니다 ...
누구나 그 이상한 행동에 대해 밝힐 수 있습니까?
감사합니다.
/ZI를 사용하지 않습니다./Zi를 사용합니다. Rayomond가 지적한 것처럼 점진적인 연결 문제가있었습니다. – Pavel