2013년 2월 5일 화요일

MASM 팁

어셈블리 뻘짓 하던 내용을 정리해서 포스팅합니다.
나중에 또 뻘짓할게 뻔하기에... @,.@


.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 에 대한 키워드는 있는데, 각각의 옵션 키워드에 대한 설명이 없네요!! 왜 그런거지...