🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
7 messages
7 total messages Started by RobertGawron Wed, 27 Jan 2010 16:37
kompilacja, ELF, Linux, specyfikacja
#2093
Author: RobertGawron
Date: Wed, 27 Jan 2010 16:37
15 lines
1991 bytes
Witam,

swego czasu napisałem prościutki język programowania, który kompilował
się do kodu pośredniego, prostego asemblera, później wykonywanego
przez maszynę wirtualną. Teraz chciałbym ten kod pośredni kompilować
do pliku wykonywalnego, który mogę odpalić pod Linuksem, szukałem
trochę, wiem już mniej więcej jak działają pliki ELF ale utknąłem na
jednej sprawie. czy ma jakąś konkretną nazwę proces zamiany nazw
mnemoników na wartość hexową, która później jest zapisywana do pliku
ELF, w jakiejś tam sekcji? Jaki jest link do dokumentacji,
specyfikacji tego? Polecacie jakieś książki, linki, eboki
przybliżające ten temat?

pozdrawiam,
Robert Gawron
Re: kompilacja, ELF, Linux, specyfikacja
#2094
Author: Michoo
Date: Wed, 27 Jan 2010 23:35
22 lines
1810 bytes
RobertGawron pisze:
> Witam,
> 
> swego czasu napisałem prościutki język programowania, który kompilował
> się do kodu pośredniego, prostego asemblera, później wykonywanego
> przez maszynę wirtualną. Teraz chciałbym ten kod pośredni kompilować
> do pliku wykonywalnego, który mogę odpalić pod Linuksem, szukałem
> trochę, wiem już mniej więcej jak działają pliki ELF ale utknąłem na
> czy ma jakąś konkretną nazwę proces zamiany nazw
> mnemoników na wartość hexową, która później jest zapisywana do pliku
> ELF, w jakiejś tam sekcji?
Assemblacja? (Assembling) Chociaż przy dzisiejszych (makro) assemblerach 
można mówić chyba już o kompilacji.

Wydaje mi się, że chcesz wygenerować kod assemblerowy np. dla nasm'a 
albo masm'a. potem możesz skompilować to do .o i zlinkować z 
istniejącymi obiektami (np jakieś procedury startowe) albo bezpośrednio 
do elfa.

-- 
Pozdrawiam
Michoo
Re: kompilacja, ELF, Linux, specyfikacja
#2095
Author: RobertGawron
Date: Thu, 28 Jan 2010 18:58
53 lines
3466 bytes
Witam,
dzięki za odpowiedź.

Zamiast generować z pliku z kodem asemblera (o składni, jaką mam) plik
o składni NASM'a, czy innej i kompilowania go normalnie, wolałbym
napisać swój kompilator, który pobiera ten plik (z moją składnią)
asemblera i tworzy plik wykonywalny (albo pliki, które później się
linkuje, już normalnie).

Czytam teraz swój wcześniejszy post i widzę, że jest trochę
zagmatwany, więc napiszę raz jeszcze.


Przykładowy skompilowany kod:

rgawron@foo:/opt/asm/nasm$ objdump -d foo

foo:     file format elf32-i386

Disassembly of section .text:

08048060 <.text>:
 8048060:       31 c0                   xor    %eax,%eax
 8048062:       31 db                   xor    %ebx,%ebx
 8048064:       bb 37 00 00 00          mov    $0x37,%ebx
 8048069:       b8 05 00 00 00          mov    $0x5,%eax
 804806e:       01 d8                   add    %ebx,%eax
 8048070:       89 c3                   mov    %eax,%ebx
 8048072:       b8 01 00 00 00          mov    $0x1,%eax
 8048077:       cd 80                   int    $0x80

Chodziło mi o drugą i trzecią kolumnę (licząc od 1 ;-)), skąd ludzie,
którzy tworzą kompilatory wiedzą, że instrukcję int 0x80 trzeba
przetłumaczyć na 0xcd 0x80.

W międzyczasie znalazłem odpowiedź na to pytanie (aczkolwiek nie wiem,
czy pełną) - http://www.logix.cz/michal/doc/i386/chp17-03.htm

Asembler, który mam jest b. prosty, więc liczę, że pójdzie to w miarę
szybko, jakby ktoś chciał o nim poczytać, to tu jest link (
http://rgawron.megiteam.pl/2009/04/23/vm/ ) (mam nadzieję, że nie
będzie mi to poczytane za spam).

Trudno mi było znaleźć info w sieci, bo co bym nie wpisał w
wyszukiwarce to dostawałem linki do kursów uczących asemblera albo
opisujących jak skompilować program.

Dzięki za odpowiedź, jeśli będziecie mieli jakieś info, na co zwrócić
uwagę, czy linki do jakiś książek albo kodów źródłowych to też chętnie
przejże.

pozdrawiam
Robert Gawron
Re: kompilacja, ELF, Linux, specyfikacja
#2096
Author: Michoo
Date: Thu, 28 Jan 2010 22:14
68 lines
3725 bytes
RobertGawron pisze:
> Witam,
> dzięki za odpowiedź.
> 
> Zamiast generować z pliku z kodem asemblera (o składni, jaką mam) plik
> o składni NASM'a, czy innej i kompilowania go normalnie, wolałbym
> napisać swój kompilator, który pobiera ten plik (z moją składnią)
> asemblera i tworzy plik wykonywalny (albo pliki, które później się
> linkuje, już normalnie).
> 
> Czytam teraz swój wcześniejszy post i widzę, że jest trochę
> zagmatwany, więc napiszę raz jeszcze.
> 
> 
> Przykładowy skompilowany kod:
> 
> rgawron@foo:/opt/asm/nasm$ objdump -d foo
> 
> foo:     file format elf32-i386
> 
> Disassembly of section .text:
> 
> 08048060 <.text>:
>  8048060:       31 c0                   xor    %eax,%eax
>  8048062:       31 db                   xor    %ebx,%ebx
>  8048064:       bb 37 00 00 00          mov    $0x37,%ebx
>  8048069:       b8 05 00 00 00          mov    $0x5,%eax
>  804806e:       01 d8                   add    %ebx,%eax
>  8048070:       89 c3                   mov    %eax,%ebx
>  8048072:       b8 01 00 00 00          mov    $0x1,%eax
>  8048077:       cd 80                   int    $0x80
> 
> Chodziło mi o drugą i trzecią kolumnę (licząc od 1 ;-)), skąd ludzie,
> którzy tworzą kompilatory wiedzą, że instrukcję int 0x80 trzeba
> przetłumaczyć na 0xcd 0x80.
Nazywa się to "opcode" i jest w dokumentacji procesora.
Np. http://developer.intel.com/design/pentiumii/manuals/243191.htm

> 
> W międzyczasie znalazłem odpowiedź na to pytanie (aczkolwiek nie wiem,
> czy pełną) - http://www.logix.cz/michal/doc/i386/chp17-03.htm
To jest bardzo stary zestaw - szybko patrząc brakuje choćby cmpxchg, ale 
powinien do Twoich zastosowań starczyć.

> 
> Asembler, który mam jest b. prosty, więc liczę, że pójdzie to w miarę
> szybko, jakby ktoś chciał o nim poczytać, to tu jest link (
> http://rgawron.megiteam.pl/2009/04/23/vm/ ) (mam nadzieję, że nie
> będzie mi to poczytane za spam).
Na obrazku brakuje jeszcze bytecode->jit->"machine code" biorąc pod 
uwagę jak działa większość współczesnych środowisk.
> 
> Trudno mi było znaleźć info w sieci, bo co bym nie wpisał w
> wyszukiwarce to dostawałem linki do kursów uczących asemblera albo
> opisujących jak skompilować program.
> 
Imo pisanie kompilatora obsługującego pliki elf dla tak małego języka to 
lekki overkill (nawet g++ generuje kod assemblerowy, który potem jest 
kompilowany)

Ale jak chcesz się bawić to poszukaj info o budowie pliku elf - ona nie 
jest aż tak trudna. Wtedy twój assembler będzie generował plik *.o, 
który można będzie zlinkować za pomocą ldd z bibliotekami startowymi i 
dostać wykonywalnego elfa.

-- 
Pozdrawiam
Michoo
Re: kompilacja, ELF, Linux, specyfikacja
#2097
Author: RobertGawron
Date: Thu, 28 Jan 2010 22:30
14 lines
1923 bytes
Wielkie dzięki za wszystkie informacje i porady, przydadzą się.

> Na obrazku brakuje jeszcze bytecode->jit->"machine code" biorąc pod
> uwagę jak działa większość współczesnych środowisk.

Racja, poprawię obrazek albo dopiszę to pod spodem, thx.

> Imo pisanie kompilatora obsługującego pliki elf dla tak małego języka to
> lekki overkill

Chcę zobaczyć z bliska, jak to działa.

pozdrawiam
Robert Gawron
Re: kompilacja, ELF, Linux, specyfikacja
#2098
Author: Wiktor S.
Date: Sun, 31 Jan 2010 16:59
13 lines
1540 bytes
> Zamiast generować z pliku z kodem asemblera (o składni, jaką mam) plik
> o składni NASM'a, czy innej i kompilowania go normalnie, wolałbym
> napisać swój kompilator, który pobiera ten plik (z moją składnią)
> asemblera i tworzy plik wykonywalny (albo pliki, które później się
> linkuje, już normalnie).

Dużo roboty. Bardzo dużo roboty. Nie zdajesz sobie sprawy, ile.

Ale.. powodzenia ;-)


-- 
Azarien
Re: kompilacja, ELF, Linux, specyfikacja
#2099
Author: RobertGawron
Date: Tue, 09 Mar 2010 21:41
16 lines
2104 bytes
Cześć,

FYI drążąc dalej temat napisałem *prosty* kompilator:
* jego możliwości to obsługa operacji ALU, stosu, przerwań,
generowanie wewnętrznych procedur
* kompiluje kod dla Linuksa, dla 32bitowych, zgodnych z i386
* napisany w C, obiektowo
* adres projektu: http://github.com/RobertGawron/l33tlang
* HOWTO: http://rgawron.megiteam.pl/2010/03/06/simple-32bit-intel-linux-compiler/

pomyślałem, że może się to kiedyś komuś przydać, bo kod jest
siermiężnie prosty, a przy tym w miarę dobry i łatwo da się go
rozwijać o nowe funkcje. Jakbyście mieli uwagi, to chętnie wysłucham.

pozdrawiam serdecznie
Robert Gawron
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads