java - 如何在 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 中应该期待什么吗?非常感谢。
解决方案
感谢 Peter Cordes,他建议可能有一些隐藏的参数被传递并反汇编一些 C++ 代码以便确定。
我不需要走那么远。我已经查看了 C++ 代码,我注意到所有本机例程都将 JNIenv 和 jclass 作为前两个参数。
我改变了我的代码来阅读......
java_test PROC _JNIenv:QWORD,_jclass:QWORD,_iNumber:QWORD
并且确实给出了成功的123的值。
猜测前两个参数是 JNIenv 和调用类,但考虑到它是 C++ 函数的形成方式,我认为这是一个很好的猜测。
感谢您的帮助和支持。问候一分钱保重
推荐阅读
- javascript - CSS:在x方向隐藏子元素的溢出,但允许在y方向的孙子元素溢出?
- maven - 带有 Maven 的 IntelliJ IDEA 未突出显示 Kotlin 警告
- javascript - CRUD 使用 observables 而不刷新页面
- javascript - Laravel 项目调用了错误的路径
- java - 在 Android 中使用 Spannable 获取完整的 EditText
- python - 如何在 Python 中使用 Selenium 处理自动建议下拉菜单
- modx - 在 MODX 使用 modRestController 类发布
- python - 如何将另一个列表的当前状态而不是迭代后的最终状态附加到列表中?
- filter - 是否可以在 pandoc 过滤器上启用扩展?
- sql - 红移 Postgres 8