我是一个狂热的 ASM 作家。我正在尝试用 asm 编写 native 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 中应该期待什么吗? 非常非常感谢。
最佳答案
感谢 Peter Cordes,他建议可能传递了一些隐藏的参数,并反汇编了一些 C++ 代码以确保找出答案。
我不需要走那么远。我已经查看了 C++ 代码,我注意到所有 native 例程都将 JNIenv 和 jclass 作为前两个参数。
我修改了我的代码以阅读...
java_test PROC _JNIenv:QWORD,_jclass:QWORD,_iNumber:QWORD
123的值确实给定成功了。
我猜测前两个参数是 JNIenv 和调用类,但考虑到 C++ 函数是如何形成的,我认为这是一个很好的猜测。
感谢您的帮助和支持。 问候 一分钱 保重
关于java - 如何在 ASM 中编写 native 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50086223/