2017-02-13 3 views
4

최근 내가 (나 strlen처럼, 어떤 전화 또는 지침을 필요로하지 않았다 것) 그들 중 일부를 들어, 어셈블리에서 일부 libc의 기능을 재 작성하고, 나는 프롤로그와 에필로그를 폐기 그것 없이는 실패했을 것입니다. (어쩌면 복잡한 테스트가 충분하지 않을 수도 있습니다.) 피어 리뷰 중에 누군가가 버리는 것은 나쁜 습관이라고 말했지만 그 이유를 설명 할 수는 없습니다.어셈블리 기능을 작성할 때 프롤로그 및 에필로그가 필수입니까? 내 테스트하지 않았기 때문에

그래서 prologue/epilogue 콤보가없는 asm 함수를 호출 할 때 문제가 발생합니까?

스택에 추가 공간이 필요하지 않은 경우에도 추가하는 것이 좋습니다.

몇 가지 이유로 의무적 인 경우 컴파일러 (필자는 nasm을 사용함)가 처리하지 않는 이유는 무엇입니까? 디버거는 당신이 지금에 기능을 알고하는

당신이 적절한 스택 프레임을 설정하지 않은 경우
+2

최적화 된 생산 코드에서는 필요하지 않은 경우 프롤로그/에필로그를 건너 뜁니다. 그러나 디버깅 또는 프로파일 링의 경우 클린 스택 프레임을 갖는 것이 유용 할 수 있습니다. 많은 디버거가 이에 의존합니다. – Ctx

답변

4

를 읽기위한

덕분에, 그것은 어려울 수 있습니다. ELF 타겟에서 명시 적으로 스택 프레임을 설정하지 않으면 수동으로 CFI 데이터 (cf. this article)를 제공해야합니다. CFI 데이터가 없으면 스택 되감기가 작동하지 않으며 디버거가 현재 어떤 기능이 있는지 찾을 수 없을 수도 있습니다. CFI 데이터를 수동으로 추가하지 않는 한 (다소 지루하고 잘못되기 쉽기 때문에) 사소한 성능 손실을 수용하고 전체 스택 프레임을 설정하십시오.

+0

좋아, 알았어. 내 함수에 새로운 스택 프레임을 사용하거나 사용하지 않고 디버그를 시도해보다 나은 결과를 얻으려고한다. –

관련 문제