Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

TBIMPL - Mój język programowania.


Osama

Rekomendowane odpowiedzi

Opublikowano

Żeby poćwiczyć sobie programowanie napisałem własny język programowania w stylu asemblera pracujący na maszynie wirtualnej.

 

Jak na razie, po jednym dniu programowania zrobiłem cała maszynę i zaimplementowałem byte code, do zrobienia został asembler, dodanie kilku instrukcji i wbudowanych funkcji, naprawa bugów i język będzie gotowy.

 

Skrót TBIMPL oznaczna Tree Based Interpreted Mnemonic Programing Language czyli Oparty na drzewach interpretowany język mnemoników. Język oparty jest na drzewach ponieważ każda instrukcja tworzona jest przez rekurencyjny parser, który buduje z instrukcji drzewa.

Każda instrukcja pochodzi od abstrakcyjnej klasy Instruction i implementuje metodę wykonywującą, każda instrukcja ma własną klasę i własną wersję metody wykonywującej dzięki czemu korzystając z mechanizmu polimorfizmu parser może tworzyć drzewa oparte na klasie bazowej, którego liściami są obiekty klas pochodnych.

 

 

Możecie się pobawić, ale dopóki nie napisze asemblera to trzeba będzie pisać w byte code.

 

Lista instrukcji:

 

 

#define OP_ADD      0x01

#define OP_AND      0x02


#define OP_CMP      0x04

#define OP_JMP      0x05

#define OP_JE       0x06


#define OP_JZ       0x0A


#define OP_MOV      0x10

#define OP_MUL      0x11

#define OP_NEG      0x12

#define OP_NOP      0x13

#define OP_NOT      0x14

#define OP_OR       0x15

#define OP_POP      0x16

#define OP_PUSH     0x17


#define OP_SUB      0x19

#define OP_XCHG     0x1A

#define OP_XOR      0x1B

#define OP_DIV      0x1C



#define OP_PUTS     0x50

#define OP_PRINTF   0x51



#define R1          0

#define R2          1

#define R3          2

#define R4          3



#define CONST       70

#define ADDR        71

#define STRv        72

#define REGv        73



#define OP_INS_END  90

#define OP_CODE_END 91

 

 

 

schemat instrukcji:

kod instrukcji, selektor argumentu, wartość argumentu

 

Czyli instrukcja:

MOV R1, 10

 

Wyglądałaby

MOV R1 CONST 10

 

A w byte code

16 0 73 10 0 0 0

 

Po każdej instrukcji musi występować OP_INS_END, o wartości 90, na końcu programu musi znaleźć się OP_CODE_END o wartości 91.

 

W celu uproszczenia implementacji wszystkie liczby są 4 bajtowe, kolejność bajtów to little endian.

 

 

Co do wbudowanych funkcji to PUTS przyjmuje jeden argument string zakończony '\0'

 

OP_PUTS STRv 'a' 'b' 'c' '\0'

 

PRINTF przyjmuje dwa argumenty, pierwszy to format zakończony '\0' drugi to Rejestr/zmienna/adres pamięci pod którym znajduje się liczba do wypisania.

 

Przykładowe programy, wystarczy wkleić w okienko i wcisnąć enter.

 

Hello World:

80 72 87 105 116 97 106 32 115 119 105 101 99 105 101 13 10 0 90 91 -1

 

Pętla:

16 73 0 70 0 0 0 0 90 1 73 0 70 1 0 0 0 90 4 73 0 70 100 0 0 0 90 6 70 6 0 0 0 90 81 72 37 100 10 0 73 0 90 5 70 1 0 0 0 0 90 91 -1

 

Skan:

https://www.virustotal.com/pl/file/5a0563eca6afa13e36da7688ac122b6b47c1e203609b6d4c69484659b0eaf480/analysis/1458158894/

 

Pobieranie

http://www62.zippyshare.com/v/Jq9mar7P/file.html

 

 

Aktualizacja:

Zaimplementowana część asemblera:

wOZqoMH.png

RAsfepN.png
Opublikowano

Super projekt, tylko chyba wygodniejsze byłyby aplikacje, jeśli nie wpisywałoby się w oknie konsoli bajt'u, tylko pisało w oddzielnym pliku, ale i tak wielki szacun za projekt, zwłaszcza, że robiony w asemblerze.

jw19e8.png

Opublikowano

Nie robię tego w asemblerze tylko w c++ :D

Program będzie wczytywany z pliku, ale to dopiero jak skończe pisac asembler do tego języka. Inaczej ciężko byłoby ci chyba wpisać z klawiatury bajt o wartości 1 itp ;)

RAsfepN.png
Opublikowano

W C++ to piszę.

 

Zaimplementowałem już trochę asemblera, tutaj pokaz tłumaczenia na byte code.

wOZqoMH.png

RAsfepN.png
Opublikowano

20.03.2016

Dodano obsługę etykiet i ich prawidłowe parsowanie przez asemblera. Linia kodu nie musi być już zakończona słowem "END"

 

Kod programu

data
{
}
code
{

JMP INT32 @
PUTS STR "tego nie widac"

@
PUTS STR "koniec"

}
 

FkAHEsW.png

RAsfepN.png

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...