首页 > 解决方案 > 如何在 ASM 中编写本机代码

问题描述

我是一个狂热的 ASM 作家。我正在尝试在 asm 中编写本机 java 代码。我遇到的问题是从 Java 传递的参数似乎没有被 asm 代码接收。C++ 代码似乎使用 windows 64 位调用约定来接收参数,即 rcx、rdx、r8、r9、stack,最初我认为它对于 asm 是相同的,但似乎并非如此。我花了很长时间寻找可能的解释和例子,但还没有找到,所以我想我会问。我会非常感谢一些帮助,以确定我哪里出错了。非常感谢。下面是解释我到目前为止开发的代码片段......

在 NativeInterface.java 中

public native static String test(int _number);

在 Calling.java 中

String s=NativeInterface.test(123);

在 NativeJava.asm 中

.data
dString     db  "This is my string",0
.code
java_test PROC _iNumber:QWORD
 invoke dialog_showMessageInteger,"ASM CODE","Number=",_iNumber
 mov rax,rv(java_createStringUTF8,JNIenv,ADDR dString)
 ret
java_test ENDP

asm中打开的对话框没有显示“123”而是显示“1918844240”以上代码成功将字符串传递给java。

看来我可以成功地将参数从 asm 传递给 java。此时我无法将参数从 java 传递给 asm。

我希望使用标准的 Windows 64 位调用约定,但似乎不是这样。我在任何地方都找不到任何文档。有人可以解释一下我在 asm 中应该期待什么吗?非常感谢。

标签: javajava-native-interfacejava-bytecode-asm

解决方案


感谢 Peter Cordes,他建议可能有一些隐藏的参数被传递并反汇编一些 C++ 代码以便确定。

我不需要走那么远。我已经查看了 C++ 代码,我注意到所有本机例程都将 JNIenv 和 jclass 作为前两个参数。

我改变了我的代码来阅读......

java_test PROC _JNIenv:QWORD,_jclass:QWORD,_iNumber:QWORD

并且确实给出了成功的123的值。

猜测前两个参数是 JNIenv 和调用类,但考虑到它是 C++ 函数的形成方式,我认为这是一个很好的猜测。

感谢您的帮助和支持。问候一分钱保重


推荐阅读