티스토리 뷰

Programming Languages/C,C++

Assembly의 기초 공부

sw편한세상 2011. 4. 23. 21:03
완벽한 소스가 아니다.
(주)아임구루의 강석민 강사님에게 배운 것을 정리하다가 만 소스.
일단 어셈과 같이 컴파일 하기 위해서는 무료 어셈 컴파일러인 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

댓글
04-28 02:04
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday