From b16c3e23d848af048e72fe6d8f8f082af7cf326c Mon Sep 17 00:00:00 2001 From: Jaka Furlan Date: Sat, 8 Nov 2025 17:05:13 +0100 Subject: [PATCH] completed rec and again fixed echo --- AA.dev.txt | 0 FA.dev | 7 ++ ass1/echo.asm | 65 ++++++++++++-- ass1/fac.asm | 14 +-- ass1/fact.asm | 66 ++++++++++++++ ass1/rec.asm | 233 ++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 371 insertions(+), 14 deletions(-) delete mode 100644 AA.dev.txt create mode 100644 FA.dev create mode 100644 ass1/fact.asm create mode 100644 ass1/rec.asm diff --git a/AA.dev.txt b/AA.dev.txt deleted file mode 100644 index e69de29..0000000 diff --git a/FA.dev b/FA.dev new file mode 100644 index 0000000..960da49 --- /dev/null +++ b/FA.dev @@ -0,0 +1,7 @@ +1 +2 +3 +4 +5 +6 +0 \ No newline at end of file diff --git a/ass1/echo.asm b/ass1/echo.asm index 44897bf..28bdeba 100644 --- a/ass1/echo.asm +++ b/ass1/echo.asm @@ -2,9 +2,12 @@ echo START 0 start .LDCH txt .JSUB char .JSUB nl - LDA #txt - JSUB string - JSUB nl + .LDA #txt + .JSUB string + .JSUB nl + + LDCH #12 + JSUB num halt J halt @@ -45,19 +48,63 @@ nl STB regB string STA regA STB regB STT regT - STL regL + .STL regL STS regS .shranimo registre loop LDB #1 + CLEAR A .da lahko comparamo z 0 LDCH @regA COMP #0 - JSUB char + WD #1 .add +1 to regA LDA regA ADD #1 STA regA JGT loop + LDA regA .obnovimo registre + LDB regB + LDT regT + .LDL regL + LDS regS + + RSUB +.izpiše število zapisano v A na std izhod +num STA regA + STB regB + STT regT + STL regL + STS regS .shranimo registre + + LDX #4 .X steje stevke, 4 je zadnji index arraya velikosti 5 + LDS #10 .za množenje/deljenje + LDT #0x30 .za pretvorbo v ascii + +loop2 RMO A, B + DIVR S, B .B = B/10 + MULR S, B .B= B*10 + SUBR B, A .A = ostanek + ADDR T, A .pretvorimo A v ascii + STCH digs, X .shranimo ascii ostanek + + .zmanjšamo X in primerjamo z #5 + RMO X, A + SUB #1 + RMO A, X + LDA #0 + COMPR X, A + + RMO B, A .premaknemo kar je še potrebno izračunati v A + DIVR S, A .A je sedaj naslednja števka + + JEQ loop2 + JGT loop2 + + .kličemo string za izpis + LDA #digs + JSUB string + JSUB nl + LDA regA .obnovimo registre LDB regB LDT regT @@ -66,12 +113,14 @@ loop LDB #1 RSUB + +.digits za num +digs RESB 5 .0 bo prazna za lazje izpisovanje + BYTE 0 .konec števke + .txt txt BYTE C'hi' BYTE 0 -.parametri -param1 RESB 1 -param2 RESB 2 .constante newline BYTE 0x0D diff --git a/ass1/fac.asm b/ass1/fac.asm index 0e77c99..6969099 100644 --- a/ass1/fac.asm +++ b/ass1/fac.asm @@ -1,11 +1,13 @@ -prog START 0 - JSUB sinit - LDA #5 +prog START 0 +zacetek CLEAR X +loop RD #0xFA + COMP #0 + JEQ halt JSUB fact + WD #1 + J loop - - -halt J halt +halt J halt .fakulteta fact COMP #1 diff --git a/ass1/fact.asm b/ass1/fact.asm new file mode 100644 index 0000000..0e77c99 --- /dev/null +++ b/ass1/fact.asm @@ -0,0 +1,66 @@ +prog START 0 + JSUB sinit + LDA #5 + JSUB fact + + + +halt J halt + +.fakulteta +fact COMP #1 + JGT rec + LDA #1 .base case + RSUB + +rec STL @stkp + JSUB spush + STA @stkp + JSUB spush + STB @stkp + JSUB spush + + RMO A, B .shrani n v B + SUB #1 .n-1 + JSUB fact .fact(n-1) + MULR B, A .n * fact(n-1) + + JSUB spop + LDB @stkp + JSUB spop + .LDA @stkp da ne povozimo odgovora? + JSUB spop + LDL @stkp + + + + RSUB + + +.rutine za sklad +sinit STA stkA + LDA #stkRESW .inicializiraj stkp + STA stkp + LDA stkA + RSUB + +spush STA stkA + LDA stkp .poveca stkp za 3 + ADD #3 + STA stkp + LDA stkA + RSUB + +spop STA stkA + LDA stkp .zmanjsa stkp za 3 + SUB #3 + STA stkp + LDA stkA + RSUB + +.podatki za sklad +stkp WORD 0 +stkA WORD 0 +stkRESW RESW 1000 + + END prog \ No newline at end of file diff --git a/ass1/rec.asm b/ass1/rec.asm new file mode 100644 index 0000000..624bc11 --- /dev/null +++ b/ass1/rec.asm @@ -0,0 +1,233 @@ +prog START 0 +zacetek JSUB sinit .inicializiramo sklad +.beremo iz 0xFA, dokler ne preberemo 0 +loop3 CLEAR A + JSUB rdNum + COMP #0 + JEQ halt + + + JSUB fact + JSUB num + J loop3 + +halt J halt + +.beri število v A dokler ne naletiš na newline in jo pretvori v int +rdNum STL @stkp + JSUB spush + STA @stkp + JSUB spush + STB @stkp + JSUB spush + + CLEAR A + CLEAR B .v B bomo shranili prebran rezultat + LDS #10 .za množenje +loop4 RD #0xFA + COMP #0xD .beremo newline + JEQ nwl + .else + MULR S, B + SUB #0x30 .pretvorimo v int + ADDR A, B + J loop4 + +nwl RD #0xFA .prebre še 0x0A + CLEAR A + RMO B, A + + JSUB spop + LDB @stkp + JSUB spop + .LDA @stkp da ne povozimo odgovora? + JSUB spop + LDL @stkp + + RSUB +.fakulteta +fact COMP #1 + JGT rec + LDA #1 .base case + RSUB + +rec STL @stkp + JSUB spush + STA @stkp + JSUB spush + STB @stkp + JSUB spush + + RMO A, B .shrani n v B + SUB #1 .n-1 + JSUB fact .fact(n-1) + MULR B, A .n * fact(n-1) + + JSUB spop + LDB @stkp + JSUB spop + .LDA @stkp da ne povozimo odgovora? + JSUB spop + LDL @stkp + + + + RSUB + + +.rutine za sklad +.inicializira kazalec na sklad +sinit STA stkA + LDA #stkRESW .inicializiraj stkp + STA stkp + LDA stkA + RSUB + +.pusha na sklad, pred klicem te subrutine shrani na sklad kar želiš +spush STA stkA + LDA stkp .poveca stkp za 3 + ADD #3 + STA stkp + LDA stkA + RSUB + +.popa iz sklada, po koncu te subrutine iz sklada beri kar želš +spop STA stkA + LDA stkp .zmanjsa stkp za 3 + SUB #3 + STA stkp + LDA stkA + RSUB + + +.nl +nl STL @stkp + JSUB spush + STB @stkp .shranimo registre + JSUB spush + STT @stkp + JSUB spush + STS @stkp + JSUB spush + + + LDCH newline + WD #1 + LDX #1 + LDCH newline, X + WD #1 + + .obnovimo registre + JSUB spop + LDS @stkp + JSUB spop + LDT @stkp + JSUB spop + LDB @stkp + JSUB spop + LDL @stkp + + RSUB + +.string +string STL @stkp + JSUB spush + STB @stkp .shranimo registre + JSUB spush + STT @stkp + JSUB spush + STS @stkp + JSUB spush + STA regA + +loop LDB #1 + CLEAR A .da lahko comparamo z 0 + LDCH @regA + COMP #0 + WD #1 + .add +1 to regA + LDA regA + ADD #1 + STA regA + JGT loop + + LDA regA .obnovimo registre + JSUB spop + LDS @stkp + JSUB spop + LDT @stkp + JSUB spop + LDB @stkp + JSUB spop + LDL @stkp + + RSUB +.izpiše število zapisano v A na std izhod +num STL @stkp + JSUB spush + STB @stkp .shranimo registre + JSUB spush + STT @stkp + JSUB spush + STS @stkp + JSUB spush + + LDX #4 .X steje stevke, 4 je zadnji index arraya velikosti 5 + LDS #10 .za množenje/deljenje + LDT #0x30 .za pretvorbo v ascii + + +loop2 RMO A, B + DIVR S, B .B = B/10 + MULR S, B .B= B*10 + SUBR B, A .A = ostanek + ADDR T, A .pretvorimo A v ascii + STCH digs, X .shranimo ascii ostanek + + .zmanjšamo X in primerjamo z #5 + RMO X, A + SUB #1 + RMO A, X + LDA #0 + COMPR X, A + + RMO B, A .premaknemo kar je še potrebno izračunati v A + DIVR S, A .A je sedaj naslednja števka + + JEQ loop2 + JGT loop2 + + .kličemo string za izpis + LDA #digs + JSUB string + JSUB nl + + JSUB spop + LDS @stkp + JSUB spop + LDT @stkp + JSUB spop + LDB @stkp + JSUB spop + LDL @stkp + + RSUB + + +.digits za num +digs RESB 5 .0 bo prazna za lazje izpisovanje + BYTE 0 .konec števke + +.constante +newline BYTE 0x0D + BYTE 0x0A + +.shramba za string +regA WORD 0 + +.podatki za sklad +stkp WORD 0 +stkA WORD 0 +stkRESW RESW 1000 + + END prog \ No newline at end of file