나중에 또 뻘짓할게 뻔하기에... @,.@
.686 .model flat, StdCall option casemap:none .code ; int __stdcall test_sum(int _param1, int _param2) test_sum PROC StdCall _param1, _param2 mov eax, _param1 add eax, _param2 ret test_sum ENDP ; int __stdcall test_sum2(int _param1, int _param2) test_sum2 PROC StdCall _param1, _param2 mov eax, _param1 add eax, _param2 ret 08h test_sum ENDP end
이렇게 코드를 작성하면 매크로 어셈블러가 자동으로 prologue, epilogue 를 생성해주기 때문에 test_sum, test_sum2 함수는 모두 아래와 같은 동일한 코드로 변환됩니다.
push ebp mov esp, ebp mov eax, dword ptr [ebp+08h] add eax, dword ptr [ebp+0ch] leave ret 08h
어셈블리 코드에서 test_sum 함수는 ret 명령의 경우 파라미터 스택 사이즈를 지정하지 않았지만 ret 08h 로 자동으로 지정해주죠. 편합니다.
하지만 때때로 prologue / epilogue 를 자동생성하지 않게 해야 하는 경우도 있는데 이때는 option prologue, epilogue 로 함수 부분을 감싸주면 됩니다. 아래 test_sum3 함수처럼요.
.686 .model flat, StdCall option casemap:none .code ; int __stdcall test_sum(int _param1, int _param2) test_sum PROC StdCall _param1, _param2 mov eax, _param1 add eax, _param2 ret test_sum ENDP ; int __stdcall test_sum2(int _param1, int _param2) test_sum PROC StdCall _param1, _param2 mov eax, _param1 add eax, _param2 ret 08h test_sum ENDP option prologue:none option epilogue:none ; int __stdcall test_sum3(int _param1, int _param2) test_sum3 PROC Stdcall _param1, _param2 ; build stack frame push ebp mov ebp, esp mov eax, dword ptr [ebp+08h] add eax, dwrod ptr [ebp+0ch] ; restore stack frame mov esp, ebp pop ebp ret 08h test_sum3 ENDP option prologue:PrologueDef option prologue:EpilogueDef end
이상 허접한 팁이었습니다.
MSDN 의 MASM 레퍼런스에는 option 에 대한 키워드는 있는데, 각각의 옵션 키워드에 대한 설명이 없네요!! 왜 그런거지...