Assembler - jak zmienić na kod maszynowy ?

0

Chce zrobić program który ma assemblera i teraz chce go czymś przemienić na kod maszynowy taki żeby go od razu dać do pliku.
Ale jakiego kompilatora użyć żeby nie naruszać praw autorskich ? A może samemu mogę to zrobić ?

0

Uwielbiam jak ktoś w tytule zadaje inne pytanie niż w temacie ;]

  1. Zamiana na kod maszynowy wymaga kompilatora
  2. Twoje pytanie jak zwykle jest daleko poza twoimi możliwościami pojmowania... Teoretycznie mógłbyś skompilować sobie asemblera do kodu maszynowego a potem mógłbyś go na żywca wpakować do binarki, niemniej wymagałoby to dość dobrej znajomości struktury pliku który edytujesz i generalnej znajomości asemblera i kodu maszynowego. Dużo łatwiej użyć deasemblera na programie który chcesz "edytować" a potem go zwyczajnie ponownie skompilować w całości, z twoimi zmianami. Niemniej oczywiście jest to crackowanie programu i nie wolno ci tego robić.
0

Nie dokońca o to chodzi .
Mam program i on generuje mi assemblera. I tego assemblera chce zwyczajnie zmienić w exe. Ale jak sie zmienia assemblera w exe (no oczywiście kompilatorem tyle że jakim bo potem musze go dodać do mojego programu by mój program sam tworzył exe ) ? I jakie są zasady zamiany czegoś na kod maszynowy i na binarny ? W tym już zupełnie nie siedze.

0

Misiaczki, ja wiem że to Xix, niemniej tym razem zadał sensowne pytanie więc bez trollowania proszę.

@Xix to zależy jakiego asemblera generujesz. Różne asemblery mają różną składnię, musisz dobrać kompilator pod to co generujesz. Ja ci nie wywróżę czy to MASM, NASM, FASM czy jeszcze coś innego. Nie rozumiem pytania o "zasady".

1
Xix napisał(a):

Chce zrobić program który ma assemblera i teraz chce go czymś przemienić na kod maszynowy taki żeby go od razu dać do pliku.
Ale jakiego kompilatora użyć żeby nie naruszać praw autorskich ? A może samemu mogę to zrobić ?

Można samemu. Trochę to jak na rysunku: http://pu.i.wp.pl/k,NzI2OTA1ODYsNDgzMTMxMjc=,f,Robota_glupawa_ale_pewna.bmp
ale da sie.

Sposób a'la lata 80-te XX w.:

Bierzesz książkę kodów danego procesora i tłumaczysz po kolei każdy rozkaz.
Trochę zachodu może być przy przeliczaniu adresów bezwzględnych, dlatego lepiej tego unikać.

Po przetłumaczeniu programu musisz jeszcze go tylko zgrabnie opakować w EXE lub zapisać jako program do bootowania.

Najprościej takie ćwiczenie robi się na mikro-kontrolerach (np. PIC) gdzie masz po kilka rozkazów na krzyż.

Sposób a'la lata 90-te XX w.:
Piszesz program w C, kompilujesz do ASM i patrzysz co masz w ASM.
Piszesz swój, lepszy (!) odpowiednik w ASM i dołączasz do programu w C jako dodatkowy moduł.
Całość kompilujesz i linkujesz do EXE.

0

W assembler jestem początkujący więc nie wiem w którym robi się okienko :) No pewnie w każdym się da haha
Dajcie taki sposób by z mojega asemblera zrobić exe. Ale nie lubie takich rozwiązań że wpisuje do_exe(x) tylko chce wiedzieć chociaż jak to działa.Czyli każda komenda assemblera jest tułmaczona na jakiś napis a więc samemu na kod maszynowy nie przemienię. Ale jaki jest najprostszy sposób ?
Może jest lista komend a ja je wczytam i będzie się tułmaczyć automatycznie. No i co z kod maszynowy -> EXE ? Na kod binarny jest jakaś komenda czy jak (nigdy tego nie potrzebowałem ) ?

1

W assembler jestem początkujący więc nie wiem w którym robi się okienko No pewnie w każdym się da haha

Bez systemowego API to sie nie obejdzie bo inaczej to musiałbyś po prostu narysować sobie to okienko zapalając piksele na ekranie (poprzez wpisywanie odpowiednich danych do pamięci karty graficznej). A na to by ci życia nie starczyło... Zresztą wybór asemblera żeby robic okienka to dziwny pomysł.

Dajcie taki sposób by z mojega asemblera zrobić exe. Ale nie lubie takich rozwiązań że wpisuje do_exe(x) tylko chce wiedzieć chociaż jak to działa.

Ściągasz kompilator i kompilujesz. Jak to działa? Poza generacją pewnych stałych sekcji definiujących typ pliku (w tym przypadku wykonywalną binarkę) sama zamiana asemblera na kod maszynowy jest dość trywialna. Każda instrukcja asemblera ma swój numerek. Np. mov będzie miał 1, cmp 2 a push 3. Kompilacja zamienia więc te mnemoniki na numery rozkazów, analogicznie robi z rejestrami a etykietki w kodzie zamienia na wyliczone offsety adresów. W efekcie zostają ci w kodzie same liczby i te liczby zapisane w kodzie binarnym to jest kod maszynowy.

Tylko nie bardzo rozumiem po co ci to. Przecież nie powiesz mi że chcesz napisać kompilator asemblera...

0

Proszzz http://edu.i-lo.tarnow.pl/inf/prg/002_winasm/index.php
Skarbnica wiedzy z zakresu Windows ASM.

0

tak jak napisał Shalom, kompilator po prostu zamienia komendy asm na opcode i jest to po prostu przemapowanie tekstu na opcode, tutaj masz opis jak tłumaczyć poszczególne kody http://ref.x86asm.net/coder32.html
Problem stanowi tylko odpowiednie przeliczanie referencji, oraz fakt że opcodów jest naprawdę sporo i pisanie własnego kompilatora ASM jest raczej bez sensu.
Kompilowany kod umieszcza sie w odpowiednich strukturach, może to być ELF, EXE, COM itp.
EXE : https://msdn.microsoft.com/en-us/library/ms809762.aspx
ELF : https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
COM: To po prostu kod binarny bez struktury, offset kodu musi zaczynać się od 0x100h

Można jeszcze uruchomić kod bezpośrednio w programie(tak działają exploity)
http://stackoverflow.com/questions/9960721/how-to-get-c-code-to-execute-hex-bytecode
Z tym że obecnie wiele komputerów ma ochronę pamięciową i rozróżnia kod danych, od kodu programu i tym samym nie pozwoli wykonać danych jako program.
Akurat kod z przykładu przemapowuje kod danych na kod executable wiec na linuxie powinno zadziałać.

1

Może jest lista komend a ja je wczytam i będzie się tułmaczyć automatycznie. No i co z kod maszynowy -> EXE ? Na kod binarny jest jakaś komenda czy jak (nigdy tego nie potrzebowałem ) ?

Może popróbuj najpierw napisać cokolwiek w asemblerze (w sensie: cały exe w asm).
Dowiesz się że jest coś takiego jak plik obiektowy (o rozszerzeniu .obj albo .o) i linker, który z .obj (jednego lub wielu) generuje .exe.

Na przykład, tak wygląda kompilacja małego programu "Hello world" w asemblerze NASM i z użyciem linkera WLINK:

C:\myprogs\asm\wat>nasm hw.asm -fobj

-- w tym miejscu z pliku hw.asm powstał hw.obj z kodem maszynowym, ale to jeszcze nie jest gotowy exek

C:\myprogs\asm\wat>wlink file hw.obj system causeway
Open Watcom Linker Version 2.0 beta Apr  2 2015 10:31:55 (32-bit)
Copyright (c) 2002-2015 The Open Watcom Contributors. All Rights Reserved.
Portions Copyright (c) 1985-2002 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.
See http://www.openwatcom.org/ for details.
loading object files
creating a CauseWay executable

-- tutaj z pliku .obj powstaje hw.exe, gotowy do uruchomienia.

jako target podałem akurat CauseWay, ale to nie istotne: idea jest ta sama pod Linuxem, pod Windowsem... tylko narzędzia mogą być inne (niekoniecznie NASM i niekoniecznie WLINK)

C:\myprogs\asm\wat>hw
Hello, world!

Linker łączy (linkuje, konsoliduje) pliki binarne .obj (wygenerowane przez asembler, albo kompilator C, C++, ...) w jeden .exe, uzupełniając wzajemne odwołania (kiedy w jednym obj wywoływana jest funkcja z innego)

0

Zastanawiałem się nad kompilatorem assemblera ale jeśli mi powiecie że jest prostszy sposób a rozumiem że jest to go nie zrobie :)
Mi chdzi o to by np. mój program z tekstu zapisanego w notatniku stworzył exe wyświetlający ten tekst w konsoli (tyle że ja nawet nie wiem jak w assemlbleże robi się konsole :) )

0

@Xix napisz działającego quicksort'a w asemblerze, jak ci się to uda to pochwal się kodem na forum.

1

Właśnie @shadooow.

@Xix teraz pytam tak całkowicie poważnie (bez śmiechu etc.) i pewnie dużo osób tutaj też się nad tym zastanawia. Pokaż cokolwiek co napisałeś samodzielnie. W czymkolwiek w ogóle, bo tak mówiąc szczerze wszyscy myślimy, że porywasz się z motyką na słońce.

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