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)
La bx
instrucción copia el bit 0 al T
bit 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 bx
instrucción.
Para permitir un regreso fácil de las subrutinas, el bit 0 del lr
registro refleja el estado del pulgar antes de la llamada de función después de una blx
instrucción. Entonces:
mov r0, #2f
blx r0
1:
b 1b
.thumb
2:
bx lr
cargará la dirección de la 2
etiqueta con el bit 0 establecido (ya que la etiqueta se refiere al código Thumb) en r0
, luego blx
cargará la dirección de la l
etiqueta con el bit 0 en blanco (porque se refiere al código ARM) lr
y salta a la bx lr
instrucción, que utiliza lr
para volver al bucle sin fin en modo ARM.
mov
la dirección y los bx
saltos, 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.blx
instrucciones (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.
chris stratton