Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    97

    [Assembler] Allocazione dinamica array

    Ciao ho un grosso problema non riesco a utilizzare lo stack pointer.
    dovrei creare un array di 15 elementi e tramite una funzione riempirlo
    ad esempio la funzione mi dice che A[i]= 3+7+i

    Il mio problema sta nel fatto che non so scrivere questa procedura utilizzando lo stack pointer..
    qualcuno è in grado di aiutarmi per piacere? è urgente mercoledì ho l'esame
    ps-uso mips

  2. #2
    per 15 "elementi" intendi 15 word?

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    97
    si si
    io di solito uso utilizzare space quindi siccome sono interi scriverò
    array: .space 60

  4. #4
    Mips che io sappia non ha le funzionbi push e pop.
    A te interessa solo la push (visto che si chiede di riempire lo stack).
    Per effettuare le operazioni di Push nello stack viene utilizzata l'istruzione sw(store-word).

    Ti ricordo che lo stack cresce a partire da indirizzi di memoria alti verso indirizzi di memoria bassi, quindi quando vengono inseriti dei dati nello stack il valore dello stack pointer diminuisce.

    codice:
    addi $sp, $sp, -60   #Diminuisco il valore dello stack pointer di 60, perché  60/4=15 word 
    sw $t0, 56($sp)      #Carico il valore di $t0 nell'indirizzo $sp+56
    ...
    dove $t0, $t1.... sono i valori che vuoi caricare e ad ogni istruzione diminuisci di 4 l'indirizzo dello stack pointer


    Io farei così

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    97
    ho capito quello che dici tu però non riesco ancora a risolvere il problema ad esempio ho questa traccia:

    devo allocare in area stack un array di 15 interi.
    poi richiamo una funzione array_init fornendole come parametri il puntatore dell'array, m ed
    n.
    la funzione inizializza ogni elemento A[i] dell'array al valore m*4+n*3+i

    io ho fatto così:


    array_init:
    move $s0,$a0 # $s0 c'e' la testa del vettore
    move $t6,$t0 # questo è m
    move $t7,$t1 # questo è n
    li $t1,0 # i=0
    li $t4,0

    #qui faccio l'operazione di moltiplicazione e addizione
    loop2: mul $a1,$t6,4
    mul $a2,$t7,3
    add $a3,$a1,$a2
    add $a3,$a3,$t1 # $a3 c'è il risultato

    add $t5,$s0,$t4

    sw $a3,($t5) #scrivo il risultato contenuto in $a3 nella posizione $t5(che sarebbe quella di partenza)

    addi $t1,$t1,1
    addi $t4,$t4,4

    blt $t1,15,loop2

    jr $ra


    Glie l'ho fatta vedere al prof ma mi ha detto testuali parole:

    devo mettere tutto il vettore sullo stack,Per usare le variabili sullo stack, elimina la dichiarazione globale del vettore che hai usato finora.
    puoi utilizzare:

    addi $sp, $sp, -VALORE


    dove VALORE è il numero di byte che vuoi riservare. Spostando in giù lo stack pointer, lasci libero dello spazio utilizzabile. Se ora ti sposti il valore dello stack pointer in un registro:

    move $t0, $sp

    hai un puntatore a quest'area dello stack che puoi passare in giro. Segui la logica dello stack: passa un riferimento a dati che si trovano sullo stack solo finchè il frame della funzione in cui allochi è attivo.


    Mi potresti dare una mano perfavore è urgente visto che domani ho l'esame...grazie mille in anticipo

  6. #6
    sinceramente è passato un bel po' di tempo da quell'esame la (10 anni) e non lo avevo fatto su Mips.

    Sinceramente non so dirti molto di più e visto che si tratta di un esame non voglio correre il rischio di farti sbagliare

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    97
    grazie lo stesso per l'aiuto

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 © 2024 vBulletin Solutions, Inc. All rights reserved.