Chicos bien, básicamente el problema que estoy teniendo es este.

Me han asignado para escribir un programa MIPS que almacena una estructura dinámicamente.

Básicamente, se almacena un IDENTIFICADOR, un Año, un Título y una Descripción
Es para ser almacenado mediante un árbol de búsqueda binario.

Si alguna vez has codificado de una pila en C++ sabes de qué estoy hablando.
He éxito almacena el ID y Títulos en la memoria de manera dinámica,
pero estoy teniendo problemas para almacenar el introducido por el usuario en cadenas.

Esta es una cuestión compleja y no hay una gran cantidad de información que he
sido capaz de encontrar en línea atrezzo así que si usted me puede ayudar con esto 🙂

Aquí está mi memoria de configuración:

$s5 – Tiendas Nodo Raíz

$s7 – Almacena el Tamaño del Árbol (No es Necesario)

Cada Nuevo Elemento Contiene un bloque de 344 bytes

Los bytes de configuración tales como:

8 Bytes – [ID]

8 Bytes – [Año]

64 Bytes – [Título]

256 Bytes – [Descripción]

8 Bytes – [LastNodeAddress]

8 Bytes – [NextNodeAddress]

Aquí está el código y usted puede ver el problema:

li $v0, 9           #allocate memory for new record
li $a0, 344         #enough memory for 2 addresses and all the data
syscall


move $s0, $v0           #hang onto the initial address of all our info

li $v0, 4           #prompt for ID
la $a0, addid
syscall

li $v0, 5           #enter integer
syscall

sw $v0, 0($s0)          #store our ID into memory   Offset: 0

li $v0, 4           #prompt for add year
la $a0, addyear
syscall

li $v0, 5           #enter integer
syscall

sw $v0, 4($s0)          #store year into our memory Offset: 4

li $v0, 4           #prompt for add title
la $a0, addtitle
syscall

li $v0, 8           #read title into titlebuffer
la $a0, titlebuffer
li $a1, 64
syscall

sw $a0, 8($s0)          #store title into our memory    Offset: 8

li $v0, 4           #prompt for add description
la $a0, adddescription
syscall

li $v0, 8           #read from input into descriptionbuffer
la $a0, descriptionbuffer
li $a1, 256
syscall

sw $a0, 72($s0)         #store description into our memory  Offset: 72

bne $s7, 0, setlocations    #if this isn't root node let's set the locations

add $s7, $s7, 1         #add 1 to the size of the records

move $s5, $s0           #store this address as root node for now

El problema es que todo lo que se almacena es la dirección de los búferes.
Los buffers son definidos en mi sección de datos como este:

.data
titlebuffer: .space 64
descriptionbuffer: .space 256

Lo que es sólo las direcciones almacenadas en la memoria asignada,
y no tengo idea de cómo almacenar cadenas de caracteres en memoria asignada.

Cualquier ayuda sería muy apreciada! 🙂

  • He descubierto la solución!!!!!!!! Aquí está :D:D:D:D:D Mi maestro mostró cómo se hace, no puedo creer que me perdí x.x en Lugar de la $a0, descriptionbuffer en Lugar de la $a0, titlebuffer USO: la $a0, 8($s0) la $a0, 72($s0) para imprimir puedes hacer lo mismo! 🙂 Espero que esto ayude a alguien
InformationsquelleAutor user1274820 | 2012-03-30

1 Comentario

  1. 4

    No te molestes en la definición de su memoria en el inicio de su programa, como he mostrado en la pregunta original.

    Lugar, asignar y leer los valores en los desplazamientos correctos de su memoria dinámica.

    Lugar de la $a0, descriptionbuffer

    Lugar de la $a0, titlebuffer

    Uso:

    la $a0, 8($s0)

    la $a0, 72($s0)

    Aquí puedo mover la dirección de memoria en $s0 utilizando move $s0, $v0 y leer los valores en los desplazamientos correctos.

    para imprimir puedes hacer lo mismo!

    Aquí está el código de trabajo:

    li $v0, 9           #allocate memory for new record
    li $a0, 344         #enough memory for 2 addresses and all the data
    syscall
    
    move $s0, $v0           #hang onto the initial address of all our info
    
    li $v0, 8           #read our title into the allocated space
    la $a0, 8($s0)          #Offset: 8
    li $a1, 64
    syscall
    
    li $v0, 8           #read our description into the allocated space
    la $a0, 72($s0)         #Offset: 72
    li $a1, 256
    syscall 
    

    Además, usted puede encontrar la solución final aquí: https://stackoverflow.com/a/9953839/1274820

    Edit: Bueno, después de 10k puntos de vista, he decidido añadir más info aquí, así que usted no tiene que buscar a través de código posterior 😉

    Aquí el código completo de la tienda 4 diferentes piezas de datos en la memoria:

    li $v0, 9           #allocate memory for new record
    li $a0, 344         #[334 = how much memory - in bytes]
    syscall
    
    move $s0, $v0       #store the address of our allocated memory in $s0
    
    li $v0, 5           #enter integer
    syscall
    sw $v0, 0($s0)      #store our ID into memory   Offset: 0
    
    li $v0, 5           #enter integer
    syscall
    sw $v0, 4($s0)      #store year into our memory Offset: 4
    
    li $v0, 8           #read our title into the allocated space
    la $a0, 8($s0)      #Offset: 8
    li $a1, 64
    syscall
    
    li $v0, 8           #read our description into the allocated space
    la $a0, 72($s0)     #Offset: 72
    li $a1, 256
    syscall 
    

    Que se va a almacenar el ID, Año, Título y Descripción – el desplazamiento es donde vamos a colocar los datos en la memoria dinámica.

    Imagínate que tengo un bloque de 334 bytes (como la anterior):

    [ 334 ]

    Almacenamos la ID un entero (4 bytes de datos) en el offset 0 como este:

    [(ID) 330 ]

    Entonces, guardamos el año próximo a la misma (en offset 4).

    [(ID)(YR) 326 ]

    Y así sucesivamente …

    Para imprimir, hazlo así:

    li $v0, 1           #Print the ID stored at $s0     [Offset: 0]
    lw $a0, 0($s0)
    syscall
    li $v0, 1           #Print the Year stored at $s0   [Offset: 4]
    lw $a0, 4($s0)
    syscall
    li $v0, 4           #Print the Title stored at $s0  [Offset: 8]
    la $a0, 8($s0)
    syscall
    li $v0, 4           #Print descript stored at $s0   [Offset: 72]
    la $a0, 72($s0)
    syscall
    

Dejar respuesta

Please enter your comment!
Please enter your name here