Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %include "vm.inc"
- %define TABLE 0xb000
- ; Wypisz dane, znak po znaku.
- vset r5, hello_str
- vpush r5
- vcall print_str
- vset r5, code
- vpush r5
- vcall print_str
- vset r2, 0xa
- voutb 0x20, r2 ; Nowa linia
- vjmp start
- print_str:
- vset r3, 4
- vadd sp, r3
- vpop r4
- vsub sp, r3
- vsub sp, r3
- vxor r0, r0
- vset r1, 1
- print_str_loop:
- ; Pobierz bajt spod adresu z R0.
- vldb r2, r4
- ; Jesli to zero, wyjdź z pętli.
- vcmp r2, r0
- vjz print_str_end
- ; W przeciwym wypadku, wypisz znak na konsoli.
- voutb 0x20, r2
- ; Przesuń r4 na kolejny znak i idź na początek pętli.
- vadd r4, r1
- vjmp print_str_loop
- print_str_end:
- vret
- start:
- vxor r0, r0 ; Wyzeruj rejestr r0
- vset r1, 1 ; Ustaw wartosc r1 na 1
- vset r10, code ; Wskaznik na kod programu brainfuck
- vset r11, TABLE ; Wskaznik na tablice z wartosciami
- interpret:
- vldb r2, r10 ; Zaladuj znak z kodu programu
- ; Jesli zero, wyjdz
- vcmp r2, r0
- vjz end
- ; Jesli +
- vset r3, '+'
- vcmp r2, r3
- vje interpret_add
- ; Jesli -
- vset r3, '-'
- vcmp r2, r3
- vje interpret_sub
- ; Jesli >
- vset r3, '>'
- vcmp r2, r3
- vje interpret_mover
- ; Jesli <
- vset r3, '<'
- vcmp r2, r3
- vje interpret_movel
- ; Jesli [
- vset r3, '['
- vcmp r2, r3
- vje interpret_loop_start
- ; Jesli ]
- vset r3, ']'
- vcmp r2, r3
- vje interpret_loop_end
- ; Jesli .
- vset r3, '.'
- vcmp r2, r3
- vje interpret_print
- interpret_add:
- vldb r4, r11 ; Wczytaj wartosc z tablicy
- vadd r4, r1 ; Dodaj 1
- vstb r11, r4 ; Zapisz wartosc
- vjmp next
- interpret_sub:
- vldb r4, r11 ; Wczytaj wartosc z tablicy
- vsub r4, r1 ; Odejmij 1
- vstb r11, r4 ; Zapisz wartosc
- vjmp next
- interpret_mover:
- vadd r11, r1
- vjmp next
- interpret_movel:
- vsub r11, r1
- vjmp next
- interpret_loop_start:
- vmov r5, r10
- ; vadd r5, r1
- vpush r5 ; Zapisz miejsce startu kodu w petli na stosie
- vjmp next
- interpret_loop_end:
- vldb r4, r11 ; Wczytaj wartosc z tablicy
- vcmp r4, r0
- vjg interpret_loop_end_do ; Skocz do zmiany adresu
- vpop r5
- vjmp next
- interpret_loop_end_do:
- vpop r5
- vpush r5
- vmov r10, r5
- vjmp next
- interpret_print:
- vldb r4, r11 ; Wczytaj wartosc z tablicy
- voutb 0x20, r4 ; Wypisz na ekranie
- vjmp next
- next:
- vadd r10, r1 ; Przejdz do nastepnego znaku
- vjmp interpret
- end:
- voff
- hello_str:
- db "Brainfuck interpreter", 0xa, 0
- code:
- ;db "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+.-.", 0
- ;db "", 0
- ;db "++++++++++[>+++++++++<-]>+++++++.", 0
- db "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.", 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement