inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

독하게 되새기는 C 프로그래밍

함수호출규약 중에서 fastcall 관련 질문 드립니다!

해결된 질문

509

richard218

작성한 질문수 1

0

fastcall이라는 규약이 메모리에 매개변수를 저장하는 것이 아니라, 레지스터 쪽에 매개변수를 저장해서, 메모리에 매개변수를 다시 저장할 필요가 없도록 만들기 때문에 속도가 빨라진다는 것으로 이해를 했습니다!

 

그런데, 제가 메모리를 찾아보니까 수업 중에서 예제로 드셨던 add 함수의 매개변수 param1, param2가 메모리에서 똑같이 잡혔는데, 이건 어떻게 이해하면 좋을까요? 디스어셈블리로 확인해보니까 ECX, EDX 레지스터에 각각 param값들이 저장이 잘 되는 것은 확인을 했는데, 상황이 그렇다면 fastcall인 경우 레지스터에만 값이 들어가면 될 것 같은데, 이게 똑같이 메모리에서 매개변수의 주소가 잡힌다는 것이 약간 의아합니다!

c kernel secure-coding

답변 1

0

널널한 개발자

아마도 x64 Release 빌드를 하셨나 봅니다. 이는 하드웨어 구조가 32비트 머신과 다르기 때문이며 현재는 대부분의 컴퓨터가 64비트 입니다. 그러나 관련 이론이 적립되던 시기는 16비트 혹은 32비트 등 구형 환경이었습니다.

컴파일러 최적화 과정에서 핵심적으로 고려하는 것은 당연히 하드웨어 입니다. 즉, CPU의 특성을 가장 우선 생각해 속도 최적화를 실시하는 것이 일반적입니다. 관련 컴파일러 설정을 변경할 경우 Release 빌드를 하더라도 전혀 다른 기계어로 번역됩니다.

결과적으로 32비트 환경으로부터 이어지는 이론으로 정리하고 컴파일러 최적화에 따라 큰 차이가 발생하는 것을 이해하시면 되겠습니다. 감사합니다.

0

richard218

헉 답변 감사드립니다..! 그런데 제가 컴파일을 예제대로, x86/Debug 으로 진행을 했었습니다..! 저번에 대학교에서 어셈블리 수업을 배웠을 때도 스택프레임 구조에 대해서 다루었는데, 그 논리가 비쥬얼 스튜디오 메모리 창에서는 뭔가 안 맞는 측면이 있어서 왜 그렇지 했는데 강의 영상을 보면서 의문이 해결되었어요. 64비트다 보니, 32비트 환경과는 조금 다르기 때문이라는 걸요.. ㅎㅎ

 

x86 디버그 모드에서도 주소창에 &param1을 검색을 했을 때 메모리가 잡히는 것 같아요.. ㅠㅠ 혹시 몰라서 예제와 굉장히 유사한 제 소스코드를 첨부해드리겠습니다..! 답변 감사드립니다!

 

 

 

#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;

}

병행성 제어

0

53

2

질문이 있습니다(강의와 거의 상관이 없는)

0

79

2

컴파일러 서적 질문입니다

0

165

1

코드생성 및 최적화 질문입니다

0

168

1

Hex Editor를 이용한 다국어 번역 관련 질문입니다

0

213

2

큐의 배열을 넘겨도 정상작동합니다

0

159

2

캐너리비트에 관하여 질문

0

220

3

상수화된 문자열에 질문있습니다

0

176

1

함수 호출 매개변수 전달에 대한 질문 드립니다.

0

195

1

단항 증감 연산에 따른 다른 접근에 대한 질문있습니다.

0

212

2

함수호출 규약 종류에 따른 장단점 여부

0

235

2

정적라이브러리 링크 오류

0

227

1

const char *를 char*에 초기화할때의 컴파일 에러 처리 방식 문의

0

359

2

pszParam 수정이 왜 Hello World print에도 영향을 미치는지 이해가 잘 안됩니다.

0

261

2

비선형 자료구조

0

314

1

자료 구조 공부 후에

0

357

1

강의자료 관련

0

254

1

마지막에 말씀하신 부분 질문드립니다.

0

216

1

문자열 관련 질문 드립니다

0

293

1

라이브러리

0

276

1

부동소수점

0

397

1

왜 변수 주소 사이에 offset이 있는 건가요?

0

307

2

stack 쌓는 순서

0

515

1

함수호출이랑 쓰레드

0

415

1