Questo è il codice, con il programma in C originale da tradurre in assembly ( scusate è un po' lunghetto!):
#PROGRAMMA ORIGINALE IN C
#void main(){
# int v1[10];
# int *v2;
# int d1, d2, i;
# d1=5;
# for(i=0;i<d1; i++){
# printf("Digitare elemento v[%d]: ", i);
# scanf("%d", &v1[i]);
# }
# v2 = (int*)malloc(10*sizeof(int));
# d2 = copia_vettore_invertito(v1,d1,v2);
# for(i=0; i<d2; i++)
# printf("%d ", v2[i]);
#}
#int copia_vettore_invertito(int src[], int dim, int dest[]){
# int k;
# for(k=0; k<dim; k++)
# dest[dim-k-1] = src[k];
# return dim;
---------------------------
.globl __start
.data
msg1: .asciiz "Digitare elemento v["
msg2: .asciiz "]\n"
.text
__start:
addi $sp, $sp, -68
sw $fp, 68($sp)
sw $ra, 64($sp)
sw $s0, 40($sp) #$s0-->&v1
sw $s1, 16($sp) #$s1-->&v2
sw $s2, 12($sp) #$s2-->d1
sw $s3, 8($sp) #$s3-->d2
sw $s4, 4($sp) #$s4-->i
addi $fp, $sp, 68 #aggiorno il frame pointer
addi $s0, $fp, -48
li $s2, 5
li $s4, 0
for: bge $s4, $s2, finefor
li $v0, 4
la $a0, msg1
syscall
add $a0, $0, $s4
li $v0, 1
syscall
li $v0, 4
la $a0, msg2
syscall
li $v0, 5
syscall
add $t0, $0, $v0
mul $t1, $s4, 4
add $t1, $t1, $s0
sw $t0, 0($t1)
addi $s4, $s4, 1
j for
finefor:
li $t0, 10
li $v0, 9
mul $a0, $t0, 4
syscall
move $s1, $v0 #$s1-->&v2
move $a0, $s0 #$s0-->&v1
move $a1, $s2 #$s2-->d1
move $a2, $s1 #$s1-->&v2
jal copiaVettoreInvertito
move $s3, $v0
li $s4, 0
for2: bge $s4, $s3 finefor2
mul $t0, $s4, 4
add $t0, $t0, $s1
lw $t1, 0($t0)
add $a0, $0, $t1
li $v0, 1
syscall
addi $s4, $s4, 1
j for2
finefor2:
lw $fp, 68($sp)
lw $ra, 64($sp)
lw $s0, 40($sp) #&v1
lw $s1, 16($sp) #&v2
lw $s2, 12($sp) #d1
lw $s3, 8($sp) #d2
lw $s4, 4($sp) #i
addi $sp, $sp, 68 #aggiorno il frame pointer
jr $ra
copiaVettoreInvertito:
addi $sp, $sp, -8
sw $s0, 4($sp)
sw $fp, 8($sp)
addi $fp, $sp, 8
li $s0, 0 #$s0-->k
for1: bge $s0, $a1 finefor1
mul $t2, $s0, 4
add $t2, $t2, $a2
lw $t3, 0($t2)
sub $t0, $a1, $s0 #dim-k
addi $t0, $t0, -1
mul $t0, $t0, 4
add $t0, $t0, $a2
sw $t3, 0($t0)
addi $s0, $s0, 1
j for1
finefor1:
lw $s0, 4($sp)
lw $fp, 8($sp)
addi $sp, $sp, 8
move $v0, $a1
jr $ra