-
Notifications
You must be signed in to change notification settings - Fork 0
Assembler
Kod asemblera nalazi se u /software direktorijumu, sa dva fajla, /software/inc/assembler.h, koji predstavlja header fajl sa svim definicijama funkcija, strukture i uključenim bibliotekama, i /software/src/assembler.c fajl sa definicijama funkcija iz header fajla. Uz njih je dodan i Makefile.
Najjednostavniji način za pokretanje jeste da se popuni /hardware/init_files/input_program.txt asemblerskim instrukcijama i zatim iz direktorijuma scripts pokrenuti python3 run.py ili python run.py. Ovom komandom se asembler kompajlira, pokreće i pokreću se svi testovi.
Drugi način je da se kompajlira i pokreće ručno:
Za kompajliranje koda može koristiti komandu:
make assembler
Iz /software/ direktorijuma čime se generiše fajl /software/obj/assembler.
Program se potom pokreće komandom:
/putanja/do/software/obj/assembler /putanja/do/input_program.txt
Asembler će tada generisati dva fajla: instruction_memory.txt, koji sadrži RISC-V instrukcije u bitskom zapisu, i expected.txt fajl koji sadrži unose sa očekivanim rezultatima, u formatu koji je definisan na sledeći način:
pc, opcode, function3, function7, rd, rs1, rs2, alu_out, wb_out, we
gdje je wb_out očekivana upisana/pročitana vrijednost kod load/store instrukcija.
Generisani fajlovi se nalaze u /hardware/init_files/.
Očekivani format asemblera je onaj klasični kod asemblerskih instrukcija RISC-V arhitekture.
# Primjer input.txt
add x3, x2, x1 # Sabiraju se registri x2 i x1 i rezultat se smješta u x3
addi x3, x1, 33 # Sabira se vrijednost registra x1 sa brojem 33 te se rezultat smješta u registar x3
lw x4, 3(x1) # U registar x4 učitavaju se 4 bajta (word) iz dmem sa adrese 3+vrijednost_registra_x1
sh x2, 3(x1) # Iz registra x2 smještaju se 2 niža bajta u dmem na adresu 3+vrijednost_registra_x1
U početku programa svi registri su nulirani, a pošto mov instruckije nisu realizovane, smještanje nekih inicijalnih vrijednosti registara moguće je instrukcijom addi, na primjer:
addi x0, x2, 33
addi x4, x2, 23
addi x2, x5, 999
Na ovaj način smo u registar x0 smjestili vrijednost 33, jer je inicijalno vrijednost x2, kao i ostalih registara, jednaka nuli, pa kada na njegovu vrijednost dodamo 33, dobijemo 33 koji se smješta u x0, tako će se na kraju ovo programa u x4 i x2 nalaziti vrijednosti 23 i 999 respektivno. Sada dalje možemo popunjavati ostale registre kao i dmem.
Takođe, može se popuniti data_memory.txt fajl iz init_files direktorijuma koji će popuniti i dmem u asembleru.
Za detaljniji primjer asemblerskog koda posjetiti input_program.txt repozitorijuma projekta.
Instrukcije moraju poštovati priloženu sintaksu (mala slova, naziv registara počinje sa x, razmaci, zagrade i zarezi na odgovarajućim mjestima...).