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