El modo Armar y el modo Pulgar hacen que el bit de la PC sea 0

Los modos ARM y Thumb están alineados con palabras y medias palabras. Entiendo que esto significa que si está en modo ARM, el inicio de las direcciones debe ser divisible por 32, y si está en modo Thumb, tiene que ser divisible por 16. Pero, ¿cómo se relaciona esto con el bit 0 de la PC que nunca se usa para nada? (El instructor dijo que por eso usaron el bit 0 de la PC para mostrar si está en modo pulgar o ARM ya que no se estaba usando para nada más, pero antes de eso estoy confundido acerca de la relación entre la alineación y el bit 0 de la PC)

Es una confusión común que el bit 0 de la PC almacene el estado del pulgar. De hecho, no es así, eso está en el bit T del CPSR. Lo cierto es que ese bit 0 de la dirección de destino de los vectores y ciertas ramas determina el modo a utilizar al llegar al destino, pero ese bit se enmascara antes de cargarlo en el PC.

Respuestas (2)

La bxinstrucción copia el bit 0 al Tbit de estado, por lo que selecciona entre el modo ARM y Thumb en la bifurcación.

Entonces, para saltar al código ARM en la dirección 0:

mov r0, 0
bx r0

Para saltar al código de pulgar en la dirección 0:

mov r0, 1
bx r0

Para saltar al código de pulgar en la dirección 2:

mov r0, 3
bx r0

El código ARM no puede existir en la dirección 2 porque violaría la restricción de alineación. Ni el código ARM ni el Thumb pueden comenzar en direcciones impares, por lo que el LSB de la dirección siempre es cero y el bit se reutiliza para seleccionar el nuevo modo en la bxinstrucción.

Para permitir un regreso fácil de las subrutinas, el bit 0 del lrregistro refleja el estado del pulgar antes de la llamada de función después de una blxinstrucción. Entonces:

    mov r0, #2f
    blx r0
1:
    b 1b

    .thumb
2:
    bx lr

cargará la dirección de la 2etiqueta con el bit 0 establecido (ya que la etiqueta se refiere al código Thumb) en r0, luego blxcargará la dirección de la letiqueta con el bit 0 en blanco (porque se refiere al código ARM) lry salta a la bx lrinstrucción, que utiliza lrpara volver al bucle sin fin en modo ARM.

¡Gracias! Estoy confundido por sus primeros tres ejemplos de saltar a la dirección 0-2. ¿Te importa repasar eso con más detalle? ¿Por qué tendría que empezar desde la dirección 0? En lugar de dirección 0 + 2?
Carga movla dirección y los bxsaltos, utilizando los 31 bits superiores para la PC y el bit inferior como el nuevo estado del pulgar, por lo que la dirección es una más grande que la dirección de destino real si también cambia al modo Pulgar.
Lo siento por no estar claro. Quise decir que estoy confundido sobre por qué la dirección tiene que comenzar en la dirección 0. ¿No podría comenzar en la dirección 4 y satisfacer la alineación ARM y del pulgar?
Claro, cualquier dirección divisible por 4 satisface ambos requisitos de alineación, por lo que también puede tener un código de pulgar allí.
Ah, ahora veo, entonces la razón por la cual el LSB siempre es 0 porque cambiarlo a 1 resultaría en un número impar.
En efecto. El tratamiento especial para el modo Thumb está solo en las blxinstrucciones (y ldr pc, ...en ldm {..., pc}, ...la mayoría, pero no en todos los núcleos que tienen compatibilidad con Thumb).

Entiendo que esto significa que si está en modo ARM, el inicio de las direcciones debe ser divisible por 32, y si está en modo Thumb, debe ser divisible por 16.

No; esto significa que en el modo ARM, las instrucciones deben comenzar en una dirección divisible por 4 o divisible por 2 en el modo Thumb.

Los números que son divisibles por 4 también son divisibles por 2.

Los números que son divisibles por 2 son pares; siempre tienen su bit bajo (bit 0) establecido en 0.

¡Gracias por la corrección! Aunque todavía estoy confundido sobre por qué el LSB está configurado en 0
Sí, esto realmente debería ser un comentario. No está respondiendo la pregunta, simplemente señala un error simple en el cuerpo de la pregunta (bits y bytes confusos)
@pipe Al OP le faltaba la conexión entre los números pares y un LSB cero. Ese es el enlace que estaba tratando de dibujar en mi respuesta.