Przekazywanie argumentów wstawce assemblerowej

0

Cześć wszystkim
Mam dosyć ciekawy problem stworzyłem program w javie z wstawką assemblerowską i teraz chciałbym przekazać zmienne (konkretnie 3 inty) jako parametry funkcji assemblerowkie. Chce wykonać na nich operajcę dodawanie mój kod w javie wygląda tak

public class Dodaj {

    static int a = 5;
    static int b = 4;

    static int c = 0;

    

    public static void main(String[] args) {

        System.loadLibrary("native");
        (new Dodaj()).nativeCode(a, b, c);

    }

    public native void nativeCode(int a, int b, int c);
}
 

i teraz nie mam zielonego pojęcia jak użyć zmiennych a,b,c w funkcji assemblerowskiej.

0

Pewnie będą na stosie.

0

chodzi ci o coś takiego [EBP +4]? jeśli tak to nie działa. Jak do nich uzyskać dostęp? sorki jeśli to głupie pytania ale jestem zielony w asm

0

Mogą być albo w rejestrach jeśli to fastcall albo na stosie. Innej opcji nie ma. Napisz co rozumiesz przez "nie działa" ;]

0

zrobiłem to po przez rejestry czyli napisałem kod

 global _Java_Dodaj_nativeCode
    section .text
_Java_Dodaj_nativeCode:
mov eax, [ESP+4]
mov ebx, [ESP+8]
add eax,ebx 
mov [ESP+12],eax 

I dostaje w javie error Ivalid acess to memory

0

To nie jest taka prosta sprawa. To jest x86 czy x64? Bo to spora różnica bo w x64 masz np. rsp a nie esp. Poza tym tak jak mówiłem, argumenty mogły od razu polecieć do rejestrów rcx, rdx, r8, r9

0

piszę w assemblerze pod x86 (maszyna wirtualna z win 7 32 bity i 32 bitowa java na tej maszynie nie wiem czy to odgrywa jakąś rolę).
EDIT próbowałem metodą prób i błędów przenosić wartość z podanych przez Ciebie rejestrów do EAX i EBX jednak dostałem błędy przy assemblacji w Nasmie "invalid combination of opcode and operands"

0

No taki błąd to akurat oznacza że nie umiesz napisać poprawnego kodu asemblera...

0

czyli przykładowo takie operacji nie mogę wykonaćmov eax,rcx ? sorki jak mówiłem to moje początki z asm

0

Nie możesz bo eax ma 32 bity a rcx ma 64 bity. 64 bitowy akumulator to rax. Jeśli to są twoje początki z asm to sobie wybrałeś bardzo dziwny sposób na jego naukę ;]

0

nurtuje mnie po prostu ta kwestia potrafię prosty program z wstawką assemblerową zrobić,ale nurtuje mnie kwestia przekazywania parametrów w C++ wygląda to sporo prościej

0

A napisałeś kiedyś program z JNI ale w C a nie asmie?

0

niestety. nie

0

:D No to ja proponuje od tego zacząć ;]

0

zależy mi,żeby to skończyć gdyż "mieszanie" języków programowania to moja praca na zaliczenie i w sumie brakuje mi tylko czegoś z assemblera

0

No ale tak sie nie da. Jakbyś przeczytał dowolny kurs JNI to wiedziałbyś np. że metoda natywna ma zarezerwowane pierwsze dwa parametry więc twoje dane polecą na stos dalej a nie będą na jego wierzchołku i jesli już to musiałbyś je przeskoczyć.

0

No wielkie dzięki za odpowiedź czyli niemożliwe jest pobranie zmiennych z javy i dodanie ich w ASM? Dzięki za odpowiedź i wyjaśnienia wiele rzeczy mi rozjaśniłeś :)

0

Oczywiście że jest mozliwe, ale nie jest możliwe metodą prób i błędów. Najpierw musisz rozumieć co i jak sie tam dzieje.

0

Czyli nie da się tego zrealizować w prosty i jasny sposób?

0

Zacznij od napisania metody w C którą wywołasz w Javie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1