Přepis Java kodu do assembleru – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Přepis Java kodu do assembleru – Assembler – Fórum – Programujte.comPřepis Java kodu do assembleru – Assembler – Fórum – Programujte.com

 

Vlákno bylo úspěšně vloženo.
Pokud sám přijdeš na řešení, nezapomeň ho sem přidat!
Petr35
~ Anonymní uživatel
3 příspěvky
8. 5. 2020   #1
-
0
-

Zdravím, potřeboval bych pomoct s přepsáním Java kódu do assembleru x86_64. Budu rád za každou radu.

long[] va = new long[] {1, 0, 0, 1, 0};
long[] vb = new long[] {1, 1, 0, 1, 1};
long hamming(long[] va, long[] vb, long length) {
 long hd = 0;
 int i;
 for (i = 0; i < length; i++) {
 if (va[i] != vb[i]) {
 hd++;
 }
 }
 return hd;
}
Nahlásit jako SPAM
IP: 90.181.14.–
Jerry
~ Anonymní uživatel
504 příspěvků
8. 5. 2020   #2
-
0
-

#1 Petr35
assembler pro jakej procesor ???  a jaká verze x86 ? x64 ? a makro-assembler nebo turbo-assembler ? nebo obyčejnej assembler ???

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:18e8:474b:e4e5:de88...–
Jerry
~ Anonymní uživatel
504 příspěvků
8. 5. 2020   #3
-
0
-

#2 Jerry
aha už sem si to přečet x86_64 :)))

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:18e8:474b:e4e5:de88...–
Jerry
~ Anonymní uživatel
504 příspěvků
8. 5. 2020   #4
-
0
-

tak tady to máš ...

https://www.beyondjava.net/java-programmers-guide-assembler-language

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:18e8:474b:e4e5:de88...–
Jerry
~ Anonymní uživatel
504 příspěvků
8. 5. 2020   #5
-
0
-

#4 Jerry
takovejhle dotaz se tu už jednou řešil

http://programujte.com/forum/vlakno/32189-prepis-kratkeho-kodu-v-jave-do-assembleru-x86/

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:18e8:474b:e4e5:de88...–
Jerry
~ Anonymní uživatel
504 příspěvků
8. 5. 2020   #6
-
0
-

#5 Jerry
a tady to máš na videu

https://www.youtube.com/watch?v=7p1_S-6bWhk

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:18e8:474b:e4e5:de88...–
Jerry
~ Anonymní uživatel
504 příspěvků
8. 5. 2020   #7
-
0
-

#6 Jerry
a taky tady:

https://www.ashishpaliwal.com/blog/2013/05/jvm-how-to-see-assembly-code-for-your-java-program/

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:18e8:474b:e4e5:de88...–
Kit+15
Guru
8. 5. 2020   #8
-
0
-

#1 Petr35
Proč do Assembleru? Bude to zbytečně pomalé.

Nahlásit jako SPAM
IP: 46.135.65.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
8. 5. 2020   #9
-
0
-

#8 Kit
jestli tim pomale myslis dobu, za jakou to prepise do assembleru, tak s tim se da i souhlasit.

Pokud to bude tezky javista, tak to mozna zvladne naprogramovat i pomale.

Ale na takhle jednoduchem kodu je to tezke napsat nejak spatne. Urcite preblafne jen spousteni Java machinerie nejmin milionkrat...

Jinak se to da proste napsat v C/C++ a zkompilovat do asm. Bylo by to bezbolestne

Nahlásit jako SPAM
IP: 78.80.31.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Petr35
~ Anonymní uživatel
3 příspěvky
10. 5. 2020   #10
-
0
-

#8 Kit
Je to úkol do školy.. v assembleru jsem v životě nic nedělal, takže je to pro mě celkem oříšek..

Nahlásit jako SPAM
IP: 90.181.14.–
Jerry
~ Anonymní uživatel
504 příspěvků
10. 5. 2020   #11
-
0
-

#10 Petr35
ty to asi uplně nechápeš .. assembler pro x86 z 80. a 90. let to je něco uplně jiného než assembler, do kterého se kompiluje Java, navíc Java je interpret i když kompilátor do exe existuje

https://stackoverflow.com/questions/2011664/compiling-a-java-program-into-an-executable

jde o to, že Java běží na Java Virtual Machine a všechno je závislé na knihovnách JVM dokonce i příkaz NEW. Kod z assembleru x86 nebo x64 jako native assembler NENI !!! to samé jako assembler do kterého kompiluje Java.... takhle se to prostě blbě vysvětluje....jde o to že Java je přenosná a assembler vypadá pokaždé jinak, na každém zařízení se to mění... proto uvažovat o assmbleru ve spojení s Javou je nesmysl ...

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:48d8:d3c5:3363:2392...–
Jerry
~ Anonymní uživatel
504 příspěvků
10. 5. 2020   #12
-
0
-

#10 Petr35
tohle by vám měl pan učitel vysvětlit .... a nenechat vás v tom plácat ...

Java je multiplatformní ale assembler běží JEN na určité platformě a jinde ne ..

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:48d8:d3c5:3363:2392...–
KIIV
~ Moderátor
+43
God of flame
10. 5. 2020   #13
-
+1
-
Zajímavé
Kit +

#12 Jerry
Mozna to jen beres moc doslovne, mohl java kod pouzit jako formu pseudokodu (funkcni). Pochybuju ze by nekdo pri smyslech chtel rucni preklad do java byte kodu :)

No kazdopadne nejrychlejsi je to proste prelozit z C do asm

#include <stdint.h>
#include <stdio.h>

long hamming(long va[], long vb[], size_t length) {
  long hd = 0;
  for (size_t i = 0; i < length; i++) {
    if (va[i] != vb[i]) {
      hd++;
    }
  }
  return hd;
}

int main() {
  long a[] = {1, 0, 0, 1, 0};
  long b[] = {1, 1, 0, 1, 1};

  long out = hamming(a, b, sizeof(a)/sizeof(*a));

  printf("%li", out);
}

Coz  se prelozi na (je tam trochu vic veci nez je skutecne potreba):

    .text
    .globl    hamming
    .type    hamming, @function
hamming:
.LFB0:
    .cfi_startproc
    push    rbp    #
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov    rbp, rsp    #,
    .cfi_def_cfa_register 6
    mov    QWORD PTR [rbp-24], rdi    # va, va
    mov    QWORD PTR [rbp-32], rsi    # vb, vb
    mov    QWORD PTR [rbp-40], rdx    # length, length
    mov    QWORD PTR [rbp-16], 0    # hd,
    mov    QWORD PTR [rbp-8], 0    # i,
    jmp    .L2    #
.L4:
    mov    rax, QWORD PTR [rbp-8]    # tmp95, i
    lea    rdx, [0+rax*8]    # D.2341,
    mov    rax, QWORD PTR [rbp-24]    # tmp96, va
    add    rax, rdx    # D.2342, D.2341
    mov    rdx, QWORD PTR [rax]    # D.2343, *_9
    mov    rax, QWORD PTR [rbp-8]    # tmp97, i
    lea    rcx, [0+rax*8]    # D.2341,
    mov    rax, QWORD PTR [rbp-32]    # tmp98, vb
    add    rax, rcx    # D.2342, D.2341
    mov    rax, QWORD PTR [rax]    # D.2343, *_14
    cmp    rdx, rax    # D.2343, D.2343
    je    .L3    #,
    add    QWORD PTR [rbp-16], 1    # hd,
.L3:
    add    QWORD PTR [rbp-8], 1    # i,
.L2:
    mov    rax, QWORD PTR [rbp-8]    # tmp99, i
    cmp    rax, QWORD PTR [rbp-40]    # tmp99, length
    jb    .L4    #,
    mov    rax, QWORD PTR [rbp-16]    # D.2343, hd
    pop    rbp    #
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size    hamming, .-hamming
    .section    .rodata
.LC0:
    .string    "%li"
    .text
    .globl    main
    .type    main, @function
main:
.LFB1:
    .cfi_startproc
    push    rbp    #
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov    rbp, rsp    #,
    .cfi_def_cfa_register 6
    sub    rsp, 112    #,
    mov    QWORD PTR [rbp-96], 1    # a,
    mov    QWORD PTR [rbp-88], 0    # a,
    mov    QWORD PTR [rbp-80], 0    # a,
    mov    QWORD PTR [rbp-72], 1    # a,
    mov    QWORD PTR [rbp-64], 0    # a,
    mov    QWORD PTR [rbp-48], 1    # b,
    mov    QWORD PTR [rbp-40], 1    # b,
    mov    QWORD PTR [rbp-32], 0    # b,
    mov    QWORD PTR [rbp-24], 1    # b,
    mov    QWORD PTR [rbp-16], 1    # b,
    lea    rcx, [rbp-48]    # tmp89,
    lea    rax, [rbp-96]    # tmp90,
    mov    edx, 5    #,
    mov    rsi, rcx    #, tmp89
    mov    rdi, rax    #, tmp90
    call    hamming    #
    mov    QWORD PTR [rbp-104], rax    # out, tmp91
    mov    rax, QWORD PTR [rbp-104]    # tmp92, out
    mov    rsi, rax    #, tmp92
    mov    edi, OFFSET FLAT:.LC0    #,
    mov    eax, 0    #,
    call    printf    #
    mov    eax, 0    # D.2344,
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1:
    .size    main, .-main
    .ident    "GCC: (Ubuntu 5.5.0-12ubuntu1~14.04) 5.5.0 20171010"
    .section    .note.GNU-stack,"",@progbits

Takze se z toho da neco malo vykrast

Nahlásit jako SPAM
IP: 78.80.31.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Petr35
~ Anonymní uživatel
3 příspěvky
11. 5. 2020   #14
-
0
-

#13 KIIV
Díky moc, tohle mi pomohlo.

Nahlásit jako SPAM
IP: 90.181.14.–
Jerry
~ Anonymní uživatel
504 příspěvků
11. 5. 2020   #15
-
0
-

ještě taková drobnost ten přepis java->asm se řeší i tady

https://stackoverflow.com/questions/11632078/code-injecting-assembly-inlining-in-java

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:819d:1e41:cb6d:c51f...–
MilanL+1
Grafoman
12. 5. 2020   #16
-
+2
-
Zajímavé
Kit +

#1 Petr35
 měl jsem dnes chuť to zkusit vytvořit
použit online kompiler

https://www.tutorialspoint.com/compile_assembly_online.php

případné nastavení kompilace v Project-Compile options:

nasm -f elf64 *.asm; ld -m elf_x86_64 -s -o demo *.o

section	.text
	global _start       ;must be declared for using gcc
_start:                     ;tell linker entry point
    mov rdi, poleA      ;pointer poleA
    mov rsi, poleB      ;pointer poleB
    mov rcx, lenA       ;prvků v poli A
    
    call  _hamming      ;vrátí počet rozdílů v RAX

    mov rdi, msgK       ;adresa pro převod HEX na DEC od konce
    dec rdi             ;-1 znak odřádkování
    mov rcx, lenmsg     ;znaků pro číslo (aktuálně 32 lze zvýšit)
    
    call    _HEXtoDec      ;převod HEX na DEC, RAX číslo, RDI cíl, RCX max číslic
                        ;vrátí v RDI začátek čísla
                        
    mov rdx, msgK   ;vezme adresu konce
    sub rdx, rdi    ;odečte adresu začátku => RDX délka zprávy
    mov rcx, rdi    ;začátek zprávy 
    mov	rbx, 1	    ;file descriptor (stdout)    mov	rax, 4	    ;system call number (sys_write)
    int	0x80        ;call kernel	
    mov rbx, 0    mov	rax, 1	    ;system call number (sys_exit)    int	0x80        ;call kernel
	

    
_hamming:       ; vstup ESI a EDI pointery na pole, ECX velikost poleA
    xor rax,rax     ;počítadlo
hammL:
    mov rbx, qword [rdi]
    cmp rbx, qword [rsi]
    je  hammL2
    inc rax
hammL2:
    add edi, 8
    add esi, 8
    loop    hammL   ;opakuj pro prvky pole
    
    ret         ;RAX počet rozdílů

;převod čísla HEX na DEC-string

_HEXtoDec:             ;RAX = value, RDI = dest od konce, RCX = dest size    and rax, rax
    jz  tDend
    mov rdx, 0
    mov rbx, 10
    div rbx
    add rdx, 0x30
    mov [rdi], dl
    dec rdi
    loop    _toDec
tDend:
    ret         ; v RDI začátek    
    
section	.data

poleA   dq  1, 0, 0, 1, 0
lenA    equ ($ - poleA) / 8
poleB   dq  1, 1, 0, 1, 1
lenB    equ ($ - poleB) / 8

msgZ    times 32 db 0x20
msgK    db  0x0A
lenmsg  equ msgK - msgZ

mov

Nahlásit jako SPAM
IP: 91.139.9.–
KIIV
~ Moderátor
+43
God of flame
12. 5. 2020   #17
-
0
-

#16 MilanL
Nadhera, jak je vsechno jednodussi a prehlednejsi, kdyz se da vynechat volaci konvence funkci z C :)

Nahlásit jako SPAM
IP: 78.80.17.–
Program vždy dělá to co naprogramujete, ne to co chcete...
MilanL+1
Grafoman
12. 5. 2020   #18
-
0
-

#17 KIIV
kdyby jen konvence ale i způsob zacházení s daty

#1 Petr35

doplnění  #16   syscall volání pro výpis na obrazovku a exit je pro LINUX

a je to na předem definované pole, pokud by byl nějaký jiný vstup ze souboru nebo terminálu, bylo by potřeba, to upravit

celé mi to trvalo necelých 30 minut, algoritmus byl vymyšlený za chvilku, nejvíc času mi zabrala úprava syntaxe pro nasm a následně nastavení kompilace na x86-64, 

drobná oprava měnil jsem pojmenování rutiny pro ten převod čísla zapoměl jsem změnit u cyklu loop

   loop _toDec má být _HEXtoDec

tDend:

Nahlásit jako SPAM
IP: 91.139.9.–
Jerry
~ Anonymní uživatel
504 příspěvků
12. 5. 2020   #19
-
0
-

tak duležitý je že všichni chápou že tohle je přesně "TEN" assembler, kterej vytvoří Java :)))

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:f4a2:3554:6a36:3395...–
Kit+15
Guru
12. 5. 2020   #20
-
0
-

#19 Jerry
Omyl, Java neprodukuje assembler...

Nahlásit jako SPAM
IP: 46.135.25.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
13. 5. 2020   #21
-
0
-

#20 Kit
Kdybys nečetl jen poslední příspěvek, pochopil bys, že #19 je ironie.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:ed99:b0d5:b0f6:b091...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 36 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý