자바에서 인라인 어셈블리를 하기 위해서는 자바 JNI를 이용해야 한다.


관련 글 : http://huammmm1.tistory.com/444


-----------------------------------------------------------------------


1. 32bit dll을 이용한 인라인 어셈블리


이제 인라인 어셈블리를 하고자 하는 c함수안에 다음과 같이 작성해보자. (intel syntax)


#include<jni.h>

#include "jni_HelloWorld.h"

#include<stdio.h>

JNIEXPORT jint JNICALL Java_jni_HelloWorld_print(JNIEnv *env, jobject obj)

{

int a=10;

__asm {

mov a, 20

}

return a;

}


a를 10으로 초기화하고, 인라인 어셈블리로 a에 20을 할당하는 간단한 예제이다.


이 c파일을 cl 컴파일러를 사용해 32bit dll로 빌드 한 뒤 실행해보면 20이 출력됨을 확인할 수 있다.




2. 64bit dll을 이용한 인라인 어셈블리 


이번에는 같은 c파일을 64bit dll로 빌드해보면 다음과 같은 에러가 발생한다.


'이 아키텍처에서는 '__asm' 키워드를 사용할 수 없습니다.'


MS 컴파일러는 64bit 인라인 어셈블리를 지원하지 않아서(그렇다고 들었다) 발생하는 문제이다.


이 문제를 해결하기 위해서는 MS 컴파일러 대신 gcc 컴파일러를 사용해 64bit dll로 빌드하면 된다.


먼저 64bit dll을 빌드할 수 있는 gcc컴파일러가 필요하다. 나는 mingw-w64를 이용했다.


링크 : http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Automated%20Builds/mingw-w64-bin_i686-mingw_20111220.zip/download


그리고 c파일의 인라인 어셈블리 구문을 수정해주어야 한다. gcc컴파일러로 인라인 어셈블리를 할 때에는 intel


syntax가 아니라 AT&T syntax를 사용해야 하기 떄문이다.


#include<jni.h>

#include "jni_HelloWorld.h"

#include<stdio.h>

JNIEXPORT jint JNICALL Java_jni_HelloWorld_print(JNIEnv *env, jobject obj)

{

int a=10, b=20;

asm("movl %1, %%eax; movl %%eax, %0;" :"=r"(b) :"r"(a) :"%eax");

return b;

}


내 기억이 맞다면 위의 인라인 어셈블리 구문은 a의 값을 b로 mov하라는 구문이다.


이제 다음 두 명령을 통해 64bit dll 파일을 생성할 수 있다.


gcc -m64 -I C:\jdk1.7\include -I C:\jdk1.7\include\win32 -c HelloWorld.c


gcc -shared -o Native.dll HelloWorld.o


참고로 -m64는 64bit으로 dll을 빌드하라는 옵션이라고 한다.







Posted by huammmm1
,