Wpis z mikrobloga

chce zrobic w czystym C parser/interpreter pseudo asemblera, chce przetlumaczyc instrukcje typu

mov eax 5

na swoje numeryczne opcody, ale tutaj mam problem - wyifowac po prostu to, i zrobic np

if(!strcmp(op, "mov"))
...
else if(!strcmp(op,"xor"))

lub sa jakies inne bardziej przejrzyste metody na zrobienie czegos takiego?

#programowanie #jezykc
  • 7
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@encoreleet: a może tablica mieszająca? https://pl.wikipedia.org/wiki/Tablica_mieszaj%C4%85ca
tzn. w skrócie imo to coś takiego:
0. musisz znaleźć funkcję haszującą(bądź stworzyć samemu, ale warto być świadomym istnienia kolizji - trochę przypał, gdy znalezienie mov i cmp zwróci numer tej samej pozycji w tablicy)
1. na początku gdzieś tworzysz sobie swoją tablicę tab[i], gdzie i = hash(nazwa_opkodu), a tab[i] to numer opkodu
2. zamiast setki ifów sprawdzasz w tablicy w jednym kroku czy istnieje tab[i] dla
  • Odpowiedz
@encoreleet: jak chcesz coś banalnego w implementacji, jednocześnie czytelnego i szybkiego to:

//str to instrukcja, char*, od 1 do 4 znakow.
int command = __builtin_bswap32(*(int*)str)>>((4-strlen(str))*8);
switch(command) {
  • Odpowiedz
@megaloxantha: to wydaje sie ciekawe, zapisalem sobie ten wpis na przyszlosc, teraz zrobilem interpreter tlumaczacy slowa na prosty bytecode i ten bytecode interpretuje kiedy indziej, make it work, make it simple, make it fast ( ͡° ͜ʖ ͡°)
  • Odpowiedz