MIPS Caricamento array con sottoprogrammi ecc..

di il
1 risposte

MIPS Caricamento array con sottoprogrammi ecc..

Salve a tutti, ho fatto quest'esercizio la prima parte cioè la procedura leggi_vet funziona, il problema è la seconda parte,la procedura trova_neg, che teoricamente dovrebbe funzionare ma mi da sempre 1. Allego traccia e codice C, e mio programma in Assembly MIPS. Inoltre se qualcuno e così gentile da dirmi la differenza tra il passaggio di paramentri con & e senza( void leggi_vet(int v[],int &n)). So la differenza in C, ma non so cosa cambia e come comportarmi in assembly. Grazie anticipatamente.

Scrivere un programma in Assembly MIPS che legga da input gli
elementi di un array di interi signed, salvandoli in uno spazio
opportunamente allocato nel segmento .data. Il programma determini
quindi l'indice del primo elemento negativo presente nell'array. Si
consideri a titolo di riferimento il seguente codice C:

int vet[128];
int riemp;
void main() {
int pos;
leggi_vet(vet,riemp);
trova_neg(vet,riemp,pos);
cout << "Posizione primo el. negativo: << pos;
cout << "\n";
}
void leggi_vet(int v[],int &n) {
int x;
cout << "Numero elementi: ";
cin >> n;
for(i=0;i<n;i++) {
cout<< "Elemento " << i <<": ";
cin >> x;
vet=x;
}
}
void trova_neg(int v[],int n,int &p) {
int i,int x;
i=0;
while(i<n){
if(v<0) {
p=i;
break;
}
i++;
}
}

CODICE IN ASSEMBLY
.data

vet: .space 512
riemp: .space 0
pos: .space 0

str3: .asciiz " gli elementi nel vettore sono"
str1: .asciiz " Pos primo elem. negativo: "
str2: .asciiz "inserisci num elementi: "
str: .asciiz " inserisci elemento nel vettore: "
str5: .asciiz "non ci sono elementi negativi"
str4: .asciiz "\n"
.align 2
.text
.globl main
main:

#caricamento paramentri leggivet

la $a0,vet
lw $a1,riemp
jal leggivet #salta a leggivet
#sw $v0,vet #ritorno valori da procedura
sw $v1,riemp #ritorno valori da procedura


#stampa vet
la $t1,vet
move $t2,$zero #cont
for2:
li $v0,4
la $a0,str4
syscall
li $v0,1
lw $a0,($t1)
syscall
addiu $t1,$t1,4 #vet[i+1]
addi $t2,$t2,1 #cont++
bne $t2,$v1,for2 # if cont < riemp($v1) go to for:




#caricamento paramentri trovaneg
la $a0,vet
lw $a1,riemp
jal trovaneg #salta a trovaneg
sw $v0,pos #ritorno valori da procedura
move $v0,$s2

#blt $s2,$zero,exit #controlla se ci sono valori <0

#stampa posizione
li $v0,4
la $a0,str1
syscall
li $v0,1
lw $a0,pos
syscall

li $v0,10
syscall # EXIT

exit:
li $v0,4
la $a0,str5
syscall
li $v0,10
syscall # EXIT se è >0


#funzione leggivet

leggivet:
move $t0,$zero #i=0
move $s0,$a0 #salvo $a0 cioè indirizzo di vet

li $v0,4
la $a0,str2
syscall

li $v0,5
syscall
move $a1,$v0 #mette num elementi in riemp


for:
li $v0,4
la $a0,str
syscall
li $v0,5
syscall # inserisci elemento
sw $v0,($s0)
addi $s0,$s0,4 #vet++
addi $t0,$t0,1 #i++
bne $t0,$a1,for #$t0=i $s1=n

move $v0,$s0
move $v1,$a1
jr $ra #ritorno al main



#funzione trovaneg

trovaneg:
li $t0,0 #i=0

while:
beq $t0,$a1,out1
la $s1,($a0)
bgez $s1,outif
move $v0,$t0
jr $ra
outif:
addiu $a0,$a0,4 #vet[i+1]
addi $t0,$t0,1 #i++
j while
out1:
jr $ra #ritorno al main

1 Risposte

  • Re: MIPS Caricamento array con sottoprogrammi ecc..

    Ciao
    non ho capito una cosa il programma Assembly
    deve prendere i dati dall'array dal programma c o li deve restituire?
    comunque in c il simbolo & davanti alla variabile serve per passare il puntatore della variabile alias l'indirizzo.
    cosi puoi passare un array di dimensioni x senza intasare lo stack.
    per prendere i dati dallo stack devi prima allocare lo spazio
    esempio per 3 variabili
    
    addi $sp,$sp,-12 #alloca lo spazio per 3 registri
    sw $s1,8($sp)
    sw $s2,4($sp)
    sw $s0,0($sp)
    

    adesso siccome i dati stanno nei registri $a0..$a3
    dove l'indirizzo dell'array sta $a0 e $a1 c'è la dimensione
    dovrai fare un ciclo che vada da 0 al valore di $a1 -1
    in $a0[ciclo] troverai i tuoi dati.
    spero di esserti stato di aiuto se c'è qualcosa che non hai capito chiedi pure.
Devi accedere o registrarti per scrivere nel forum
1 risposte