스택 프레임
함수 호출하려면 인자를 역순으로 스택에push하고 call한다. (call하면 함수 리턴 시 복귀할 주소가 스택에 push됨.)
함수에 들어가면 EBP(베이스 스택)을 push해서 저장해 두고 ESP(스택 포인터)를 EBP로 만들어서 새로운 스택 프레임에서 EBP를 기준으로 계산하여 사용함 EBP - x 는 local 변수 EBP + x 는 parameter( 스택은 거꾸로 자라서, 즉 스택은 push되면 주소가 작아지고 pop하면 주소가 커져서)
스택 늘릴때 SUB ESP, x(할당할 크기)
return할때 ESP를 EBP 로 바꿔주고 EBP에 POP하면 이전 EBP가 들어옴.
PUSH POP은 ESP기준
호출 함수에서 return 된 후
파라미터로 넘겨준 크기만큼 ADD ESP, (파라미터들 데이터 크기)
XOR EAX, EAX - 0으로 만들때 사용 MOV EAX,0 보다 빨라서 사용.
내 이해 정리 ESP는 POP, PUSH, SUB, ADD로 스택에 IO
EBP는 코드에서 사용할때 BASE가 되어서 EBP +- x 로 변수 접근 , 복귀 주소, 접근의 기준,책갈피, 북마크 느낌
test 명령어
test eax, eax - eax가 0이면 zf = 1 , eax가 0이 아니면 zf=0
jne 명령어
zf가 0이면 점프
https://learn.microsoft.com/ko-kr/sysinternals/downloads/process-explorer#download
process explorer
프로세스의 트리구조, pid, cpu점유율, 로딩된 DLL 정보 등 표시
함수 호출 규약
cdecl
-caller가 스택에 입력한 파라미터 정리
-가변길이 파라미터 전달 쉬움
stdcall
-callee가 스택에 입력된 파라미터 정리
-코드가 짧아짐
-다른 언어에서 API 호출할때 호환성이 좋음
fastcall
-stdcall 방식이랑 같은데 파라미터 일부를 레지스터를 이용해서 전달
-좀 더 빠른 함수 호출