SPO_JakaFurlan/ass1/rec.asm
2025-11-08 17:05:13 +01:00

233 lines
No EOL
3.1 KiB
NASM

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