Pregunta

Tengo una pregunta de la tarea.

tengo un BNE instrucción en 0x88888888, y necesito decir cuál es el rango de salto legal.

Mi teoría es que la compensación me dice que puedo ir:

  • De 0x8888888 - 4 * 215
  • A 0x88888888 + 4 * (215-1)

Realmente no entiendo por qué y cómo funciona esto, ¿alguien puede explicarlo?

¿Fue útil?

Solución

Busque una referencia de instrucciones que muestre la codificación de instrucciones, como http://en.wikipedia.org/wiki/MIPS_architecture

000100ss sssttttt CCCCCCCC CCCCCCCC

syt contienen los registros que se están comparando, 5 bits, da el registro 0 - 31 cada uno.los 16 bits inferiores son el desplazamiento en unidades de instrucciones.

(para mips) desde la perspectiva de los programadores, se supone que el contador del programa tiene 1 instrucción por delante, 4 bytes.Entonces, para la dirección 0x88888888, haga sus cálculos con la dirección 0x88888888+4 = 0x8888888C.

La codificación de instrucciones utiliza complemento a dos, por lo que su rama directa máxima son instrucciones 0x7FFF, que son 0x7FFF<<2 = 0x1FFFC bytes.La rama hacia atrás máxima es 0x8000 cuando el signo extendido es instrucciones 0xFFFF8000, en bytes es 0xFFFF8000<<2 = 0xFFFE000

0x8888888C + 0x0001FFC = 0x888A8888
0x8888888C + 0xFFFE000 = 0x88868888

El ajuste del contador del programa es bastante sencillo de entender a partir de un desmontaje del código de trabajo generado por un ensamblador en funcionamiento.(más la referencia de instrucciones al menos suficiente para ver la cantidad de bits que tienes que usar).

00002030 <back>:
    2034:
    2038:   1443fffd    bne v0,v1,2030 <back>
    203c:   00000000    nop
    2040:   1443fffb    bne v0,v1,2030 <back>
    2044:   00000000    nop
    2048:   1443fff9    bne v0,v1,2030 <back>
    204c:   00000000    nop
    2050:   14430003    bne v0,v1,2060 <fore>
    2054:   00000000    nop
    2058:   14430001    bne v0,v1,2060 <fore>
    205c:   00000000    nop

00002060 <fore>:

0x1443FFFD y 0x1443FFFB están separados por 8 bytes y por dos instrucciones.La diferencia entre las compensaciones en la instrucción es un recuento de 2, lo que implica que la codificación está en unidades de instrucciones/palabras, no en bytes ni medias palabras.La referencia directa es más fácil de hacer primero 0x2060 - 0x2050 es 0x10 bytes, que son 4 instrucciones.el desplazamiento es de 3 instrucciones, 0x2060 menos 3 instrucciones es 0x2054 la siguiente instrucción después de la que realiza el bne (tiene mucho sentido, canalizada o no, la computadora generalmente está al menos en la siguiente instrucción cuando llega a ejecutar, y cuando ejecutas matemáticas con la PC, la PC ya lo hizo, avanza).Esto se puede comprobar con las otras tres ramas.0x2058 dice bifurcar un cabezal de instrucción si no es igual, lo que implica que la computadora está 0x205C, uno por delante.0xFFFD, invierte y suma 1 = 2+1 = 3, por lo que para retroceder tres y llegar a 0x2030 debes estar en 0x203C, uno por delante de la instrucción codificada.0xFFFB 4+1 = 5, 5 instrucciones atrás, lo que significa que comienza en 0x2044, la instrucción después de la rama codificada con un 0xFFFB.

Otros conjuntos de instrucciones no son tan simples.El armado es bastante simple, tanto en el modo de brazo como en el de pulgar se asumen dos instrucciones por delante de la dirección que contiene el comienzo de la instrucción, por lo que en el modo de pulgar 4 bytes, en el modo de armado 8 bytes.Incluso el pulgar2, que son principalmente instrucciones de 32 bits, el contador de programa desde la perspectiva del programador tiene 2 instrucciones por delante.

Conjuntos de instrucciones de longitud de palabra variable, que no son tan regulares como arm, mips, etc.O el hardware utiliza una regla fija como lo hace con thumb2 a pesar de que la dirección real está precargada.O hay que saber por el tamaño de la instrucción dónde estará el contador del programa y utilizar esa referencia.Tenga en cuenta que tal vez el primer corte en estos procesadores, el contador del programa estaba justo en una o dos instrucciones adelante cuando lo ejecutó, pero la canalización enterrada en muchos de ellos (arm, mips) la dirección de captación previa podría ser regular pero mucho más adelante, o cuando te vuelves superescalar con predicción de rama, las recuperaciones pueden estar en cualquier lugar, incluso tocando registros en el hardware (los buenos diseños de hardware no modifican nada en una simple lectura, solo escribe, no lees un valor ni autoincrementas un puntero de hardware, por ejemplo, al menos para hardware pci(e) que se puede utilizar en muchos procesadores).

Otros consejos

Esta referencia SPIM dice:

Las instrucciones de bifurcación utilizan un campo de desplazamiento de 16 bits firmado;por eso pueden saltar 215-1 instrucciones (no bytes) hacia adelante o 215 instrucciones al revés.

Dado que las instrucciones parecen tener siempre 4 bytes de ancho, su razonamiento parece correcto, pero ha intercambiado los signos.

La rama hacia atrás máxima (hacia una dirección inferior) es de 215-1 instrucciones, es decir32767 instrucciones o 131068 bytes, para que pueda alcanzar 0x88888888 - 131068 = 8886888c.

Asimismo, la rama directa máxima te lleva a 0x88888888 + 131072 = 0x888a8888.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top