es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encuentra el valor máximo y agrégalo al Array utilizando una estructura de montículos.

Tengo un problema con mi código porque dice:
Excepción en tiempo de ejecución en 0x00400084: dirección fuera de rango 0x00000050 y trato de depurar y mirar mi código de nuevo, pero no sé dónde está el error.
Mi código compara cada par de elementos de 2 arreglos y agrega el más grande al nuevo arreglo.
También se requiere usar heap en este código.
El problema ocurre en la línea

l.d $f0, ($a0) #cargar doble desde Arr1

““““““““““““““““““““““““““““““““`
.eqv ALLOC_MEM 9

.data
Arr1: .double 3.2, 8.6, 9.1, 15.2, -3.8, 21.8
Arr1Sz: .space 64
Arr1Count: .space 6

Arr2: .double -3.5, 6.2, 18.0, 7.3, -5.2, 35.6
Arr2Sz: .space 64
Arr2Count: .space 6

MaxArr: .space 64
MaxSz: .space 64
MaxCount: .space 6
.text
main:
#Array 1
#Calcular el tamaño del arreglo en bytes
la $a0, Arr1
la $t1, Arr1Sz
sub $t2, $t1, $a0
sw $t2, Arr1Sz #tamaño en bytes
#Calcular la cantidad de elementos
div $t1, $t2, 8
sw $t1, Arr1Count #número de elementos

#Array 2
#Calcular el tamaño del arreglo en bytes 
la $a1, Arr2
la $t3, Arr2Sz
sub $t4, $t3, $a1
sw $t4, Arr2Sz #tamaño en bytes
#Calcular la cantidad de elementos
div $t3, $t4, 8
sw $t3, Arr1Count #número de elementos

#Copiar el arreglo al heap
li $v0, ALLOC_MEM
li $a0, 64
syscall
li $t0, 0 #contador de bucle

jal MaxArray

move $a2, $v0 #dirección del arreglo máximo
move $a3, $t0 #Número de elemento

jal PrintArray

MaxArray:
Loop:
beq $t0,$t1,Continue
l.d $f0, ($a0) #cargar doble desde Arr1
l.d $f2, ($a1) #cargar doble desde Arr2
c.eq.s $f0, $f2
bc1f else
s.d $f2, ($v0)
j increase
else:
s.d $f0, ($v0)
increase:
#aumentar índice del arreglo
addi $a0, $a0, 8
addi $a1, $a1, 8
#aumentar dirección del heap
addi $v0, $v0, 8
#aumentar contador
addi $t0, $t0, 1
b Loop
Continue:
jr $ra
PrintArray:
li $t5, 0 #contador de bucle para imprimir el arreglo
PrintLoop:
bge $t5, $a3, exit
l.d $f2, 0($a2)
addi $a2, $a2, 8
#imprimir doble
li $v0, 3
mov.d $f12, $f2
#incrementar contador
addi $t0, $t0, 1
j PrintLoop
exit:
li $v0, 10
syscall

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que hay un error de dirección fuera de rango en la dirección 0x00400084. Esto significa que el programa está tratando de acceder a una dirección de memoria que no está asignada o que está fuera del rango asignado.

    Al observar el código, la línea que está causando el problema es:

    l.d $f0, ($a0) #carga double desde Arr1

    Esta línea intenta cargar un double desde la ubicación de memoria apuntada por el registro $a0. El problema podría ser que $a0 no esté apuntando a una ubicación de memoria válida.

    Tras inspeccionar más a fondo el código, parece que el problema se encuentra en la asignación de memoria para el array MaxArr. El código asigna 64 bytes de memoria, pero no se conoce de antemano el número de elementos en este array. Esto significa que el programa puede estar tratando de acceder a memoria que no está dentro del rango asignado.

    Para solucionar el problema, el programa debería asignar la cantidad exacta de memoria necesaria para el array MaxArr en función del número de elementos que se copiarán en él. Además, antes de acceder a cualquier ubicación de memoria, el programa debería asegurarse de que la memoria se haya asignado correctamente y de que los punteros estén apuntando a ubicaciones de memoria válidas.

Comments are closed.