gpt4 book ai didi

java - java中的汇编代码内联以及java中如何区分32位和64位操作系统

转载 作者:行者123 更新时间:2023-12-01 18:22:26 24 4
gpt4 key购买 nike

我需要在 Java 代码中为我大学的任务编写一些程序集注入(inject)。我有一个具有 native 功能的类

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 编译了该类,并得到了 header 。

/* 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。我尝试阅读javadoc,但没有用。

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

如何做到这一点以及如何区分32位和64位系统版本并根据版本加载dll库?

最佳答案

根据代码中的“mydll.dll”判断,您使用的是 Windows。这意味着 Microsoft x64 calling convention适用:

The first four arguments are placed onto the registers. That means RCX, RDX, R8, R9 for integer, struct or pointer arguments (in that order), and XMM0, XMM1, XMM2, XMM3 for floating point arguments. Additional arguments are pushed onto the stack (right to left). Integer return values (similar to x86) are returned in RAX if 64 bits or less. Floating point return values are returned in XMM0. Parameters less than 64 bits long are not zero extended; the high bits are not zeroed.

因此,RCX 和 RDX 分别是 JNIEnv 指针和指向 jclass 的指针。

至于你的第二个问题:fld dword [r8] 会将 r8 的内容视为 float* 并取消引用以获得实际的浮点值。我认为如果你想直接从寄存器加载,你必须使用fild dword r8。

第三个问题是already answered here .

关于java - java中的汇编代码内联以及java中如何区分32位和64位操作系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60282004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com