¿Por qué en 8085, durante las instrucciones LHLD
y SHLD
L se usa primero mientras que en BC
y DE
, B y D se usan respectivamente?
¿Por qué en 8085, durante las instrucciones LHLD
y SHLD
L se usa primero mientras que en BC
y DE
, B y D se usan respectivamente?
El 8085 tiene siete registros internos de 8 bits para datos, llamados A, B, C, D, E, H y L. Seis de estos registros también se pueden usar en pares para contener cantidades de 16 bits. Estos pares son BC, DE y HL, donde B, D y H mantienen el MSB del valor y C, E y L mantienen el LSB, respectivamente.
Cuando estos pares de registros se transfieren a / desde la memoria, el LSB siempre se almacena en la dirección inferior y el MSB en la superior. Las instrucciones SHLD
y LHLD
pueden usarse para transferir el par HL a / desde una dirección arbitraria, mientras que las instrucciones PUSH
y POP
pueden transferir cualquiera de los tres pares a / desde la pila.
Espero que esto responda a tu pregunta. No estoy seguro de lo que quiere decir cuando dice que L "se usa primero".
En el 8085, es probable que no haya ninguna ventaja en particular para que las operaciones de 16 bits actúen en el byte bajo antes del byte alto, aunque la operación que actúa sobre la dirección inferior precede a la que actúa sobre la dirección superior puede permitir que la dirección del segundo byte se calcule mientras se procesa el primer byte. Sin embargo, en algunos otros procesadores como el 6502, existe una ventaja definitiva de tener los datos almacenados en LSB primero. Si uno realiza una instrucción como: "$ ABCD: LDA ($ 12), Y", Y tiene el valor $ A0, y las ubicaciones $ 12 y $ 13 tienen los valores $ 56 y $ 34, respectivamente, la secuencia de operaciones será:
$ABCD : $A1 -- Load opcode
$ABCE : $12 -- Load operand (pointer address)
$0012 : $56 Load LSB of target base address while adding 1 to pointer address
$0013 : $34 Load MSB of target address while adding Y register to LSB (yields $F6)
$34F6 : Data -- Load data while adding one to MSB
Tenga en cuenta que el resultado de agregar uno a la MSB de la dirección se ignora, pero la instrucción carga A de una dirección tomada al agregar un registro de 8 bits a un par de bytes en la memoria, en cinco ciclos, que es el Lo menos que podría tomar. Tenga en cuenta también que el procesador siempre debe conocer un ciclo por adelantado de donde provendrán las mitades superior e inferior de la siguiente dirección. Si el registro Y hubiera mantenido $ B0 en lugar de $ A0, la secuencia habría sido:
$ABCD : $A1 -- Load opcode
$ABCE : $12 -- Load operand
$0012 : $56 Load LSB of target base address while adding 1 to pointer address
$0013 : $34 Load MSB of target address while adding Y register to LSB (yields $06)
$3406 : Data -- Load data while adding one to MSB
$3506 : Data -- Load data
En este caso, la mitad superior de la dirección correcta ($ 3506) no será el valor obtenido de la memoria, sino que se basará en datos que no están disponibles antes de la lectura de $ 0013. Además, la lógica de la interfaz de bus necesita saber qué se supone que debe hacer antes de saber si agregar o no el registro Y al LSB de destino dará lugar a un acarreo. En consecuencia, el sistema realizará una lectura de la dirección formada tomando el LSB recién calculado y el MSB recién recuperado, sin tener en cuenta si la dirección es correcta. Luego, durante la lectura, descubrirá que la dirección era incorrecta y repita la lectura con una dirección ajustada MSB.
El hecho de que el 6502 utilice el primer direccionamiento de LSB significa que aunque se requerirán seis ciclos en la situación en la que el cálculo de la dirección de LSB produce un acarreo, solo se necesitarán cinco en los casos en que no. Si el código y los datos se organizan para evitar la indexación a través de los límites de la página, será posible guardar un ciclo en la mayoría de los casos. Si las direcciones se almacenaran primero en MSB, siempre se requeriría un ciclo adicional. Incidentalmente, al realizar una "STA" en lugar de "LDA", el procesador siempre hará una lectura de la primera dirección computada (que puede ser o no correcta) e ignorará el resultado, y lo seguirá con una escritura de la garantía -dirección correcta. Durante esa lectura, el procesador utilizará la ALU para agregar 1 a la MSB de la dirección ya sea que haya o no un carry del LSB [en lugar de agregar 0 o 1, según el carry]. Hay un patrón de bits que parece que debería representar el código de operación "STX ($ 12), Y", pero su significado no está definido. Lo que realmente hace ese patrón de bits es almacenar el valor de X, ANDed con el MSB de la dirección más 1, en una dirección que sea correcta (si no hubo transferencia desde el LSB), o tiene su MSB igual al AND de La dirección correcta y el contenido del registro X. Esencialmente, tanto X como la ALU están sincronizadas en el mismo bus, y ese valor en ese bus guarda los datos a almacenar y, a veces, también la dirección MSB.
Lea otras preguntas en las etiquetas 8085