Мне нужно написать ассемблер в коде java для задач в моем университете. У меня есть класс с встроенной функцией
import java.io.File;
public class AsmOR {
static {
String path = System.getProperty("user.dir");
System.load(path+File.separator+"mydll.dll");
}
public static native int or(int num1, int num2);
}
Затем я скомпилировал класс с помощью команды javac -h AsmOR. java и получил заголовок.
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_user_AsmFun_AsmOR */
#ifndef _Included_org_user_AsmFun_AsmOR
#define _Included_org_user_AsmFun_AsmOR
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_user_AsmFun_AsmOR
* Method: or
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_org_user_AsmFun_AsmOR_or
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
Я использовал ассемблерный этот ассемблерный код, но я не понимаю, почему функции являются параметрами r8 и r9. Я пытался читать javado c, но это бесполезно.
global Java_org_user_AsmFun_AsmOR_or
Java_org_user_AsmFun_AsmOR_or:
mov rax,r8
or rax,r9
ret 32
end
Кроме того, я хотел использовать сопроцессор для двойной суммы, но он не работает.
fld dword [r8]
fld dword [r9]
fadd st0,st1
fistp dword [rax]
ret 32
Как это сделать и как отличить guish между 32-битной и 64-битной версиями систем и загрузить библиотеку dll в зависимости от версии?