Incomprensione codice Assembly

di il
8 risposte

Incomprensione codice Assembly

Mi hanno assegnato un esercizio in linguaggio Assembly da spiegare, solo che alcuni passaggi non mi sono chiari.
Se per favore qualcuno di voi riuscisse a spiegarmele,ve ne sarei grato.
(Indicherò tra parentesi le linee di codice che non mi sono chiare)
Il codice è il seguente:
#Allocare due vettori v1 e v2 di interi a 16 bit di 10 elementi ciascuno e scrivere una funzione utilizzando il passaggio
#dei parametri sullo stack che crea un nuovo vettore v3 nello stack i cui elementi sono calcolati secondo
#la seguente formula v3=v1+v2[10-i]. Scrivere una funzione che stampa a video il contenuto di v3 e
# si scriva il main per l' invocazione delle due funzioni.

.data
vet1: .half 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
vet2: .half 9, 8, 7, 6, 5, 4, 3, 2, 1, 0

stringa: .asciiz "Il risultato acquisito e': "
spazio: .asciiz " "

.text
la $s0, vet1 (Nel registro $s0 viene caricato l'indirizzo dell'intero vettore vet1? )
la $s1, vet2
jal somma
j stampa

addi $sp, $sp, -20 (Perchè lo stack viene decrementato di 20? )

somma:
li $t1, 18
loop: beq $t0, 20, exit (In questo loop non ho capito quasi nulla)
add $t3, $t0, $s0
sub $t2, $t1, $t0
add $t4, $s1, $t2
lh $s2, 0($t3)
lh $s3, 0($t4)
add $s4, $s2, $s3
add $t5, $sp, $t0
sh $s4, 0($t5)
addi $t0, $t0, 2
j loop

exit:
jr $ra

stampa:
li $v0, 4
la $a0, stringa
syscall

li $t0, 0
loop2: (e anche questo loop non mi è chiaro)
beq $t0, 20, exit2
add $t5, $sp, $t0
lh $s5, 0($t5)


li $v0, 1
move $a0, $s5
syscall

li $v0, 4
la $a0, spazio
syscall

addi $t0, $t0, 2
j loop2

exit2:
nop

8 Risposte

  • Re: Incomprensione codice Assembly

    Ahh... il buon vecchio MIPS...
    prova a "tradurre" in C i vari pezzi di codice, magari ti è più immediato capire cosa fa
  • Re: Incomprensione codice Assembly

    Ho provato a fare cosi, ma resto bloccato sul loop
    La beq è come un if e finchè $t0 non è uguale a 20 il loop continua, sul resto invece ho troppi dubbi
  • Re: Incomprensione codice Assembly

    Bhè scrivi i dubbi riga per riga
  • Re: Incomprensione codice Assembly

    .data
    vet1: .half 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    vet2: .half 9, 8, 7, 6, 5, 4, 3, 2, 1, 0

    stringa: .asciiz "Il risultato acquisito e': "
    spazio: .asciiz " "

    .text
    la $s0, vet1 "Nel registro $s0 viene caricato l'indirizzo dell'intero vettore vet1? "
    la $s1, vet2
    jal somma
    j stampa

    addi $sp, $sp, -20 "Perchè lo stack viene decrementato di 20?"

    somma:
    li $t1, 18
    loop: beq $t0, 20, exit
    add $t3, $t0, $s0 "a $t0 viene sommato solo un elemento del vettore vet1? e $t0 vale 0?
    sub $t2, $t1, $t0 "perchè questa sub? "
    add $t4, $s1, $t2
    lh $s2, 0($t3) " non ho capito qui cosa fa"
    lh $s3, 0($t4)
    add $s4, $s2, $s3
    add $t5, $sp, $t0
    sh $s4, 0($t5)
    addi $t0, $t0, 2
    j loop

    exit:
    jr $ra

    stampa:
    li $v0, 4
    la $a0, stringa
    syscall

    li $t0, 0
    loop2: "e anche questo loop non mi è chiaro"
    beq $t0, 20, exit2
    add $t5, $sp, $t0
    lh $s5, 0($t5)


    li $v0, 1
    move $a0, $s5
    syscall

    li $v0, 4
    la $a0, spazio
    syscall

    addi $t0, $t0, 2
    j loop2

    exit2:
    nop
  • Re: Incomprensione codice Assembly

    Ho inserito tra virgolette i miei dubbi sulle varie righe, grazie in anticipo
  • Re: Incomprensione codice Assembly

    ugo18 ha scritto:


    la $s0, vet1 "Nel registro $s0 viene caricato l'indirizzo dell'intero vettore vet1? "
    giusto per curiosità, cosa intendi per "indirizzo dell'intero vettore vet1"?
    Perchè i vettori, in effetti, non esistono (* a meno di non introdurre casi strani che direi di lasciare per ora)
  • Re: Incomprensione codice Assembly

    Cioè ogni elemento del vettore (inteso come un insieme ordinato di elementi) viene caricato nel registro $s0?
  • Re: Incomprensione codice Assembly

    Non offenderti, ma mi pare ti serva una vigorosissima ripassata agli opcode MIPS.
    In generale sono le () a determinare se carichi il contenuto di qualcosa, o l'indirizzo (grosso modo in C come un & e * rispettivamente)
    la $t0, qualcosa

    Carica l'INDIRIZZO di qualcosa in $t0, circa $t0=&qualcosa
    lw $t1, ($t0)
    circa $t1=*($t0)
    equivalente
    lw $t1, 0($t0)
    Carica in $t1 il CONTENUTO della word (sai che è una word perchè è lw) il cui indirizzo è in $t0

    Normalmente poi ci sono gli offset fissi, tipo il QUATTRO di questo esempio, è come (in C) un $t1=*($t0+4) (grosso modo)
    lw $t1, 4($t0)
Devi accedere o registrarti per scrivere nel forum
8 risposte