해결된 질문
작성
·
433
0
fastcall이라는 규약이 메모리에 매개변수를 저장하는 것이 아니라, 레지스터 쪽에 매개변수를 저장해서, 메모리에 매개변수를 다시 저장할 필요가 없도록 만들기 때문에 속도가 빨라진다는 것으로 이해를 했습니다!
그런데, 제가 메모리를 찾아보니까 수업 중에서 예제로 드셨던 add 함수의 매개변수 param1, param2가 메모리에서 똑같이 잡혔는데, 이건 어떻게 이해하면 좋을까요? 디스어셈블리로 확인해보니까 ECX, EDX 레지스터에 각각 param값들이 저장이 잘 되는 것은 확인을 했는데, 상황이 그렇다면 fastcall인 경우 레지스터에만 값이 들어가면 될 것 같은데, 이게 똑같이 메모리에서 매개변수의 주소가 잡힌다는 것이 약간 의아합니다!
답변 1
0
아마도 x64 Release 빌드를 하셨나 봅니다. 이는 하드웨어 구조가 32비트 머신과 다르기 때문이며 현재는 대부분의 컴퓨터가 64비트 입니다. 그러나 관련 이론이 적립되던 시기는 16비트 혹은 32비트 등 구형 환경이었습니다.
컴파일러 최적화 과정에서 핵심적으로 고려하는 것은 당연히 하드웨어 입니다. 즉, CPU의 특성을 가장 우선 생각해 속도 최적화를 실시하는 것이 일반적입니다. 관련 컴파일러 설정을 변경할 경우 Release 빌드를 하더라도 전혀 다른 기계어로 번역됩니다.
결과적으로 32비트 환경으로부터 이어지는 이론으로 정리하고 컴파일러 최적화에 따라 큰 차이가 발생하는 것을 이해하시면 되겠습니다. 감사합니다.
헉 답변 감사드립니다..! 그런데 제가 컴파일을 예제대로, x86/Debug 으로 진행을 했었습니다..! 저번에 대학교에서 어셈블리 수업을 배웠을 때도 스택프레임 구조에 대해서 다루었는데, 그 논리가 비쥬얼 스튜디오 메모리 창에서는 뭔가 안 맞는 측면이 있어서 왜 그렇지 했는데 강의 영상을 보면서 의문이 해결되었어요. 64비트다 보니, 32비트 환경과는 조금 다르기 때문이라는 걸요.. ㅎㅎ
x86 디버그 모드에서도 주소창에 ¶m1을 검색을 했을 때 메모리가 잡히는 것 같아요.. ㅠㅠ 혹시 몰라서 예제와 굉장히 유사한 제 소스코드를 첨부해드리겠습니다..! 답변 감사드립니다!
#include <stdio.h>
void __fastcall add(int param1, int param2)
{
int a = param1;
int b = param2;
}
int main(void)
{
int a = 1;
add(3, 4);
return 0;
}