티스토리 뷰
완벽한 소스가 아니다.
(주)아임구루의 강석민 강사님에게 배운 것을 정리하다가 만 소스.
일단 어셈과 같이 컴파일 하기 위해서는 무료 어셈 컴파일러인 NASM을 설치하고
C:\>nasm -f win32 -o name.obj, name.asm을 실행하여 목적소스로 만든 후 윈도우 컴파일러 (cl.exe)를 통해 같이 링크 해야 한다. 순서를 적자면
C:\>cl name.cpp /c
명령어를 통해 name.obj로 컴파일만 한 뒤
C:\>nasm -f win32 -o name2.obj, name2.asm
를 실행하여 어셈블러를 컴파일 한다 그 다음 윈도우 링커인 link.exe 를 사용하여 링킹을 하게 되면 PE(Portable executable) 포맷이 생긴다.
일반적인 command에서는 path가 설정돼 있지 않기 때문에 실행되지 않고, visual studio xxx 용 command를 사용해야 한다. 아니면 프로젝트 설정해서 변경해도 되고..
(주)아임구루의 강석민 강사님에게 배운 것을 정리하다가 만 소스.
일단 어셈과 같이 컴파일 하기 위해서는 무료 어셈 컴파일러인 NASM을 설치하고
C:\>nasm -f win32 -o name.obj, name.asm을 실행하여 목적소스로 만든 후 윈도우 컴파일러 (cl.exe)를 통해 같이 링크 해야 한다. 순서를 적자면
C:\>cl name.cpp /c
명령어를 통해 name.obj로 컴파일만 한 뒤
C:\>nasm -f win32 -o name2.obj, name2.asm
를 실행하여 어셈블러를 컴파일 한다 그 다음 윈도우 링커인 link.exe 를 사용하여 링킹을 하게 되면 PE(Portable executable) 포맷이 생긴다.
일반적인 command에서는 path가 설정돼 있지 않기 때문에 실행되지 않고, visual studio xxx 용 command를 사용해야 한다. 아니면 프로젝트 설정해서 변경해도 되고..
#include <stdio.h> int asm_main(); int main(){ int num; printf("hello world"); num = asm_main(); printf("%d\n", num); return 0; } // /FAs 를 입력하면 cl.exe을 통해 어셈으로 만들 수 있다. // Calling Convention // __cdecl - default - 인자를 스택에 저장하고, 스택파괴를 호출한자가 함 // __stdcall - 인자를 스택에 저장하고, 스택파괴를 호출당한자가 함 // fastcall - 인자를 레지스터에 저장 // 1. 인자를 어디로 전달할 것인가? // 2. 인자 전달 스택은 누가 파괴? // 3. 함수 이름은 어떻게 mangling 할 것인가?
; command line ; call은 stack을 사용 합니다. ; 사용자 빌드 도구에서 ; nasm -f win32 -o name.obj name.asm ; EAX, EBX register (범용레지스터) ; EDX, ECX ; ESP 레지스터 cpu관련 segment .text global _asm_main _asm_main: mov edx, 10 mov ecx, 20 call foo ret foo: ; sub - subtract ; add - add ; mov - move ; jmp - jump sub esp, 8 ; int x, y mov dword[ebp-4], 0 ; 첫번째 변수 접근하기 ; asm에서는 포인터 이기 때문에 []을 해줘야 값 접근 가능함 mov eax, edx add eax, ecx ret ;;;;;;;;;;;;;;;;;;;;; 핵심 ;;;;;;;;;;;;;;;;;;;; ; 함수의 prolog push ebp mov ebp, esp sub esp, 8 ; 함수의 epilog mov esp, sbp pop ebp ret [ebp+8] => 함수의 1번째 인자 접근 [ebp-4] => 지역변수 접근 ;;;;;;;;;;;;;;;;;;;;; 핵심 ;;;;;;;;;;;;;;;;;;;; goo: ; push는 stack이고, 4 바이트 DD, DW, DB mov eax, dword[esp+4] ; EBP 레지스터는 intel에서 제공하는 레지스터로, 돌아갈주소를 저장하는 레지스터 ; ESP 는 현재 스택의 주소를 나타냄 ; 인자 전달용 스택을 파괴할 때 ; 1) 호출자가 인자 전달 스택 파괴 - 표준C의 원리 ; 2) 호출 당한자가 인자 전달 스택 파괴 - 메모리 사용량이 적다. ; 함수내에서 스택을 사용하기 위해서 ; push ebp ; 끝에서 pop ebp
; asm에서 c호출하기 ; extern _f1 : c에 있는 f1함수 ; __stdcall : _f2@8 ; print함수 만들기 segmant .data L1 DB "hello", 10, 0 ; "hello\n" ; 제어문과 반복문 AAA: add eax, ecx loop
'Programming Languages > C,C++' 카테고리의 다른 글
Editplus, VisualC++ 컴파일러에서 어셈블리까지 (1) | 2011.04.26 |
---|---|
ProcessID를 갖고 윈도우핸들 얻어오기 (0) | 2011.04.23 |
윈도우핸들, 프로세스ID, 프로세스핸들 (1) | 2011.04.23 |
TEXT Encoding에 대하여. (2) | 2011.04.23 |
MS Visual C++ 10.0 에서 CString을 char * 타입으로 캐스팅 방법 (0) | 2011.03.26 |
댓글
01-03 00:52
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday