[performance] EBP 프레임 포인터 레지스터의 용도는 무엇입니까?

저는 어셈블리 언어의 초보자이며 컴파일러가 내 보낸 x86 코드가 일반적으로 EBP레지스터를 다른 용도로 사용할 수있을 때 릴리스 / 최적화 모드에서도 프레임 포인터를 유지한다는 것을 알았 습니다.

프레임 포인터가 코드를 디버그하기 쉽게 만드는 이유를 이해 alloca()하고 함수 내에서 호출되는 경우 필요할 수 있습니다 . 그러나 x86에는 레지스터가 매우 적으며 그중 하나가 충분할 때 스택 프레임의 위치를 ​​유지하기 위해 두 개를 사용하는 것은 나에게 의미가 없습니다. 최적화 / 릴리스 빌드에서도 프레임 포인터를 생략하는 것이 나쁜 생각으로 간주되는 이유는 무엇입니까?



답변

프레임 포인터는 디버거가 단일 상수 오프셋으로 지역 변수 또는 인수가있는 위치를 알 수 있도록하는 참조 포인터입니다. ESP의 값은 실행 과정에서 변경되지만 EBP는 동일하게 유지되어 동일한 오프셋에서 동일한 변수에 도달 할 수 있습니다 (예 : 첫 번째 매개 변수는 항상 EBP + 8에있는 반면 ESP 오프셋은 사용자가 밀기 때문에 크게 변경 될 수 있음). / 팝핑 것들)

컴파일러가 프레임 포인터를 버리지 않는 이유는 무엇입니까? 프레임 포인터를 사용하면 디버거는 지역 변수와 인수가 EBP에 대한 상수 오프셋에 있도록 보장되기 때문에 기호 테이블을 사용하는 위치를 파악할 수 있습니다. 그렇지 않으면 코드의 어느 지점에서나 지역 변수가있는 위치를 쉽게 파악할 수 없습니다.

Greg가 언급했듯이 EBP는 스택 프레임의 역 연결 목록을 제공하므로 디버거가 함수의 스택 프레임 (로컬 변수 + 인수)의 크기를 파악할 수 있으므로 디버거의 스택 해제에도 도움이됩니다.

대부분의 컴파일러는 디버깅을 정말 어렵게 만들지 만 프레임 포인터를 생략하는 옵션을 제공합니다. 이 옵션은 릴리스 코드에서도 전역 적으로 사용해서는 안됩니다. 사용자의 충돌을 언제 디버깅해야하는지 알 수 없습니다.


답변

이미 좋은 답변에 2 센트 만 더하면됩니다.

스택 프레임 체인을 갖는 것은 좋은 언어 아키텍처의 일부입니다. BP는 서브 루틴 로컬 변수가 저장된 현재 프레임을 가리 킵니다. (로컬은 음의 오프셋에 있고 인수는 양의 오프셋에 있습니다.)

완벽하게 좋은 레지스터가 최적화에 사용되는 것을 막는다는 생각은 다음과 같은 질문을 제기합니다. 최적화는 실제로 언제 어디서 가치가 있는가?

최적화는 1) 함수를 호출하지 않는, 2) 프로그램 카운터가 시간의 상당 부분을 소비하는 경우, 3) 컴파일러가 실제로 볼 수있는 코드 (즉, 라이브러리가 아닌 함수) 인 타이트 루프에서만 가치가 있습니다. 이는 일반적으로 특히 대규모 시스템에서 전체 코드의 매우 작은 부분입니다.

사이클을 없애기 위해 다른 코드를 비틀고 압착 할 수 있으며, 프로그램 카운터가 실제로 존재하지 않기 때문에 문제가되지 않습니다.

나는 당신이 이것을 묻지 않았다는 것을 알고 있지만, 내 경험상 99 %의 성능 문제는 컴파일러 최적화와 전혀 관련이 없습니다. 그들은 과도한 디자인과 관련이 있습니다.


답변

확실히 컴파일러에 따라 다릅니다. EBP 레지스터를 범용 레지스터로 자유롭게 사용하는 x86 컴파일러에서 내 보낸 최적화 된 코드를 보았습니다. (하지만 어떤 컴파일러를 사용했는지 기억하지 못합니다.)

컴파일러는 예외 처리 중에 스택 해제를 지원하기 위해 EBP 레지스터를 유지하도록 선택할 수도 있지만 이는 정확한 컴파일러 구현에 따라 달라집니다.


답변

그러나 x86에는 레지스터가 거의 없습니다.

이것은 opcode가 8 개의 레지스터에만 주소를 지정할 수 있다는 점에서만 사실입니다. 프로세서 자체에는 실제로 그보다 더 많은 레지스터가 있으며 레지스터 이름 변경, 파이프 라이닝, 예측 실행 및 기타 프로세서 용어를 사용하여 해당 제한을 극복합니다. Wikipedia에는 ​​x86 프로세서가 레지스터 제한을 극복하기 위해 수행 할 수있는 작업에 대한 좋은 소개 단락이 있습니다. http://en.wikipedia.org/wiki/X86#Current_implementations .


답변

스택 프레임을 사용하는 것은 원격으로 현대적인 하드웨어에서도 엄청나게 저렴합니다. 저렴한 스택 프레임이있는 경우 레지스터 몇 개를 저장하는 것이 중요하지 않습니다. 빠른 스택 프레임 대 더 많은 레지스터는 엔지니어링 트레이드 오프였으며 빠른 스택 프레임이 이겼습니다.

순수 레지스터를 통해 얼마나 절약하고 있습니까? 그만한 가치가 있습니까?


답변