Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Assembly MIPS] problemi con RdA e passaggio parametri

    Ciao a tutti sto studiando l'assembly del MIPS per un esame ma ho ancora un po' di confusione riguardo in particolare alla creazione del record di attivazione per allocare lo spazio corretto sulla memoria organizzata tipo stack e al passaggio dei parametri a una procedura. Qualcuno può aiutarmi?

    In particolare quando scrivo un programma non ottengo spesso il risultato dalla funzione, per esempio facendo l'equivalente malloc per allocare dinamicamente lo spazio per un vettore che viene caricato in una procedura richiamata questo mi restituisce un vettore non caricato ma solo con 0!

    Avrei il codice del programma ma non so se posso postarlo...
    Sarò enormemente grata a chiunque mi dia una mano perché ho l'esame tra pochi giorni!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    DEVI postare il codice per avere un chiarimento ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.