czwartek, kwietnia 18, 2013

DEC z INC odpowiedź i mała Maszyna Wirtualna ;-)

Wczoraj zastanawiałem się czy mój pomysł na implementację DEC przy pomocy INC opierający się na obróceniu licznika działa.
Stwierdziłem, że nic tak dobrze nie działa jak uruchomienie programu wynikowego i dlatego popełniłem małą Maszynę Wirtualną dla mojego własnego assemblera ;-)

Wygląda ona tak:


W polu Program mamy program ;-) w Stack mamy stos danych, obok jest krótki opis poszczególnych instrukcji.

Program kończy się wykonywać po 10 tysiącach kroków, albo gdy zrobimy RET który nie miał CALL.

By wykonać program klikamy Execute, na końcu w Stack jest ostateczny wygląd stosu (momentami nie działa tak jak powinien), w Accumulator jest stan akumulatora a w Memory stan pamięci (tylko labelki, które odpowiadają instrukcji DAT).

Warto zwrócić uwagę, że mój VM jest 4 bitowy ;-) tzn. pracuje na 4 bitowych INTach, przy większych DEC działał zbyt wolno ;-)

I teraz już wiem, że mój poprzedni program miał błąd :-) ale tylko mięczaki bazują na kartce papieru ;-) [OK, żartuję, to że mam problemy z kartką źle świadczy o mnie, nie o metodzie].
Ale co miałem zabawy pisząc sobie tą "maszynę wirtualną" to moje ;-)

Update:
Oczywiście da się to samo co wyżej jest w maszynie wirtualnej zrobić prościej i szybciej ;-)
O tak:
A: DAT 1
B: DAT 0
POPA
STA B
L1: LDA B
INC
STA B
LDA A
INC
STA A
LOOP L1
LDA B
PUSHA
RET

Przecież zamiast robić dziwne rzeczy w stylu dodawaniu 15 razy, można zwiększać 1 aż będzie równe 0, wtedy wartość zwiększana wraz z nim będzie o dokładnie 1 mniejsza niż była na początku ;-)
Polecam przekleić ten programik do maszyny i sprawdzić :-)


Podobne postybeta
Jak zrobić dec mając tylko inc? :-)
Potworność ;-) czyli mnożenie w 90 liniach ;-)
.asm - to było fajne rozszerzenie plików z programami ;-)
Amd64, Intel64, EMT64, WTF64? ;-)
Seek & Click - automagicznie wykryj buttona i na niego kliknij ;-)