JNI 64 бит x64 на FASM или ASM

244
20 февраля 2019, 21:50

Хочу написать взаимодействие jni и fasm на x64 битной архитектуре и возникла небольшая проблема.

JNIEXPORT jint JNICALL Java_t_TeastJNI_sum
    (JNIEnv *, jclass, jint, jint);

Попытался решить проблему в лоб, возвращал параметры через eax или через rax, но dll возвращал только какое-то рандомное число:

Java_t_TestJNI_sum:
    mov rax, [rsp+24] ; пропускаем 2 параметра
    add rax, [rsp+32]
    ret 32

Может я неправильно понял параметры stdcall?

Можно реализацию не только на FASM, на любом ASM x86-64.

UPD0

Полностью dll выглядит так:

format PE64 condole dll
include '%fasminc%\win64a.inc'
entry DllStart
section '.text' code readable executable
proc DllStart hinstDll,fdwReason,lpvReserved
    mov eax,TRUE
    ret
endp
Java_t_TestJNI_sum:
    mov rax,[R8]
    add rax,[R9]
    ret
section '.edata' expirt data readable
export 'mydll.dlll',\
    Java_t_TestJNI_sum,'Java_t_TestJNI_sum'

Метод java всё тот же, но возникла ошибка:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=******* и т.д.
Problematic frame:
C [mydll.dll+0x1000]

UPD1 Исправил как еаписали здесь, но: format PE64 console dll

include '%fasminc%\WIN64A.INC'
section '.text' code readable executable
  proc Java_t_TestJNI_sum
    mov rax, r8
    add rax, r9
    ret
  endp

section '.edata' export data readable
  export 'mydll.dll',\
    Java_t_TestJNI_sum, 'Java_t_TestJNI_sum'

section '.reloc' fixups data discardable
  if $=$$
    dd 0,8 
  end if

Ошибка UnsatisfiedLinkError: Попытка обращения к неверному адресу

Ошибка возникает всегда, но при удалении секции .reloc ошибка возникает рандомно, а иногда всё хорошо. Если в секции .reloc сделать так:

dd 0,64

Что выделяет больше места для секции, насколько я понимаю, то ошибка исчезает полностью.

Куда пропала ошибка, и не прячется ли она, чтобы снова рандомно вылезти когда не нужно? Не зависит ли теперь код от "фазы луны"? (Чего-то непонятного в x86-64, исключая: ошибки в самих процессорах этого семейства, баги windows, запуска кода в неподдерживающих код средах).

UPD2 вопрос закрыт, можно ещё просто в конце edata написать вместо reloc:

data fixups
end data
Answer 1

В вашем коде множество опечаток и бездумного копирования из разных источников.

format PE64 console dll
include '%fasminc%\WIN64A.INC'
section '.text' code readable executable
  proc Java_t_TestJNI_sum
    mov rax, r8
    add rax, r9
    ret
  endp

section '.edata' export data readable
  export 'mydll.dll',\
    Java_t_TestJNI_sum, 'Java_t_TestJNI_sum'

section '.reloc' fixups data discardable
  if $=$$
    dd 0, 64  ; if there are no fixups, generate dummy entry
  end if
READ ALSO
Подмена цвета PNG при наведении мыши

Подмена цвета PNG при наведении мыши

Подскажите, как с помощью CSS, при наведении курсора, заменить цвет PNG-иконки (например, такой: ) с серого на красный

257
Выравнивание объектов от края страницы

Выравнивание объектов от края страницы

Вывожу на страницу элементы списка под соответствующими заголовками, но столкнулся с тем, что при команде margin отступ идет не от края страницы...

233
Вложенность subscribe Angular6

Вложенность subscribe Angular6

Всем привет подскажите как правильно избавится от вложенности subscribe в angular 6

189
Использование Remote Object Yandex API

Использование Remote Object Yandex API

Возникла проблема в отображении объектов на картеЕсть города, в городах филиалы, филиалы разбиваются на объекты, а объекты на авто

158