Witam wszystkich!
Oto nadeszła pamiętna chwila! Lynx obudzony ze snu, po 8 godzinach pracy ożywa!
Czym był Lynx?
Lynx był kiedyś moim niespełnionym marzeniem. Od kiedy zacząłem "skrobać" swoje pierwsze programy, marzyłem o własnym języku. Dziś marzenia stają się rzeczywistością! Lynx był projektem rozwijanym zrywami, często zarzucanym, niszczonym(ostatnie kilka reinstali bez dostępu do środków zapisu...), no i ogólnie miał trudno. Niektórzy(zapewne większość nadal nie wie co to ten Lynx), a więc:
Czym jest Lynx?
Lynx to wirtualna maszyna oparta o 2 stosy: stos parametrów i stos powrotu. Tego drugiego na razie nie tykam :P. Dlaczego stos? Bo czemu nie ;) Stos to najprzyjemniejsza struktura danych jednocześnie najbliższa człowiekowi ;) Językiem pośrednim, a jednocześnie wysoko poziomowym jest Forth. Wybrałem go ze względu na łatwą implementację i stosunkową bliskość z maszyną. Forth jest zaimplementowany jakoś w 50-60% : brakuje jedynie implementacji flow-control i słów(takie jakby funkcje\podprogramy w Forth'cie). Co mi pozostało do roboty po za maszyną? Cóż, nie wiele ;) Nie potrzebny mi chyba będzie dekompilator, choć pewnie go napiszę. Przyda się za to kompilator. Próbowałem z ANTLR3, ale chyba coś poknociłem więc odstawiam to na dłuższy termin i wzamian używam nasm'owych makr(dzięki Gyn za ten trik!).
Czym będzie Lynx?
Środowiskiem uruchomieniowym z lekka podobnym do NekoVM, jednak stworzonym przez człowieka(może ludzi? ;)) dla ludzi(wystarczy porównać source mojej maszyny z Neko...). Po za domyślnym Forth'em planuję jeszcze szereg innych języków. Po jakimś tam wstępie myśle nad JIT'em i bajerami.
Source można pobrać z mojego Dropboxa.
(Polecam obejrzeć przykładowy plik z makrami).
@EDIT: Stwierdziłem, że Lynx'a na ten czas zawieszę i do życia powołam SimpleVM - prostą VMkę, którą będe opisywał krok po kroku we wpisach na blogu, yo!
Pokazywanie postów oznaczonych etykietą asembler. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą asembler. Pokaż wszystkie posty
sobota, 3 marca 2012
sobota, 20 sierpnia 2011
Konwencje wywołań
Witam!
Chyba każdy programista spotkał się z funkcjami. Mają one nazwę, argumenty, ramkę stosu etc. W ich skład wchodzą również tajemnicze konwencje wywołań. Jest ich 4 z czego tylko 3 są wykorzystywane. Ich działanie omówię poniżej:
cdecl
Dosyć enigmatyczna nazwa ;) Oznacza ona C (style) Declare(Function).
Aby wywołać taką funkcję w asemblerze caller(wywołujący funkcje) musi umieścić argumenty na stosie, wywołać funkcje a potem obliczyć wielkość argumentów i zdjąć je ze stosu. Wszystkie funkcje ze standardowej biblioteki C są właśnie wywoływane w tej konwencji. Warto nadmienić, że argumenty wrzucamy na stos od tyłu. Wynika to z budowy stosu.
Przykład:
push arg2 push arg1 call [Foo] sub esp,2*4Jak widać wrzucamy argumenty "od tyłu". Następnie wywołujemy funkcje, po czym czyścimy stos(każdy argument na stosie ma 4 bajty dlatego 2*4). W kompilatorach C możemy narzucić tą konwencję na naszą funkcję pisząc _cdecl(lub __cdecl w bcc32 i kompilatorze M$)
Pascal
To bardzo stara konwencja używana w bardzo starych kompilatorach języka Pascal. Cechą szczególną jest wrzucanie argumentów na stos od przodu(!). Uniemożliwia to znaną z cdecl zmienną liczbę argumentów. Był to główny powód zaprzestania implementacji tej konwencji.
#edit Konwencji tej używały: QuickBasic i Windows 3.1 API. Jest możliwość wymuszenia jej w niektórych kompilatorach(np. we FreeBasic'u).
#edit Konwencji tej używały: QuickBasic i Windows 3.1 API. Jest możliwość wymuszenia jej w niektórych kompilatorach(np. we FreeBasic'u).
stdcall
To chyba najwygodniejsza z konwencji wywołań. Argumenty podajemy od tyłu na stos i wywołujemy funkcję. Nie martwimy się czyszczeniem stosu ponieważ zajmuję się tym calle. Również uniemożliwia podawanie zmiennej ilości argumentów(tzn. umożliwia jednak jest to dosyć problematyczne). Przykład:
push arg2 push arg1 call [StdBoo]
Fastcall
Najbardziej zależna od kompilatora konwencja wywołań. Argumenty umieszczamy w rejestrach. To w jakich rejestrach oraz w jakiej kolejności zależy od używanego kompilatora.
Istnieje jeszcze kilka pomniejszych konwencji wywołań które są raczej mniej popularne jak np. safecall czy thiscall
Więcej info na:
http://en.wikipedia.org/wiki/X86_calling_conventions
Istnieje jeszcze kilka pomniejszych konwencji wywołań które są raczej mniej popularne jak np. safecall czy thiscall
Więcej info na:
http://en.wikipedia.org/wiki/X86_calling_conventions
piątek, 19 sierpnia 2011
Lynx32
Witam!
Tytuł dzisiejszego wpisu to jednocześnie nazwa mojego największego do tej pory projektu.
O projekcie
Lynx32 to maszyna wirtualna oraz asembler do jej obsługi ;)
Maszyna posiada 4 rejestry:
Trochę problematycznie rozwiązałem operowanie na maszynie z poziomu asemblera-skonstruowałem coś na wzór przerwań:
LDA #'Hello World' !Assign value to A register
LCALL #1 !Lynx Call
Powyższy kod na(jeszcze nie dokończonej ;P)maszynie powinien wyświetlić zawartość rejestru A.
Ogólnie pisanie(a raczej uzupełnianie przepisywanej przeze mnie maszyny z C# na C++ :P)sprawia mi niebywałą przyjemność :).
TODO:
Do napisania została mi jeszcze spora porcja kodu,
Muszę napisać kompilator języka wysokiego poziomu(btw. ma ktoś pomysł na nazwę?),
Wypadałoby przepisać na nowo asembler, tym razem do C\C++\D whatever :P(wypadało by zrobić również implementację pod Java i .NET)
Tytuł dzisiejszego wpisu to jednocześnie nazwa mojego największego do tej pory projektu.
O projekcie
Lynx32 to maszyna wirtualna oraz asembler do jej obsługi ;)
Maszyna posiada 4 rejestry:
Trochę problematycznie rozwiązałem operowanie na maszynie z poziomu asemblera-skonstruowałem coś na wzór przerwań:
LDA #'Hello World' !Assign value to A register
LCALL #1 !Lynx Call
Powyższy kod na(jeszcze nie dokończonej ;P)maszynie powinien wyświetlić zawartość rejestru A.
Ogólnie pisanie(a raczej uzupełnianie przepisywanej przeze mnie maszyny z C# na C++ :P)sprawia mi niebywałą przyjemność :).
TODO:
Do napisania została mi jeszcze spora porcja kodu,
Muszę napisać kompilator języka wysokiego poziomu(btw. ma ktoś pomysł na nazwę?),
Wypadałoby przepisać na nowo asembler, tym razem do C\C++\D whatever :P(wypadało by zrobić również implementację pod Java i .NET)
sobota, 6 sierpnia 2011
Jak dziala pop i push?
Jeżeli zawsze byłeś ciekawy jak działa pop i push oraz jak można je zastąpić, to zapraszam do czytania ;)
Jeżeli miałeś kiedykolwiek styczność z asm'em to wiesz czym są segmenty oraz stos. Myślę jednak że warto by choć trochę zainteresować. Czym jest stos można spokojnie poczytać na wikipedii. O segmentach nic chyba nie było. Powiem tyle że dla nas najważniejszy jest segment stosu(SS-Stack Segment). Wskazuje on na początek stosu. W naszym przypadku będzie to 100h.Przyjmijmy że każdy argument wrzucany na stos ma 2 bajty(wiem nie jest tak ale zbyt długo rysowałem schemat żeby tera zmieniać :P). Wszystko wrzucamy "od tyłu"(lub od góry, różnie można interpretować). Operowanie na stosie czyli push wrzucające coś na stos oraz pop ściągające z rejestru do stosu to po prostu odejmowanie i dodawanie adresów. Push można zamienić na:
;PUSH
sub esp, wielkosc
mov [ss:esp], co
Gdzie wielkość w naszym przypadku bedzie miała wartość 2. ss:esp to adres ostatniego elementu stosu.
Zobaczmy prosty przykład. Na stos wrzucamy zawartość AX i DX:
;push AX sub esp,2 mov [ss:esp],ax ;push DX sub esp,2 mov [ss:esp],dx
Uff...namęczyłem się trochę z tym rysunkiem ponieważ robiłem go w mtPaint :P
Dobrze. Jak widzimy adres maleje o wielkość(czyli 2)-0xFE(dec.254) do 0xFC(dec.252). Jako że wrzuciliśmy rejestry 16 bitowe wszystko powinno się zmieścić.
Jak działa pop?
Jak wiemy pop zdejmuje ze stosu ostatni element i wrzuca go do jakiegoś rejestru. Czyli działa odwrotnie do push. Dla przejrzystości pokażę przykład:
;POP mov gdzie, [ss:esp] add esp, 2
Subskrybuj:
Posty (Atom)
Popularne posty
-
Witam! Dziś i nie tylko dziś opowiemy sobie o kombinatoryce. Czym jest więc ta kombinatoryka? Kombinatoryka to teoria obliczania liczby...
-
Witam wszystkich! Oto nadeszła pamiętna chwila! Lynx obudzony ze snu, po 8 godzinach pracy ożywa! Czym był Lynx? Lynx był kiedyś moim nie...
-
Witam! Dostałem dzisiaj bardzo śmiesznego maila. Hmm...może zamiast opisywać co takiego w nim było wrzuce tutaj ocenzurowaną wersję ;) Pan...
-
W społeczności "hackerskiej" określenie script kidd oznacza osobę korzystającą z programów używanych do różnego rodzaju ataków nie...
-
Hai All! Otóż niedawno zainteresowałem się przepięknym językiem jakim jest Lisp :). Szukając implementacji odpowiedniej dla mojego systemu...
-
Witam! Jest to mój pierwszy post "polityczny". Możliwe że takowych pojawi się więcej :) DISCLAIMER: Ten post i każdy następny ...
-
Jeżeli zawsze byłeś ciekawy jak działa pop i push oraz jak można je zastąpić, to zapraszam do czytania ;) Jeżeli miałeś kiedykolwiek styc...
-
Hai all! Piszę sobie od niedawna w Javie, praktycznie całkowicie się na nią przerzucając. I muszę przyznać jestem zadowolony. Nawet bardzo...
-
Megatutorial by Aссаръеллюсс Witam w drugim moim wielkim tutorialu!Tym razem jednak nie o AutoIT ,ale o innym już dużo 'doroślejszym...
-
Witam! Rzadko się spotyka języki tak zaprojektowane, że implementują funkcyjność bez szkody dla obiektowości. Takim językiem na pewno nie j...