Μετάβαση στο περιεχόμενο

Εργαστήριο Αρχιτεκτονικής Υπολογιστών — Σεπτέμβριος 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 δεν τροποποιείται.

✔ Επιβεβαίωσε · ✖ Βρήκα λάθος


✖ Βρήκα λάθος στη μεταγραφή