Pregunta

Estoy trabajando en un simulador para el conjunto de instrucciones msp430. El ensamblador de GNU le permitirá codificar instrucciones como estas:

fc0a: 12 10 00 02 rrc &0x0200       
fc0e: 22 11       rra #4        
fc10: 23 52       add #4,#2

Supongo que rrc & amp; 0x0200 buscará desde la dirección 0x0200 realizar la rotación y luego escribir la respuesta en la dirección 0x0200, ¿correcto? Pero, ¿qué haría un rra # 4? La fuente sería un 4 inmediato, supongo, pero ¿hay un destino después de la operación? El add # 4, # 2 ensamblado en lo que cabría esperar (como 2b10, source = r2, ad = 1b0, dest = r3), el desensamblador binutils, aunque no sabía qué hacer con esa instrucción.

¿Son estas instrucciones válidas?

¿Fue útil?

Solución

Aunque no parece haber ninguna referencia en línea definitiva a este efecto, tiendo a estar de acuerdo con el OP de que las dos instrucciones mostradas (y varias otras) probablemente no sean válidas , aunque se ajustan al formato definido en las hojas de datos.

En otras palabras, no todas las combinaciones posibles de las diversas partes que forman una palabra de instrucción son válidas. En particular, muchas instrucciones de un solo operando que utilizan el modo de direccionamiento inmediato y muchas instrucciones de doble operando que tienen un modo de direccionamiento inmediato para el destino probablemente no sean semánticamente viables.

Solo hay algunas sugerencias al respecto en la documentación, por ejemplo, en la Guía del usuario, sección 3.3.7 (en el modo de direccionamiento inmediato), un comentario indica " Válido solo para un operando de origen . " (Y, por cierto, esto es para todos los casos de modo de direccionamiento inmediato, no solo para los casos abreviados permitidos por el truco de generación constante R2 o R3).

El hecho de que el desensamblador no sepa qué hacer con dichos códigos también es otra pista (aunque ... algunos desensambladores se disparan fácilmente ...).

En aras de la documentación, reuní a continuación algunas referencias útiles para el MSP430:

Otros consejos

En la guía del usuario actual, en la sección 3.4.4.2, recomienda no utilizar el modo inmediato (#N) en el campo de destino para el comando RRA, ya que da como resultado una operación de programa impredecible.

Es posible que lo sean. Mirando el conjunto de instrucciones en Wikipedia, los códigos de operación codifican el registro y varias opciones. Entonces no es un mapeo simple. Parece que la salida que tienes es little-endian, así que esto:

fc0a: 12 10 00 02 rrc &0x0200  

corresponde a la instrucción 1012, que en binario es 0001 0000 0001 0010.

Esto se desglosa de la siguiente manera:

6 bits: 0001 00 - fixed; defines the instruction family
3 bits: 00 0    - instruction (RRC)
1 bit : 0       - byte or word parameter (0 = 16 bit parameter; 1 = 8 bit)
2 bits: 01      - addressing mode (01 = indexed;)
4 bits: 0010    - register

Entonces, en este caso, se produce una rotación hacia la derecha en el valor en el desplazamiento en el registro 2 de la dirección & amp; 0200.

Tendrías que desglosar las otras instrucciones de manera similar para entenderlas completamente. Para la instrucción ADD, tanto los registros / direcciones de origen como los de destino están codificados en 5223 instrucción.

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