Blue Sky! 2008. 6. 13. 12:13
__fastcall์€ C++๋นŒ๋” ํ”„๋กœ๊ทธ๋žจ์„ ํ•˜๋‹ค๋ณด๋ฉด ์•„์ฃผ ๋งŽ์ด ์ ‘ํ•˜๊ฒŒ ๋˜๋Š” ํ‚ค์›Œ๋“œ๋‹ค.

__fastcall์€ Calling Convention ์ฝœ๋ง ์ปจ๋ฒค์…˜์˜ ์ผ์ข…์ด๋‹ค.

์ฝœ๋ง ์ปจ๋ฒค์…˜์€ ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅผ๋•Œ ์–ด๋–ป๊ฒŒ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋ฅผ ๊ฑด๋„ค๊ณ  ์Šคํƒ์„ ์ •๋ฆฌํ• ์ง€์— ๊ด€ํ•ด ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆ˜์ค€์—์„œ์˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ทœ์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๊ณง ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ทœ์•ฝ ๋˜๋Š” ํ˜ธ์ถœ๊ทœ์ •์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํ˜ธ์ถœ๊ทœ์•ฝ์˜ ํ•ต์‹ฌ์€ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋ฅผ ์Šคํƒ์— ์™ผ์ชฝ(์•ž)๋ถ€ํ„ฐ ๋„ฃ์„ ๊ฒƒ์ธ๊ฐ€ ์˜ค๋ฅธ์ชฝ(๋งˆ์ง€๋ง‰)๋ถ€ํ„ฐ ๋„ฃ์„ ๊ฒƒ์ด๊ฐ€ ํ•˜๋Š” ๊ฒƒํ•˜๊ณ , ์Šคํƒ์„ ํ˜ธ์ถœํ•œ ์ชฝ์—์„œ ํ•ด์ œํ•  ๊ฒƒ์ธ๊ฐ€ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ํ•ด์ œํ•  ๊ฒƒ์ธ๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.  ํ•จ์ˆ˜ ๋ฆฌํ„ด ๊ฐ’์˜ ๊ฒฝ์šฐ๋Š” ๋Œ€๋ถ€๋ถ„ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ†ตํ•ด ๊ฑด๋„ค์ง€๋Š”๋ฐ ์ฃผ๋กœ EAX ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.

ํ˜ธ์ถœ๊ทœ์•ฝ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

* __cdecl :

    ์ „ํ†ต์ ์ธ C ์Šคํƒ€์ผ์˜ ํ˜ธ์ถœ๊ทœ์ •์œผ๋กœ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋ฅผ ์Šคํƒ์— ๋„ฃ์–ด ์ „๋‹ฌํ•  ๋•Œ ๋’ค์— ๊ฒƒ๋ถ€ํ„ฐ ๋จผ์ € ๋„ฃ๊ณ , ๋ฐ›์„๋•Œ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฅผ ํ†ตํ•ด return ๊ฐ’์„ ๋ฐ›์œผ๋ฉฐ, ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ์Šคํƒ์„ ํ•ด์ œํ•œ๋‹ค. ํ•ด์ œํ•œ๋‹ค๋ผ๋Š” ํ‘œํ˜„์™ธ์— ์ •๋ฆฌํ•œ๋‹ค๋ผ๋Š” ํ‘œํ˜„์„ ์“ฐ๊ธฐ๋„ ํ•˜๋Š”๋ฐ ์Šคํƒ์—์„œ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ฒ„๋ฆฌ๋Š” ์ž‘์—…์„ ๋œปํ•œ๋‹ค.

    C ์‹œ์ ˆ์—๋Š” ํ˜ธ์ถœ๊ทœ์•ฝ์ด ํ•˜๋‚˜ ๋ฟ์ด์—ˆ์œผ๋ฏ€๋กœ ์ด ํ‚ค์›Œ๋“œ๊ฐ€ ํ•„์š”์—†์—ˆ๋‹ค. ์•„๋‹ˆ ์ฝœ๋ง ์ปจ๋ฒค์…˜ ํ‚ค์›Œ๋“œ ์ž์ฒด๊ฐ€ ์—†์—ˆ๋‹ค.
    C ํ˜•์‹์˜ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ• ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

* __stdcall :

    OS๊ฐ€ ์œˆ๋„๋กœ  ๋ฐ”๋€Œ๋ฉด์„œ ๋Œ€๋ถ€๋ถ„์˜ API ํ•จ์ˆ˜์— ์ ์šฉ๋œ ํ˜ธ์ถœ๊ทœ์•ฝ์ด๋‹ค.  ํŒŒ๋ผ๋ฉ”ํ„ฐ๋Š” ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์Šคํƒ์— ๋“ค์–ด๊ฐ„๋‹ค. ์Šคํƒ์€ ํ˜ธ์ถœ ๋ฐ›์€ ํ•จ์ˆ˜๊ฐ€ ํ•ด์ œํ•œ๋‹ค.

    ๊ทธ๋Ÿฐ๋ฐ, ์˜ˆ์™ธ์ ์œผ๋กœ wsprintf ํ•จ์ˆ˜ ๊ฐ™์ด ๊ฐ€๋ณ€ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋ฅผ ์“ฐ๋Š” ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ๋Š” ํŒŒ์Šค์นผ์‹ ํ˜ธ์ถœ์€ ์•ˆ๋˜๊ณ , ์ „ํ†ต์ ์ธ C ํ˜•์‹์˜ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•œ๋‹ค.


* __fastcall :

    ์ „ํ†ต์ ์œผ๋กœ ํŒŒ์Šค์นผ์—์„œ ์‚ฌ์šฉํ•˜๋˜ ํ˜ธ์ถœ๊ทœ์•ฝ์„ ์ข€ ๋” ๋น ๋ฅธ ์†๋„๋ฅผ ๋‚ด๋„๋ก ๊ฐœ์„ ํ•œ ๊ฒƒ์ด๋‹ค. ์ผ๋ช… Register calling convention ๋ ˆ์ง€์Šคํ„ฐ ์ฝœ๋ง ์ปจ๋ฒค์…˜์ด๋ผ๊ณ ๋„ ํ•˜๋Š”๋ฐ, ์ฒ˜์Œ 2๊ฐœ์˜ ์ธ์ž๋Š” ๊ฐ๊ฐ ECX, EDX ๋ ˆ์ง€์Šคํ„ฐ์— ๋‹ด๊ณ  3๋ฒˆ์งธ ๋ถ€ํ„ฐ๋Š” ์Šคํƒ์„ ๋„ฃ๋Š”๋ฐ, ๋„ฃ๋Š” ์ˆœ์„œ๋Š” ์˜ค๋ฅธ์ชฝ์˜ ๊ฒƒ์„ ๋จผ์ € ๋„ฃ๋Š”๋‹ค. ์Šคํƒ ํ•ด์ œ๋Š” ํ˜ธ์ถœ ๋ฐ›์€ ํ•จ์ˆ˜ ์ชฝ์—์„œ ๋‹ด๋‹นํ•œ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ด์šฉํ•˜๋ฏ€๋กœ ์Šคํƒ์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ณด๋‹ค ํ›จ์”ฌ ์ฝ”๋“œ๋„ ์งง๊ณ  ์†๋„๋„ ๋น ๋ฅด๋‹ค.

    ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๊ฐ€์žฅ ๋น ๋ฅธ ํ˜ธ์ถœ ์†๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜, ์ดˆ๊ณ ์† ๊ทธ๋ž˜ํ”ฝ ๋“ฑ ๊ทนํ•œ์˜ ์Šคํ”ผ๋“œ๋ฅผ ์š”๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋“ฑ ์™ธ์—๋Š” __fastcall๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์†๋„ ์ด๋“์€ ๊ทนํžˆ ๋ฏธ๋ฏธํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋นˆ๋ฒˆํžˆ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ผ๋ฉด ์†๋„ ์ด๋“์ด ์—†๋‹ค๊ณ  ํ• ์ˆ˜ ์—†์œผ๋ฉฐ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์ ์˜ ์†๋„๋ฅผ ๋‚ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์œ ๋ฆฌํ•˜๋‹ค.

    ์ฐธ๊ณ ์ ์œผ๋กœ, Windows NT/200x ์ปค๋„ ๋ชจ๋“œ ๋“œ๋ผ์ด๋ฒ„์—์„œ๋Š” ๋” ์ด์ƒ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ด์šฉํ•œ ํ˜ธ์ถœ๊ทœ์•ฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋ฐ, ์ด์œ ๋Š” ๋ ˆ์ง€์Šคํ„ฐ๋Š” CPU์— ์ข…์†์ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ์™œ __fastcall์ด ๋งŽ์ด ์“ฐ์ด๋Š”๊ฐ€?

    ๊ทธ๊ฒƒ์€ ๊ฐ€์žฅ ๋น ๋ฅธ ํ˜ธ์ถœ๊ทœ์•ฝ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ, ๋ธํŒŒ์ด๊ฐ€ ์ด ํ˜ธ์ถœ๊ทœ์•ฝ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ธํŒŒ์ด๋กœ ์ œ์ž‘๋œ VCL๋ฅผ C++๋นŒ๋”๋„ ๊ฐ™์ด ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— __fastcall ์„ ๋งŽ์ด ๋ณผ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

* ๊ธฐํƒ€

    __declspec(naked)์ด๋ผ๋Š” ํŠน์ดํ•œ ๊ทœ์•ฝ๋„ ์žˆ๊ณ  __pascal, __fortran, __syscall๋กœ ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‚ฌ์žฅ๋œ ํ˜ธ์ถœ๊ทœ์•ฝ๋„ ์žˆ๋Š”๋ฐ, ์‹ค๋ฌด์—์„œ๋Š” ๊ฑฐ์˜ ๋ณผ์ผ์ด ์—†๋‹ค.



ํ˜ธ์ถœ ๊ทœ์•ฝ์— ๋Œ€ํ•œ ๋ณด๋‹ค ๊นŠ์€ ์ดํ•ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ƒ์˜ ์„ค๋ช…๋งŒ์œผ๋กœ๋„ ๊ณ ๊ธ‰ C++ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ถฉ๋ถ„ํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ•„์ž๊ฐ€ ์˜ˆ์ œ๋กœ ๋ณด์ด๋Š” ํด๋ž˜์Šค๋‚˜ ํ•จ์ˆ˜์—์„œ๋Š” __fastcall ์ด ๋ณ„๋กœ ์—†๋‹ค. ์™œ์ผ๊นŒ? ์ด๊ฑด ๊ทธ๋ƒฅ ํƒ€์ดํ•‘์ด ๊ท€์ž–์•„์„œ์ด๋‹ค. ๋‹ค๋ฅธ ์•„๋ฌด๋Ÿฐ ์ด์œ ๊ฐ€ ์—†๋‹ค. ๋ฌผ๋ก  ๋‹จ์ถ•ํ‚ค๋ฅผ ์จ์„œ ํ•œ๋ฒˆ์— ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ๋„ ๊ท€์ž–๊ณ ํ•ด์„œ, ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋งŒ ์‚ฌ์šฉํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , VCL ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฒƒ์€, VCL ํ•จ์ˆ˜๋Š” ๊ฑฐ์˜ __fastcall ๊ทœ์•ฝ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— VCL ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•  ๋•Œ๋Š” ์ƒ์„ฑ์ž ์†Œ๋ฉธ์ž๋Š” ๋ฌผ๋ก ์ด๊ณ  ์ƒ์†ํ•˜๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—๋Š” __fastcall๋ฅผ ๋ถ™์—ฌ ์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์ž์‹ ์ด ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜์—๋Š” ํ˜ธ์ถœ๊ทœ์•ฝ์„ ์ž๊ธฐ ๋งˆ์Œ๋Œ€๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.


์งˆ๋ฌธ : ๋งŽ์ด ๋ณด๋Š” CALLBACK ์ด๋‚˜ WINAPI ๋“ฑ์˜ ํ˜ธ์ถœ๊ทœ์•ฝ์˜ ์‹ค์ฒด๋Š” ๋ญ”๊ฐ€?
๋‹ต๋ณ€ : ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์˜๋ฌธ์ด ์ž๋™์œผ๋กœ ํ’€๋ฆด ๊ฒƒ์ด๋‹ค.

//---- windef.h ํ—ค๋”ํŒŒ์ผ
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
#define WINAPIV     __cdecl
#define APIENTRY    WINAPI
#define APIPRIVATE  __stdcall
#define PASCAL      __stdcall