티스토리 뷰


C++을 인터페이스로 해서, 어셈블리를 함수처럼 다루는 방법입니다.

검색해도, 아무리 찾아도 잘 안보였는데
알고나니 너무나도 당연하고 쉬운 거네요.

비쥬얼스튜디오2008로 가능한 예제 소스를 만들었습니다.
(VS2008 미만 버젼은 masm이 포함되지 않아서 컴파일이 되지 않습니다. 컴파일 규칙에 ml을 다운받으셔서 새 규칙을 만드셔야 할겁니다. 그냥 VS2008을 설치하는 것을 추천드립니다. 그러면 ml이 자동적으로 설치됩니다. 무료버젼인 Visual C++ 2008 익스프레스도 가능합니다.)

먼저 빈 프로젝트를 생성한다음, asm파일과 cpp 파일을 생성합니다.

그리고 아래의 소스를 넣고 컴파일 해보시면, 어떻게 돌아가는지 아실겁니다.
(vs2008 이상인데도 컴파일이 안되면, 프로젝트 우클릭 -> 빌드 규칙 -> ml 클릭 하시면 될겁니다.)

파라미터 넘기고, 값 받아오는 것까지, 억지스러운 함수지만(주석을 안달았습니다.. 나중에 시간나면 정리를 해야겠네요), 어셈블리와 c++을 이해하고 있으면 쉽게 이해할 수 있으리라 생각합니다. (실행값을 보시고, 몇몇 변수들을 바꿔보시면 이해가 빠르실 겁니다.)

과제때문에 하는거라, 급히 올리는데... 필요하실 분이 많으실꺼 같아서 간단하게 만들어서 올려봅니다.. 이 글은 나중에 다시 정리해서 올리겠습니다.

 /******* main.c ******/
#include <iostream>

extern "C" {
short asmTest( short n, short count, short a[] );
}

using namespace std;

void main()
{
short a[5]; 
for(short i = 0; i < 5; i++)
a[i] = i;

short put=65;
short out = 0;

for(short i = 0; i < 5 ; i++)
{
out = asmTest( put, i, a );
cout<< i << "번째 값 : " << hex << a[i] << "-" << out << endl;
}
}
 
/********* asmTest.asm ******/
TITLE asmTest Procedure      (asmTest.asm)
.586
.model flat,C
asmTest PROTO,
 put:WORD, count:WORD, arr:PTR WORD
.code
asmTest PROC USES di,
 put:WORD, count:WORD, arr:PTR WORD
  mov eax,0
  mov ax,put
  mov ecx,0
  mov cx,count
  mov edi,arr

  mov [edi+(ecx*2)], ax

  mov ax, [edi+(ecx*2)]
 ret   
asmTest ENDP
END