środa, kwietnia 17, 2013

Jak zrobić dec mając tylko inc? :-)

Tak mnie to męczyło...

Wymyśliłem sobie prosty "język" w którym mam:
LDA X - load to accumulator (ładuje to co w pamięci pod X do akumulatora)
STA X - store accumulator (zapisuje do pamięci pod X to co w akumulatorze)
INC - increment, czyli zwiększenie wartości akumulatora o 1
ZERO - zeruje akumulator
LOOP X - skacze pod X jeśli akumulator nie jest równy 0
PUSHA - odkłada wartość akumulatora na stos
POPA - pobiera wartość akumulatora na stos
CALL X - woła "podprogram", odkłada aktualny adres na stos (drugi żeby było prościej) i skacze do X
RET - pobiera wartość z drugiego stosu i wraca do następnego adresu
DAT val - wartość val

Są do tego 2 stosy, jeden dla danych, drugi dla adresów.

No i DEC wyobrażam sobie jakoś tak:
COUNT: DAT 0
X: DAT 0
VAL_65535: DAT 65535
DEC: POPA
STA X
ZERO
STA COUNT
L1: LDA X
INC
STA X
LDA COUNT
INC
STA COUNT
PUSHA
LDA VAL_65535
PUSHA
CALL EQ
POPA
LOOP L2
ZERO
LOOP L1
L2: LDA X
POPA
RET

Użyty jest tu "podprogram" EQ sprawdzający równość:
X: DAT 0
Y: DAT 0
EQ: POPA
STA X
POPA
STA Y
EQ1: LDA X
INC
STA X
LDA Y
INC
STA Y
LOOP EQ1
LDA X
LOOP NON_EQ
ZERO
INC
PUSHA
RET
NON_EQ:
ZERO
PUSHA
RET

I teraz pytanie, da się prościej? :-)
Bo mnie się moje rozwiązanie nie podoba, a jakoś blisko 2 w nocy nie mam pomysłu na coś lepszego ;-)

Cała idea mojego programiku opiera się na przekręceniu licznika, czyli zwiększamy X i licznik, gdy licznik osiągnie zadaną wartość to znaczy, że nasza liczba to teraz X' = (X+VAL_65535)%65536=X'-1 (zakładam 16 bitowe liczby).
Do tego programik EQ działa tak, że zwiększa X i Y aż Y będzie równy 0, wtedy ładuje X i sprawdza czy X też jest równe 0 jeśli tak to zwróci 1, jeśli nie to zwróci 0.

Jest jeszcze to, że nie do końca mam pewność, że mój DEC robi to co powinien, ale jak na razie nie miałem siły by napisać symulator ;-)
Na kartce sprawdzałem dla liczb 3 bitowych i wydaje mi się, że DEC powinien działać... ale pewności nie mam :-)


Podobne postybeta
Potworność ;-) czyli mnożenie w 90 liniach ;-)
DEC z INC odpowiedź i mała Maszyna Wirtualna ;-)
A takie tam ;-)
.asm - to było fajne rozszerzenie plików z programami ;-)
Referencje w Java'ie