2011-03-09 30 views
5

Me gustaría preguntar sobre el acceso a la memoria. Cuando ejecuto un comando load word, ¿qué restricciones de memoria existen? ¿Cuál es el número más grande que puedo usar como desplazamiento o registro base?MIPS restricciones de memoria?

Los registros son de 32 bits y, por lo que sé, el "inmediato" es de 16 bits. Por lo tanto, estoy bastante seguro de que no puedo hacer algo como

array: .word 0:20000 
~ 

la  $s0, array 
lw  $s1, 15000($s0) 
... 

Así que si quiero acceder al 15000, puede ser que necesite la algo más pequeño e ir de allí ¿verdad? Pero, ¿cuál es el valor más pequeño al que necesito acceder para estar bien y por qué?

Respuesta

2

El campo inmediato en lw es de 16 bits, sí; y está firmado complemento de dos, por lo que el posible rango de compensaciones inmediatas es -32768..32767 - por lo que lw $s1, 15000($s0) debería estar bien.

Tenga en cuenta que la no es una instrucción MIPS real. Por el contrario, le indica al ensamblador que genere la secuencia de instrucción más óptima de modo que el valor inmediato que haya especificado se coloque en el registro especificado. Por lo tanto, el rango completo de valores de 32 bits puede establecerse usando la, pero generalmente se puede producir un código más óptimo usando la una vez para colocar un valor adecuado en algún registro de modo que varias instrucciones subsiguientes puedan usar compensaciones inmediatas de ese valor que usando la cada vez que se necesita un valor inmediato.

Así, suponiendo que necesita para cargar los valores de los desplazamientos 40000 y 50000 de la matriz, es posible hacer:

array: .word 0:20000 
~ 
la  $s0, array   # get address of array 
la  $s1, 40000   # get offset into a register 
add $s0, $s0, $s1  # add offset to address, i.e. calculate (array+40000) 
lw  $s1, 0($s0)   # fetch data from (array+40000) 
lw  $s2, 10000($s0)  # fetch data from (array+40000+10000) 
+0

Así que si me gustaría tener acceso a un valor con un desplazamiento mayor que 32.767, entonces se lo necesita a 'la' en 32767 y usar otra compensación? Porque en mi ejemplo uso un valor adecuado (la primera palabra de la matriz) pero en el caso digo que tengo que usar otra 'la' o hay otra forma? – Elias

+0

Si desea acceder a un valor con un desplazamiento que no cabe en el campo de compensación inmediata, sí, tendrá que obtener ese desplazamiento en un registro y agregarlo a la dirección usted mismo. 'la' le dará la forma más óptima de obtener un valor arbitrario inmediato en un registro. Si está haciendo esto de forma aislada, simplemente use 'la' para el desplazamiento que desee, y' 0' en el campo de desplazamiento 'lw'. Si está accediendo a varias cosas que están cerca, realice la 'la' y la suma una vez, luego use las compensaciones inmediatas apropiadas para los accesos. – moonshadow