Pregunta de salto de ensamblaje (compensaciones de PC) - MSP430

0

Sigo intentando entender la arquitectura básica de la computadora y he estado escribiendo un poco de ensamblaje para el MSP430 (LED básico / Interruptores).

He estado explorando el conjunto de instrucciones, y las cosas están empezando a tener más sentido.

Sin embargo, por ejemplo, un JNE / JNZ (Saltar si no es igual / Saltar no es cero). Entiendo que estos están verificando los bits de estado (que quizás se configuraron desde una función CMP).

Sin embargo, la operación se ve así (tomada del conjunto de instrucciones):

if Z = 0: PC + 2*offset -> PC
if Z = 1: execute following instruction

Entonces, si Z es 0, vaya a la siguiente instrucción ... tiene sentido. Pero no entiendo la compensación PC + 2 * - > PC, creo que tal vez estoy confundido en la PC misma. La guía del usuario no entra en un GRAN detalle al respecto. ¿El PC presumiblemente apunta a la siguiente instrucción a ejecutar?

Cuando dice que apunta a que estoy adivinando, ¿qué es lo que sigue? (¿Es posible que tenga un MOV #020h,R9 o algo así? Que se convertiría en un bit de código binario op + de origen y destino (es decir, un total de 16 bits) (podría estar equivocado aquí)

Sin embargo, no entiendo la parte compensada de PC + 2 *, ¿compensación de qué? Creo que esa es la parte que me atrae. Pero creo que todo el "proceso" de lo que está sucediendo sigue siendo confuso, entiendo QUÉ se está escribiendo y dónde, pero tal vez no "cómo". (estoy llegando allí sin embargo!)

Edit: Creo que quizás también estoy olvidando que algo como MOV @ 020h, R9 es en realidad 3 palabras separadas de 16 bits (creo ... que serían 3 recuentos de PC diferentes) (ya que los registros son de 16 bits) ).

Edit2: aquí hay un ejemplo del libro MSP430: (tenga en cuenta que entiendo "qué" está haciendo, pero no por qué? y no entiendo la parte de compensación

DelayLoop: ; 
inc.w R4 ; Increment loop counter 
cmp.w #DELAYLOOPS ,R4 ; Compare with maximum value 
jne DelayLoop ; Repeat loop if not equal 
    
pregunta msmith1114

3 respuestas

1

En la fuente del ensamblador, la instrucción JNE (llamada BNE - rama si no es igual en algunos conjuntos de instrucciones) incluirá el destino del Salto, generalmente como una etiqueta.

Si la comparación antes de que JNE fuera igual, se ejecutará la instrucción que sigue inmediatamente a JNE. Si no era Igual, la distancia (offet) a la etiqueta de destino se agregará al contador del programa, por lo que se omitirá el código que sigue a la instrucción JNE y la ejecución del programa continuará desde la dirección de destino de la instrucción.

Editar: En el ejemplo de código en la Edición 2 del OP, DelayLoop es el destino del salto en la instrucción JNE, por lo que el desplazamiento es la diferencia entre la dirección de la etiqueta DelayLoop y la dirección que sigue a la instrucción Delayloop de JNE; en este caso, el desplazamiento se restará de la PC, en lugar de agregarse a él, ya que queremos saltar y ejecutar ese bucle varias veces, hasta que el resultado de cmp.w #DELAYLOOPS, R4 sea "igual". Cuando el resultado de la comparación sea igual, la ejecución del programa continuará con la instrucción que sigue al JNE.

No estoy familiarizado con la arquitectura MPS430, por lo que no puedo explicar el cálculo de "2 * Offset", pero debe tener algo que ver con la forma en que se aborda la memoria.

    
respondido por el Peter Bennett
1

Las instrucciones de salto en el MSP430 son saltos relativos . Eso significa que el código de operación para la instrucción de salto mantiene la distancia del objetivo desde la instrucción actual . Esta distancia se denomina "desplazamiento", y es el número de palabras para ajustar el punto de ejecución. Al multiplicar por 2, se obtiene el número de bytes (porque el procesador utiliza 16 bits, es decir, instrucciones de 2 bytes). Cuando el ensamblador ve JNE FOO, se da cuenta de qué tan lejos está la dirección llamada FOO de la instrucción de salto y fija esa distancia (medida en palabras) en la parte de desplazamiento del código de operación. Las instrucciones de salto para el MSP430 tienen 001 en los tres bits más altos, el código de condición para el salto en los tres bits siguientes y el desplazamiento en los diez bits restantes.

    
respondido por el Pete Becker
1

El registro de PC contiene la dirección de la siguiente instrucción que se va a buscar.

La mayoría de las instrucciones que tienen más de una palabra utilizan internamente el modo de direccionamiento indirecto de autoincremento para cargar uno o dos valores desde la dirección a la que apunta PC. Tu código se implementa así:

DelayLoop:
    add.w #1, R4       ; 0x5314  Increment loop counter
    cmp.w @PC+, R4     ; 0x9034  Compare with maximum value
    .word #DELAYLOOPS  ; 0xXXXX
    jne DelayLoop      ; 0x23FC  Repeat loop if not equal

Cuando el JNE se está ejecutando, el PC registra directamente después de la instrucción JNE. En este ejemplo, las instrucciones ocupan cuatro palabras en la memoria, por lo que para saltar al principio del bucle, se deben restar ocho bytes (cuatro palabras) de la PC, por lo que el desplazamiento es -4 . Este desplazamiento se codifica en los 10 bits más bajos de la palabra de instrucción JNE.

    
respondido por el CL.

Lea otras preguntas en las etiquetas