Introduction

어셈블리(Assembly)라고 하면 보통 '너무 오래된 언어', '구닥다리 언어', '배우기 어려운 언어', '외계문자' 등의 생각을 하는 분들이 많이 있습니다. =_= 하지만 어셈블리는 알고보면 정말 재미있고, 흥미로운 언어임에 틀림 없습니다. 그리고 어셈블리는 절대 사라지지 않을 멋진 녀석입니다. O/S를 만들때도, C언어로 만들긴 하지만 kernel 은 아직도 어셈블리로 만든다고 합니다. 그만큼 강력하고 무엇이든 할 수 있는 강한놈이죠. 하지만 처음 언어가 나온지 오랜 시간이 지난만큼, 다른 언어에 비해 정보를 얻기 힘이 듭니다. 오늘은 어셈블러에는 어떤 종류가 있고, Visual Studio 에서 어떻게 개발할 수 있는 지에 대해서 알아보도록 하겠습니다.


어셈블러(Assembler)의 종류

MASM(Microsoft Macro Assembler), NASM(Netwide Assembler), FASM(Flat Assembler), GAS(GNU Assembler), YASM 등 정말 다양한 종류가 있습니다. 그럼 여기서 잠시 질문하나 드리겠습니다. 어셈블리(Assembly)는 무엇이고 어셈블러(Assembler)는 무엇일까요? 그렇습니다. 어셈블리는 언어를 말하는 것이고, 어셈블러는 compiler 를 의미하는 것입니다. 물론 어셈에서는 C언어처럼 컴파일 이라는 용어대신 Assemble 한다고 표현하며, 이 동작을 해 주는 녀석을 Assembler 라고 말합니다.

 자, 그럼 위에서 나열한 것은 Assembler 의 종류입니다. 그런데 왜 각각에 대해서 문법이 다를까요?
Assembler 마다 지원하는 platform 이 다르고, syntax 형태도 차이가 있습니다. 당연히 platform 에 따라 종류를 나누면 상당히 많은 어셈블리가 존재하지요. 인텔(Intel)의 IA-32 Assembly 도 있고, IA-64 Assembly 도 있습니다. 그 이외에 상당히 많은 종류의 어셈블리(Assembly)가 존재하지요. syntax 에는 Intel 방식과 AT&T 방식이 있습니다. 자세한 내용은 아래에서 계속 설명 드리도록 하겠습니다.


GAS(GNU Assembler)

GAS 는 약자 속에 나와 있듯이 GNU Project 에서 사용되고 만들어진 어셈블러입니다. 당연히 GCC 안에 기본적으로 사용되는 녀석이기도 하지요. Linux 에서 인라인 어셈을 해 보신 분은 GAS가 어떤 syntax 를 사용하는지 아실겁니다. 바로 AT&T 입니다. 제가 싫어하는 문법이기도 하지요 =_=; 간단히 예를 들면 MOV EAX, 80 을 MOV $80, %EAX 로 표현합니다. MOV $80, %EAX 는 AT&T 이고, 다른 하나는 Intel syntax 입니다. 여튼 GAS는 Free Software 이고, Cross Platform 을 지원합니다.


MASM(Microsoft Macro Assembler)

가장 많이 들어보셨을 어셈블러(Assemler)라고 생각합니다. Microsoft 에서 만들었으며, 많은 사랑을 받아온 어셈블러입니다. 64-bit 도 지원하며, syntax 는 Intel 방식을 따릅니다. 개인적으로 저는 이 syntax 가 가독성이 좋습니다. MASM 는 초기에 유료로 제공되었으며 사용하기 위해서는 별도로 설치를 해 주어야 합니다. 하지만 이제는 뮤로로 제공되며 고맙게도 Visual Studio 2008 이상 버젼부터는 기본적으로 MASM v9.0이 기본적으로 포함되어 있기 때문에 별도 설치를 해 줄 필요가 없습니다. 더불어 MASM 은 이름에서도 알 수 있듯이, 강력한 Macro 를 지원해줌으로써 프로그래머가 좀 더 편리하게 개발 할 수 있도록 지원해 줍니다. 편리하긴 하지만 때론 Assemly 의 참 모습을 잃어가는 것 같아 조금 아쉽기도 하네요. 참, 아시다시피 cross-platform 은 지원되지 않습니다 ^-^;

참고 사이트
http://www.masm32.com
http://www.movsd.com


NASM(Netwide Assembler)

80x86 platform 용으로 개발된 어셈블러입니다. 그리고 open-source 로 시작되었지요. 왜 그랬을까요? 네, 바로 Microsoft 때문입니다 -_-; 당시 Microsoft 의 MASM은 상용으로서 돈을 지불하고 사야만 했기 때문이죠. 그렇기에 MASM과 비슷한 점이 많고, 사람들의 비교 대상도 되곤 합니다. NASM의 장점은 현재는 Cross-Platform 을 지원한다는 것과 Macro(단, x86 platform에서) 를 제공한다는 것입니다. 그렇기에 일반적으로 Kernel 과 같이 O/S를 개발할 경우에 많이 사용되는 Assembler 입니다.

참고 사이트
http://www.nasm.us



이외의 Aseembler

이밖에 어셈블러(Assembler)는 다음 주소를 참고하시기 바랍니다.
JWASM : http://www.japheth.de/JWasm.html
FASM : http://flatassembler.net/
YASM : http://www.tortall.net/projects/yasm/




Visual Studio 2008 & MASM

 MASM 을 사용하기 위해서 꼭 Visual Studio 가 필요한 것은 결코 아닙니다. MASM32 v10 을 설치하면 Quick Editor 라는 IDE 툴이 제공됩니다. 그리고 IDE 없이 console 에서 얼마든지 어셈블이 기능합니다. 하지만 C++ 프로젝트에 ASM을 사용하는 거라면 아무래도 Visual Studio 2008에서 개발하는게 편하겠죠. 저는 IDE 툴을 여러개 나눠서 쓰는것이 싫어서 Visual Studio 을 사용하는 것을 선호합니다.

[ MASM32 v10 의 Quick Editor]


MASM 설치하기

Visual Studio 2005 이하의 버젼이라면 Microsoft 홈페이지에서 별도로 MASM을 다운받아 설치하셔야 합니다. 하지만 Visual Studio 2008 이상의 버젼이라면 고민할 필요가 없습니다. 기본적으로 설치되어 있기 때문이죠. T^T

Program Files\Microsoft Visual Studio 9.0\VC\bin

다음 path 에서 ml.exe 를 실행시키면 다음과 같은 output 을 보실 수 있습니다.

Microsoft (R) Macro Assembler Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: ML [ options ] filelist [ /link linkoptions]
Run "ML /help" or "ML /?" for more info

하지만 여기서 끝난것이 아닙니다.
Visual Studio 2008 에 MASM 이 있긴 하지만, *.inc 와 *.lib 파일은 포함되어 있지 않습니다. 다시 말해 그냥 어셈블러만 있을 뿐 필요한 몇몇 것들이 없다는 것이죠. *.inc 는 쉽게 설명하자면 함수들(*.lib)의 프로토타입을 정리해 놓은 파일입니다. kernel32.inc 파일안에는 어떤 내용이 있을지 상상이 가시나요~? 그걸 모두 일일이 타이핑 한다는 생각을 하니 끔찍하군요.
그렇습니다. 우린 기존에 있는걸 가져다 써야 합니다. -_-; 그러기 위해서는 보통 http://kipirvine.com/asm/ 에서 irvine이라고 압축된 것을 이용하거나, 저처럼 MASM32 를 다운로드 받아 include 와 lib 를 가져다 사용합니다.(MASM32 v10 의 include 와 lib 만 따로 압축해서 게시물에 올려두었습니다)

masm32v10_inc_lib.zip

Kip Irvine 은 아마도 사람 이름입니다. 그 사람이 압축해 놓은 걸 겝니다~. 이 파일들 경로 설정은 프로젝트 속성에서 해야 하므로 밑에 Sample 설명을 할때  말씀 드리도록 하겠습니다.

 

Syntax Highlight 설정하기

기본적으로 Visual Studio 에서 .asm 의 확장자로 파일을 생성하면, Syntax Highlight 가 적용되지 않습니다. 상당히 불편하죠. 이를 해결하기 위한 방법은 다음과 같습니다.

1. usertype.dat 파일을 이용하는 방법
Keyword 가 들어있는 usertype.dat 파일을 생성한 뒤, \Program Files\Microsoft Visual Studio 9.0\Common7\IDE 폴더에 집어 넣습니다.(visual studio 2008 은 \Program Files\Microsoft Visual Studio 8.0\Common7\IDE)


이후, Visual Studio 에서 도구->옵션->텍스트편집기->파일 확장명에 asm 을 추가해 주시면 됩니다.


 


2. Addin 을 설치하는 방법

개인적으로 가장 선호하는 방법입니다. 여러가지 addin 이 있으니 본인이 마음에 드는 것을 설치하시면 됩니다. 저는 http://asmhighlighter.codeplex.com/ 를 이용합니다. MASM 뿐만 아니라 NASM 까지 지원합니다. Syntax는 x86 ASAM 을 지원합니다.


Sample Code!

이제 환경 샘플 코드를 통해서 Assemble 해 보도록 합시다.

1. 프로젝트 생성

먼저 콘솔 응용프로그램을 생성합니다. 빈 프로젝트로 말이죠.



2. 코딩~

위 그림처럼 asm 확장자를 갖는 파일을 하나 생성합니다. 그리고 아래 코드를 타이핑 해 봅시다.



3. 빌드규칙 지정하기


코드도 타이핑하였으니, 이제 빌드를 하면 됩니다. 그냥 빌드를 하면 오류가 발생할겁니다. 왜냐면 .asm 에 대해서 빌드 방법을 지정해 주지 않았기 때문이죠. 위 그림처럼 프로젝트를 선택한 뒤, 프로젝트 -> 사용자 지정 빌드규칙 을 선택합니다. 그리고 아래처럼 ASM에 대해서 빌드 방식을 지정해 줍니다. 




5. include 파일과 lib 파일 경로 지정 / 실행

위에서 *.inc 과 *.lib 파일이 필요하다고 했던것 기억나실겁니다. 이제 이 경로를 지정해 주어야 합니다.

프로젝트 -> 속성 -> 구성속성 -> 일반 을 보면 위와 같이 '추가 라이브러리 디렉터리' 라는 곳이 있습니다. 이곳에 lib의 상위 path 를 적어주시면 됩니다. 그림의 경우 D:\masm32\lib 에 라이브러리 파일들이 있으므로 D:\masm32 라고 적어주었습니다.

그리고 Microsoft Macro Assembly -> General 에서 Include path 를 적어줍니다. 이 부분의 본인의 편의에 따라 맞게 적어주시면 됩니다.
저의 경우 D:\masm32\include 안에 *.inc 파일이 있습니다. 만약 위에 그림처럼 D:\masm32 라고 적는다면 코드에서는 "INCLUDE include\windows.inc" 라고 적어주어야 합니다. 같은 이치로 코드에서 include masm32\include\windows.inc 형태로 작성하고 싶다면, 위에 화면에서 D:\ 라고만 적어주시면 됩니다.


이후 F5를 눌러 실행하면 성공적으로 MessageBox를 보실 수 있습니다.



정리

오늘의 포스팅 주제는 사실 'ASM으로 DLL 을 만들어 활용하기' 로 기획했습니다. 하지만 이것저것 주저리 주저리 적다보니 내용이 너무 길어졌군요. ㅠ.ㅜ 항상 이런 식인것 같습니다. 왜 항상 글을 쓰기 시작하면 삼천포로 빠지든가, 쓸모 없는 내용이 길어지나 모르겠습니다. 여튼 각설하고 다음에는 정말 처음 기획한 주제에 대해서 포스팅하도록 하겠습니다. ^-^;