Εργαστήριο Αρχιτεκτονικής Υπολογιστών — Σεπτέμβριος 2026¶
Η μεταγραφή προέρχεται από δύο φωτογραφίες: 45771D3D-56F3-41E1-ACD6-E47948C4E17F.png (εκφώνηση Θέματος 1) και 69B5FB9F-7B28-4247-863D-8039D430758C.png (αρχικός κώδικας thema_1.s).
45771D3D-56F3-41E1-ACD6-E47948C4E17F.png¶
Δίνεται ένα πρόγραμμα σε συμβολική γλώσσα RISC-V με όνομα thema_1.s. Το αρχικό πρόγραμμα αντιγράφει τα έξι στοιχεία του πίνακα values στον πίνακα result, διατηρώντας την ίδια σειρά και αποθηκεύοντας κάθε στοιχείο ως λέξη 32 bit.
[A1] Τροποποιήστε το αρχικό πρόγραμμα ώστε, κατά την αντιγραφή, από κάθε στοιχείο του πίνακα values να διατηρούνται μόνο τα 8 λιγότερο σημαντικά bit (bits [7:0]) και οι νέες τιμές να αποθηκεύονται στον πίνακα result με αντίστροφη σειρά. Κάθε στοιχείο του result πρέπει να καταλαμβάνει 1 byte.
Αποθηκεύστε τη νέα έκδοση ως thema_1_A1.s και εκτελέστε την στον RARS.
* ο πίνακας values δεν πρέπει να τροποποιηθεί,
* ο πίνακας result πρέπει να δεσμεύει στο τμήμα .data ακριβώς τον απαιτούμενο χώρο,
* το πρόγραμμα πρέπει να εμφανίζει στην κονσόλα τα στοιχεία του νέου πίνακα ως μη προσημασμένους ακέραιους.
[A2] Ξεκινώντας από τη λύση σας στο ερώτημα Α1, αποθηκεύστε το πρόγραμμα ως thema_1_A2.s και τροποποιήστε το ώστε ο νέος πίνακας να μη δεσμεύεται πλέον στο τμήμα .data, αλλά δυναμικά στον σωρό (heap), διατηρώντας ακριβώς την ίδια επεξεργασία και το ίδιο τελικό αποτέλεσμα.
Για τη δυναμική δέσμευση μνήμης χρησιμοποιήστε την κλήση συστήματος Sbrk.
* να δεσμευτεί στον σωρό ακριβώς ο απαιτούμενος αριθμός bytes,
* να μην τροποποιηθεί ο αρχικός πίνακας values,
Ισχύουν επιπλέον τα εξής: * κάθε στοιχείο του νέου πίνακα πρέπει να αποθηκεύεται σε 1 byte, * οι τιμές πρέπει να παραμένουν σε αντίστροφη σειρά, * το πρόγραμμα πρέπει να εμφανίζει στην κονσόλα το ίδιο αποτέλεσμα με το Α1, * δεν απαιτείται η υλοποίηση καμίας συνάρτησης ή διαδικασίας· οι αλλαγές πρέπει να γίνουν απευθείας στο αρχικό πρόγραμμα.
69B5FB9F-7B28-4247-863D-8039D430758C.png¶
.data
values:
.word 0x12345678, 0x000000F0, 0xABCDEF01
.word 0x13572456, 0x800000CD, 0xFFFFFFFF
result:
.space 24
.text
.globl main
main:
la t0, values
la t1, result
li t2, 6
copy_loop:
beq t2, x0, print_init
lw t3, 0(t0)
sw t3, 0(t1)
addi t0, t0, 4
addi t1, t1, 4
addi t2, t2, -1
jal x0, copy_loop
print_init:
la t0, result
li t2, 6
print_loop:
beq t2, x0, exit
lw a0, 0(t0)
li a7, 1
ecall
li a0, 32
li a7, 11
ecall
addi t0, t0, 4
addi t2, t2, -1
jal x0, print_loop
exit:
li a7, 10
ecall
Λύσεις (⚪ AI, μη επαληθευμένο)
Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: λύσεις AI (deepseek-flash), ανεξάρτητη επανάληψη και αντιπαραβολή· καμία δεν έχει ελεγχθεί από άνθρωπο
Προσοχή
Λύση από AI — ελέγξτε την· δεν έχει επαληθευτεί από άνθρωπο. Η ένδειξη «δύο λύσεις συμφωνούν» δεν σημαίνει ότι η απάντηση είναι σωστή.
AI λύσεις — 2026-09¶
Οι λύσεις γράφτηκαν από μοντέλα AI και δεν έχουν ελεγχθεί από άνθρωπο. Η αρίθμηση ακολουθεί το αρχείο θεμάτων.
Θέμα 1 — A1¶
Αξιοπιστία: μία λύση AI, δεν έχει αντιπαραβληθεί με δεύτερη · εμπιστοσύνη λύτη: υψηλή
Αρκεί κάθε λέξη των values να διαβαστεί με lw, να κρατηθούν μόνο τα 8 λιγότερο σημαντικά bit με andi ... , 0xFF και να αποθηκευτεί με sb. Ο δείκτης του result ξεκινά από το τέλος (result + 5) και μειώνεται, ώστε η σειρά να αντιστραφεί. Στο .data ο result δεσμεύει ακριβώς 6 bytes. Η εκτύπωση γίνεται byte-by-byte με lbu, ώστε οι τιμές να εμφανιστούν ως μη προσημασμένοι ακέραιοι.
.data
values:
.word 0x12345678, 0x000000F0, 0xABCDEF01
.word 0x13572456, 0x800000CD, 0xFFFFFFFF
result:
.space 6 # ακριβώς 6 bytes, ένα για κάθε στοιχείο
.text
.globl main
main:
la t0, values # δείκτης στον values
la t1, result
addi t1, t1, 5 # δείκτης στο τελευταίο byte του result
li t2, 6 # 6 στοιχεία
copy_loop:
beq t2, x0, print_init
lw t3, 0(t0) # φόρτωση λέξης από values
andi t3, t3, 0xFF # κρατάμε μόνο bits [7:0]
sb t3, 0(t1) # αποθήκευση 1 byte με αντίστροφη σειρά
addi t0, t0, 4 # επόμενη λέξη values
addi t1, t1, -1 # προηγούμενο byte result
addi t2, t2, -1
jal x0, copy_loop
print_init:
la t0, result
li t2, 6
print_loop:
beq t2, x0, exit
lbu a0, 0(t0) # μη προσημασμένο byte
li a7, 1 # PrintInt
ecall
li a0, 32 # κενό
li a7, 11 # PrintChar
ecall
addi t0, t0, 1
addi t2, t2, -1
jal x0, print_loop
exit:
li a7, 10 # Exit
ecall
Η έξοδος είναι: 255 205 86 1 240 120.
Θέμα 1 — A2¶
Αξιοπιστία: μία λύση AI, δεν έχει αντιπαραβληθεί με δεύτερη · εμπιστοσύνη λύτη: υψηλή
Αφαιρείται ο result από το .data. Με Sbrk (syscall 9) δεσμεύονται δυναμικά ακριβώς 6 bytes στον σωρό· η διεύθυνση βάσης επιστρέφεται στο a0 και αποθηκεύεται σε καταχωρητή που διατηρείται για την εκτύπωση. Η επεξεργασία και η σειρά αποθήκευσης είναι ίδιες με το A1.
.data
values:
.word 0x12345678, 0x000000F0, 0xABCDEF01
.word 0x13572456, 0x800000CD, 0xFFFFFFFF
.text
.globl main
main:
# Δυναμική δέσμευση ακριβώς 6 bytes στον heap
li a0, 6
li a7, 9 # Sbrk
ecall
mv s0, a0 # βάση του δυναμικού result
addi t1, s0, 5 # δείκτης στο τελευταίο byte
la t0, values
li t2, 6
copy_loop:
beq t2, x0, print_init
lw t3, 0(t0) # φόρτωση λέξης από values
andi t3, t3, 0xFF # κρατάμε μόνο bits [7:0]
sb t3, 0(t1) # αποθήκευση 1 byte με αντίστροφη σειρά
addi t0, t0, 4
addi t1, t1, -1
addi t2, t2, -1
jal x0, copy_loop
print_init:
mv t0, s0 # αρχή του δυναμικού result
li t2, 6
print_loop:
beq t2, x0, exit
lbu a0, 0(t0) # μη προσημασμένο byte
li a7, 1 # PrintInt
ecall
li a0, 32 # κενό
li a7, 11 # PrintChar
ecall
addi t0, t0, 1
addi t2, t2, -1
jal x0, print_loop
exit:
li a7, 10 # Exit
ecall
Η έξοδος είναι η ίδια με το A1: 255 205 86 1 240 120, ενώ ο πίνακας values δεν τροποποιείται.