Processen en processoren/Planning/Practica/Practicum 1/voorbeeld

Uit Werkplaats
Ga naar: navigatie, zoeken

De onderstaande programma's kun je gebruiken om de practicum-processor te testen. Heb je ook een voorbeeldprogramma? Voeg het dan onderaan deze pagina toe.

Als je de programma's buiten het vak Systeemarchitectuur 1 wilt gebruiken, vraag de betreffende auteur om toestemming.

Hello, world

Dit programma print "Hello, world!" op het scherm.

© 2010 David N. Jansen, Radboud Universiteit Nijmegen.

        .ORG    0
        MOVIFT  R0, hello     # hello is zo klein dat LOADHI niet nodig is.
loop:   READ    R1, [R0]
        OR      R1, R1
        JZ      end           # als het gelezen woord 0 is, dan is het einde van de string bereikt.
        WRITE   [-1], R1
        ADDIFT  R0, 1
        JT      loop
end:    HALT

hello:  .DATA   "Hello, world!\n", 0


Dit programma als downloadbaar bestand. Het geassembleerde programma als .rom-bestand.

Test de vlaggen en het RAM

Dit programma voert twee eenvoudige berekeningen uit en test of de vlaggen dan goed staan. Het schrijft ook een gegeven in het RAM en leest het terug.

© 2011 David N. Jansen, Radboud Universiteit Nijmegen.


        .ORG      0           # plaats het programma op adres 0
        LOADFLAG  C           # zet de carry-vlag
        ADDC      R1, ~R1     # tel ~R1+1 bij R1 op, dat is: trek R1 van R1 af
        ADDIFT    R1, 1       # R1 was 0, wordt 1
        MOVIFT    R2, 2
        ADDC      R2, R1      # carry-vlag was nog gezet van vorige additie. R2 wordt 4
        LOADHI    R7,0xff0
        JZ        error       # test of de vlaggen goed werken
        JO        error
        JN        error
        JC        error
        WRITE     [R7], R2    # sla R2 op in het RAM
        READ      R5, [R7]    # en lees het weer terug
        LOADFLAG  C
        ADDC      R5, ~R2     # trek R2 van de gelezen waarde af. Het resultaat moet 0 zijn.
        JNZ       error       # test of de vlaggen goed gezet zijn.
        JO        error
        JNC       error
        JN        error
        LOADHI    R4, HI 'y'  # voer de letter 'y' uit -- test is geslaagd
        ADDIFT    R4, LO 'y'
        WRITE     [-1], R4
        JT        end
error:  LOADHI    R4, HI 'n'  # voer de letter 'n' uit -- test is gefaald
        ADDIFT    R4, LO 'n'
        WRITE     [-1], R4
end:    HALT                  # stop

Test zero-vlag

Dit programma print 'y' of 'n' op het scherm, afhankelijk ervan of de zero-vlag door OR gezet wordt of niet. Als jouw processor goed werkt, print het programma 'y'. © 2009 Wouter Geraedts. Aangepast aan de PenP-2011-practicum-assembly door David N. Jansen.

        .ORG    0
        MOVIFT  R1, 0
        OR      R1, R1
        JZ      succes
        LOADHI  R0, HI 'n'
        ADDIFT  R0, LO 'n'
        WRITE   [-1], R0
        HALT
succes: LOADHI  R0, HI 'y'
        ADDIFT  R0, LO 'y'
        WRITE   [-1], R0
        HALT

Test rotatie-werk vlaggen

© 2011 Patrick Uiterwijk, Radboud Universiteit Nijmegen.

        .ORG 0			# Zet programma op plek 0
        MOVIFT R0, 0		# Zet 0 in R0
        ROL R0, 2		# Roteert 0 met 2 posities
        JNZ error		# Het zou nog steeds 0 moeten zijn
        MOVIFT R0, 1		# Zet 1 in R0
        ROL R0, 15		# Roteert 1 met 15 posities, zou nu 10...0 moeten zijn
        JNN error		# MSB moet 1 zijn
        JNO error		# MSB moet veranderd zijn (van 0 naar 1)
        ROL R0, 1		# Roteer door naar 00...01
        JNC error		# LSB moet 1 zijn
        LOADFLAG		# Carry moet weer op 0 gezet worden, anders wordt die er door ADDC net zo hard weer bijgeteld
        ADDC R0, -1		# R0 moet nu 1 zijn
        JNZ error		# R0 moet na optellen van -1 dus 0 zijn
        JT succes		# We zijn door deze tests heen!

succes: LOADHI R0, HI 'y'	# Schrijf de MSB van 'y' naar R0
        ADDIFT R0, LO 'y'	# Schrijf de LSB van 'y' naar R0
        WRITE [-1], R0		# Schrijf R0 naar Output
        HALT			# Stop

error: LOADHI R0, HI 'n'	# Schrijf de MSB van 'n' naar R0
        ADDIFT R0, LO 'n'	# Schrijf de LSB van 'n' naar R0
        WRITE [-1], R0		# Schrijf R0 naar Output
        HALT			# Stop

Bereken de wortel

Dit programma berekent de (naar beneden afgeronde) wortel van het getal in R0. Het antwoord komt in R2 te staan. De uitkomst wordt berekend door middel van de verschilrij van n2 (1, 3, 5, 7, 9, ...). © 2011 Rob ten Berge.

        .ORG     0
        OR       R0, R0
        MOVIFL   R2, -1      # wortel van een negatief getal: -1 om fout aan te geven.
        JL       end
        MOVIFT   R2, 0       # resultaat
        MOVIFT   R1, -1      # eerste element van de verschilrij
loop:   LOADFLAG
        ADDC     R0, R1
        ADDIFGE  R2, 1
        ADDIFG   R1, -2      # R1 wordt het volgende element van de verschilrij
        JG       loop
end:    HALT