1. Basic Execution Program Registers

위 그림은 IA-32 Architectures Software Developer's Manual Volume:1 에서 가져온 그림이다.
(아래 내용들도 역시  IA-32 Architectures Software Developer's Manual Volume:1 여기서 가져온 내용이며, 한글설명은 본인의 생각이다.)
IA-32 에서 사용되고 있는 레지스터들을 보여주고 있다.

어셈블리 프로그래밍을 할때 최소한 이 레지스터들이 뭐하는 것들인지는 알고 있어야 프로그램이 가능하므로, 공부해보도록 하자.

1.1  General-Purpose Registers

  •  EAX : Accumulator for operands and results data. (그냥 산술 연산에 쓰이는 레지스터.  그냥 일반적으로 많이 쓰인다. )
  •  EBX: Pointer to data in the DS segment. ( Base 레지스터라고 알아두면 된다. 꼭 이 용도로만 사용되는 것은 아니다.)
  • ECX: Counter for string and loop operations. ( Loop 명령시 ecx 레지스터값을 보고 0 이 아니면 반복문을 실행한다.  왜 꼭 loop 를 돌때 ecx 를 참고하냐고?? intel 에서 그렇게 만들었으니까)
  • EDX: I/O pointer. ( destination 레지스터라고 알아두면 된다. 꼭 이 용도로만 사용되는 것은 아니다.)
  • ESI: Pointer to data in the segment pointed to by the DS register; source pointer for string operations.(source index 레지스터라고만 알아두자.)
  • EDI: Pointer to data (or destination) in the segment pointed to by the ES register; destination pointer for string operations.(destination index 라고 알아두자.)
  • ESP: Stack pointer (in the SS segment). ( 좀 중요하다 스택 push, pop 할때 자주 나오므로 알아두면 좋다. esp 값을 바꾸지 않아도 push, pop 명령으로 알아서 esp 값이 바뀐다.)
  • EBP: Pointer to data on the stack (in the SS segment). ( base pointer 로서 esp 값이 계속 바뀌므로 스택의 기준점을 정하기 위해 ebp 사용한다. 보통 push ebp , mov ebp,esp 명령을 내린다.)

 

'E' 가 붙은 것은 32bit 레지스터이고 ax,bx,cx,dx 는 16bit, ah,al ... 은 8bit 이다. 자세한 이해는 아래그림을 참고하면 된다.




나머지 레지스터들은 그렇게 비중이 있는 것은 아니니까 ... skip...
필요하면 언급하겠음.


MASM 이란?
Microsoft Macro Assembler 란 뜻으로
MS 에서 무료로 제공해 주는 어셈블러 이다.

어셈블러로 목적코드를 만들때 쓰는 프로그램은 ml 이고,
실행파일을 만들기 위한 링커는 link32 또는 link16 또는 link 이다.

믈론,  Visual Studio Express(무료) 버전을 설치해도 ml 과 link 는 제공된다.

MASM 설치하기

먼저 필요한것들로는

MASM 6.15 혹은 MASM 6.11 혹은 MASM32 SDK (v10)

이 세가지중 하나가 있으면 되겠다.

MASM 6.15 를 가지고도 win32 application 프로그래밍이 가능하지만, MASM32 가 대세인듯 하다.

모두 무료제공이니 인터넷에서 다운받아 설치하면 된다.

MASM 6.15 버전은
"Assembly Language For Intel-Based Computers, 4th" 의 책에서 제공되는 프로그램을 설치하면
Irvine32.inc 와 Irvine32.lib 이 같이 설치되고 make32.bat 파일로 바로 실행파일까지 만들어 준다.

만약 Irvine32.inc 와 Irvine32.lib 을 못구하면 역시 인터넷에서 다운받아 사용할수 있다.

Irvine32 파일은 여러가지 라이브러리를 제공해 주므로 가지고 있으면 여러므로 편하게 사용할 수 있다.

MASM with IDE

요즘 코딩은 IDE 가 없으면 상당히 불편하다. 이를 위해 WinAsm 이란 IDE 툴을 설치하면 작업하기 한결 편리하다.
WinAsm 의 라이센스 정책이 어떤지 모르겠으나 winasm.net 사이트에서 다운받아 사용할수 있다.

그리고 약간의 설정을 해준다면 MASM32 + WinAsm 으로 통합환경을 만들수 있다.
물론 Visual Studio 2005 나 Visual Studio 2008 로도 가능하지만,
Visual Studio 는 어디까지나 상용 버전이기 때문에 설명은 하지 않겠다.

물론 Express Edition 은 무료로 제공하고 있으니, Express Edition 으로 작업해도 무방할듯 하다.

WinAsm 설정

일단  WinAsm 압축파일을 다운받아 압축을 풀면 WinAsm 폴더가 생긴다. 이것을 자신이 원하는 곳으로 옮기면 설치는 끝난다. 따로 설치를 할 필요가 없다.
이것은 단지 Tool 이므로 세팅을 통해서 MASM 과 연결시켜야 한다.

MASM 과 연결시키는 방법은 다음과 같다.


실행 화면에서 [Tools] -> [Options] 를 선택한다.

[Options] 의 Files&Paths 탭 항목에서 MASM32 가 설치된 디렉토리의 각 경로게 맞게 설정해준다.

이렇게 하면 기본 설정은 끝이 난다.

Assembly & Linking &  Execute

설정이 끝났으면
[File] -> [New Project] 를 선택해서 프로젝트를 하나 생성한다.
Standard EXE 를 선택해도 되고 Console Application 을 선택해도 된다. 여기서는 Console Application 으로 해보겠다.

그리고 원하는 asm 코드를 작성하면 된다.

 


	INCLUDE	Irvine32.inc
	.data
	message		BYTE	"Hello, World! ",0dh,0ah,0
	
	.code
	main PROC
	mov			edx,OFFSET message
	call			WriteString
	call			WaitMsg
	exit
	main ENDP
END main



그 다음에 [Make] -> [Assemble] , [Make]->[Link] 를 해야 되는데
이상하게 Link 가 되지 않는다. WriteString , WaitMsg 함수 심벌을 못찾는다고 한다.

이 이유는 Irvine32 라이브러리 함수이기 때문에 이 링킹 옵션에 이 라이브러리를 추가시켜주어야 한다.
Irvine32.inc 파일은 include 폴더에 Irvine32.lib 은 lib 폴더에 복사해 주고

[Project] -> [Properties] 를 선택한 후

Debug 와  Release 탭의 Link 란에
irvine32.lib user32.lib kernel32.lib 을 추가해준다.

그리고 다시 assemble 과 link 를 실행하면 exe 파일이 생성된다.
그리고 [Make] -> [Execute] 를 하면

실행화면이 나타난다.


소스코드의 설명은 생략......

다음번엔 이런 자세한 설명은 없을 듯....

순전히 나의 공부를 위해서 !!!!

+ Recent posts