Prevajalnik/program.s

148 lines
2.5 KiB
ArmAsm

.text
.org 0x20
izvorna_koda: .asciz " \n\n stev1: .var 0xf123 @ komentar 1\n @prazna vrstica \n stev2: .var 15
\nstev3: .var 128\n_start:\n mov r1, #5 @v r1 premakni 5\nmov r2, #1\nukaz3: add r1, #1\nb _start"
.align
buffer: .byte
.align
izvorna_koda_pocisceno: .space 120
.align
tabela_oznak: .space 100
.align
.global _start
_start:
@ vas program napisite tu!
@ pocistimo registre, ker jih cpulator ne
mov r0, #0
mov r1, #0
mov r2, #0
mov r3, #0
ADR R0, izvorna_koda
ADR R2, izvorna_koda_pocisceno
SUB R0, R0, #1 @ da lahko pri iteraciji cez adreso zacnemo pri nicli
SUB R2, R2, #1
@ tukaj bomo vrgli ven \n, whitespace dokler ne dosezemo prvega "proper" znaka
PRECISTI_ZACETEK:
LDRB R1, [R0, #1]!
CMP R1, #32 @ presledek
BEQ PRECISTI_ZACETEK
CMP R1, #10 @ \n
BEQ PRECISTI_ZACETEK
CMP R1, #13 @ cr
BEQ PRECISTI_ZACETEK
SUB R0, R0, #1
PRECISCEVANJE:
LDRB R1, [R0, #1]!
CMP R1, #0
BEQ PREPISI_KODO
@ pogledamo za presledek
CMP R1, #32 @ presledek
BEQ PRESLEDEK_KOMENTAR
@ pogledamo za @
CMP R1, #64
BEQ KOMENTAR
@ pogledamo za novo vrstico
CMP R1, #10
BEQ NEWLINE_PRVIC
CMP R1, #13
BEQ NEWLINE_PRVIC
B POSODOBI_PRECISCENO
PRESLEDEK_KOMENTAR:
@ ce je naslednji znak @ ga ne zapisi
LDRB R3, [R0, #1]
@ pogledamo za @
CMP R3, #64
BEQ PRECISCEVANJE
STRB R1, [R2, #1]!
B PRECISCEVANJE
KOMENTAR:
@ iteracija do \n znaka da vidimo in prepisemo komentar z nulami
LDRB R1, [R0, #1]!
@ preverimo ali je nova vrstica
CMP R1, #10
@ verjetno treba posodobiti, da ne bo neposrednih onelinerjev
BEQ KOMENTAR_EOL
@ isto ampak za cr
CMP R1, #13
BEQ KOMENTAR_EOL
B KOMENTAR
KOMENTAR_EOL:
LDRB R3, [R2] @ ce je prejsnji znak \n potem ne bomo vstavili se enega
CMP R3, #10 @ pogledamo za novo vrstico
BEQ NEWLINE
CMP R3, #13 @ pogledamo za cr
BEQ NEWLINE
STRB R1, [R2, #1]!
B NEWLINE
NEWLINE_PRVIC:
LDRB R3, [R2] @ ce je prejsnji znak \n potem ne bomo vstavili se enega
CMP R3, #10 @ pogledamo za novo vrstico
BEQ NEWLINE
CMP R3, #13 @ pogledamo za cr
BEQ NEWLINE
@ prvi newline char prepisemo preostale pobrisemo
STRB R1, [R2, #1]!
NEWLINE: @ ko dobimo \n pocisti vse whitespacee
@ mislim da tukaj ne pocisti
LDRB R1, [R0, #1]!
CMP R1, #32 @ presledek
BEQ NEWLINE
SUB R0, R0, #1
B PRECISCEVANJE
POSODOBI_PRECISCENO:
STRB R1, [R2, #1]!
B PRECISCEVANJE
PREPISI_KODO:
ADR R0, izvorna_koda
ADR R2, izvorna_koda_pocisceno
SUB R0, R0, #1
SUB R2, R2, #1
ZANKA_PREPIS:
LDRB R3, [R2, #1]!
CMP R3, #0
BEQ ZAKLJUCEK
STRB R3, [R0, #1]!
B ZANKA_PREPIS
ZAKLJUCEK:
MOV R3, #0
STRB R3, [R0, #1]!
_end: b _end