Код ассемблера встраивается в java и как различать guish 32-битные и 64-битные ОС в java - PullRequest
0 голосов
/ 18 февраля 2020

Мне нужно написать ассемблер в коде 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 в зависимости от версии?

1 Ответ

0 голосов
/ 18 февраля 2020

Судя по "mydll.dll" в вашем коде, вы находитесь на Windows. Это означает, что применяется соглашение о вызовах Microsoft x64 :

Первые четыре аргумента помещаются в регистры. Это означает, что RCX, RDX, R8, R9 для аргументов целого числа, структуры или указателя (в указанном порядке) и XMM0, XMM1, XMM2, XMM3 для аргументов с плавающей запятой. Дополнительные аргументы помещаются в стек (справа налево). Целочисленные возвращаемые значения (аналогично x86) возвращаются в RAX, если 64 или менее бит. Возвращаемые значения с плавающей точкой возвращаются в XMM0. Параметры длиной менее 64 бит не расширены нулями; старшие биты не обнуляются.

Так что RCX и RDX - это указатель JNIEnv и указатель на ваш jclass соответственно.

Что касается вашего второго вопроса: fld dword [r8] будет обрабатывать содержимое r8 как float* и разыменовывать его, чтобы получить фактическое значение с плавающей запятой. Я думаю, что вы должны использовать fild dword r8, если вы хотите загрузить напрямую из регистра.

Третий вопрос уже здесь ответил .

...