Я заядлый писатель ASM. Я пытаюсь написать нативный код Java в asm.
Проблема, с которой я сталкиваюсь, заключается в том, что параметры, передаваемые из Java, не воспринимаются ассемблерным кодом. Код C ++, по-видимому, получает параметры с использованием 64-битного соглашения о вызовах Windows, то есть rcx, rdx, r8, r9, stack, и первоначально я предполагал, что это будет то же самое для asm, но это не так. Я потратил довольно много времени на поиск возможных объяснений и примеров, но пока не нашел ни одного, поэтому я подумал, что спросить. Я очень ценю некоторую помощь в определении того, где я иду не так. Большое спасибо. Ниже приведены фрагменты кода, объясняющие, что я разработал до сих пор ...
В NativeInterface.java
public native static String test(int _number);
In 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.
Кажется, я могу успешно передать параметры в java из asm.
На данный момент я не могу передать параметры в asm из Java.
Я надеялся, что будет использовано стандартное соглашение о вызовах в 64-битной среде Windows, но это не так. Я не могу найти документацию нигде. Может кто-нибудь, пожалуйста, объясните, что я должен ожидать в ASM.
Большое, большое спасибо.