Tamaño: 8339
Comentario:
|
Tamaño: 8434
Comentario:
|
Los textos eliminados se marcan así. | Los textos añadidos se marcan así. |
Línea 1: | Línea 1: |
Línea 3: | Línea 2: |
Línea 15: | Línea 13: |
LDM||STM{cond} <modo direccion> <Rn>{!}, <Listado de Registros>{^} | LDM||STM{cond} <modo direccion> <Rn>{!}, <Listado de Registros>{^} |
Línea 17: | Línea 15: |
Línea 24: | Línea 21: |
* '''IA (Increment After)''' la primera posición de memoria a guardar o leer los datos es la indicada por Rn luego los registros posteriores se irán guardando en posiciones contiguas incrementadas de a 4 bytes, corresponde a P = 0 U = 1. * '''IB (Increment Before)''' la primera posición de memoria a guardar o leer los datos es la indicada por Rn + 4, los registros posteriores se irán guardando en posiciones contiguas incrementadas de a 4 bytes, corresponde a P = 1 U = 1. * '''DA (Decrement After)''' la última posición de memoria a guardar o leer los datos es la indicada por Rn luego los registros anteriores se irán guardando en posiciones contiguas decrementadas de a 4 bytes, corresponde a P = 0 U = 0. * '''DB (Decrement Before)''' la última posición de memoria a guardar o leer los datos es la indicada por Rn - 4, los registros anteriores se irán guardando en posiciones contiguas decrementadas de a 4 bytes, corresponde a P = 1 U = 0. |
* '''IA (Increment After)''' la primera posición de memoria a guardar o leer los datos es la indicada por Rn luego los registros posteriores se irán guardando en posiciones contiguas incrementadas de a 4 bytes, corresponde a P = 0 U = 1. * '''IB (Increment Before)''' la primera posición de memoria a guardar o leer los datos es la indicada por Rn + 4, los registros posteriores se irán guardando en posiciones contiguas incrementadas de a 4 bytes, corresponde a P = 1 U = 1. * '''DA (Decrement After)''' la última posición de memoria a guardar o leer los datos es la indicada por Rn luego los registros anteriores se irán guardando en posiciones contiguas decrementadas de a 4 bytes, corresponde a P = 0 U = 0. * '''DB (Decrement Before)''' la última posición de memoria a guardar o leer los datos es la indicada por Rn - 4, los registros anteriores se irán guardando en posiciones contiguas decrementadas de a 4 bytes, corresponde a P = 1 U = 0. |
Línea 34: | Línea 31: |
||31 ||30 ||29 ||28 ||27 ||26 ||25 ||24 ||23 ||22 ||21 ||20 ||19 ||18 ||17 ||16 ||15 ||14 ||13 ||12 ||11 ||10 ||09 ||08 ||07 ||06 ||05 ||04 ||03 ||02 ||01 ||00 || ||||||||<style="text-align: center;">cond ||1 ||0 ||0 ||P ||U ||S ||W ||L ||||||||<style="text-align: center;">Rn ||||||||||||||||||||||||||||||||<style="text-align: center;">Listado de Registros || |
|
Línea 36: | Línea 35: |
|| 31 || 30 || 29 || 28 || 27 || 26 || 25 || 24 || 23 || 22 || 21 || 20 || 19 || 18 || 17 || 16 || 15 || 14 || 13 || 12 || 11 || 10 || 09 || 08 || 07 || 06 || 05 || 04 || 03 || 02 || 01 || 00 || |||||||| cond || 1 || 0 || 0 || P || U || S || W || L |||||||| Rn |||||||||||||||||||||||||||||||| Listado de Registros || |
|
Línea 39: | Línea 36: |
'''Bit P''' * P = 0 Indica que el registro Rn está incluido en el rango de la memoria. * P = 1 Indica que el registro Rn no está incluido en el rango de memoria, en este caso los datos se tomarán a partir de la siguiente posición de memoria o de la anterior a Rn dependiendo de si se guardan o leen en forma ascendente o descendente. |
'''Bit P''' * P = 0 Indica que el registro Rn está incluido en el rango de la memoria. * P = 1 Indica que el registro Rn no está incluido en el rango de memoria, en este caso los datos se tomarán a partir de la siguiente posición de memoria o de la anterior a Rn dependiendo de si se guardan o leen en forma ascendente o descendente. |
Línea 44: | Línea 43: |
* U = 1 cada lectura o escritura de un registro se incrementa la posición de memoria, Rn en este caso indica la posición mas baja del bloque en donde se escriben o leen los datos (Si Rn es la posición mas baja o es la anterior a la mas baja depende del bit P). * U = 0 cada lectura o escritura de un registro se decrementa la posición de memoria, Rn en este caso indica la posición mas alta del bloque en donde se escriben o leen los datos (si Rn es la posición mas alta o es la posterior a la mas alta depende del bit P). |
* U = 1 cada lectura o escritura de un registro se incrementa la posición de memoria, Rn en este caso indica la posición mas baja del bloque en donde se escriben o leen los datos (Si Rn es la posición mas baja o es la anterior a la mas baja depende del bit P). * U = 0 cada lectura o escritura de un registro se decrementa la posición de memoria, Rn en este caso indica la posición mas alta del bloque en donde se escriben o leen los datos (si Rn es la posición mas alta o es la posterior a la mas alta depende del bit P). |
Línea 48: | Línea 48: |
* Instrucciones LDM con carga del PC, este bits indica que el CPSR es cargado desde SPSR, ''Nota'' cuando el procesador esta en modo usuario o sistema, este funcionamiento del LDM dará resultados impredecibles. * STM o LDM que no usan PC, indica que cuando el procesador está en modo privilegio, los registros correspondiente al modo usuario son transferidos en vez de los registros del modo en uso. |
* Instrucciones LDM con carga del PC, este bits indica que el CPSR es cargado desde SPSR, ''Nota'' cuando el procesador esta en modo usuario o sistema, este funcionamiento del LDM dará resultados impredecibles. * STM o LDM que no usan PC, indica que cuando el procesador está en modo privilegio, los registros correspondiente al modo usuario son transferidos en vez de los registros del modo en uso. |
Línea 59: | Línea 62: |
Las instrucciones de Carga y Almacenamiento son utilizadas mayormente en dos situaciones, para guardar o recuperar un bloque de datos o como instrucciones de manejo del stack. | . Las instrucciones de Carga y Almacenamiento son utilizadas mayormente en dos situaciones, para guardar o recuperar un bloque de datos o como instrucciones de manejo del stack. |
Línea 61: | Línea 64: |
En el primer caso, cuando guardamos y luego recuperamos un bloque de datos, lo hacemos de la misma forma, partiendo de una dirección para acceder a los datos en ambos casos. | En el primer caso, cuando guardamos y luego recuperamos un bloque de datos, lo hacemos de la misma forma, partiendo de una dirección para acceder a los datos en ambos casos. |
Línea 68: | Línea 71: |
* Full Stacks el puntero del stack indica la dirección del ultimo dato. * Empty Stack el puntero del stack indica la primera dirección libre. |
* Full Stacks el puntero del stack indica la dirección del ultimo dato. * Empty Stack el puntero del stack indica la primera dirección libre. |
Línea 72: | Línea 76: |
* Descending stack los datos son guardados en posiciones decrementadas 4 bytes con respecto a la anterior. * Ascending stack los datos son guardados en posiciones incrementadas 4 bytes con respecto a la anterior. |
* Descending stack los datos son guardados en posiciones decrementadas 4 bytes con respecto a la anterior. * Ascending stack los datos son guardados en posiciones incrementadas 4 bytes con respecto a la anterior. |
Línea 76: | Línea 81: |
* Full Descending, con la sintaxis FD. * Empty Descending, con la sintaxis ED. * Full Ascending, con la sintaxis FA. * Empty Ascending, con la sintaxis EA. |
* Full Descending, con la sintaxis FD. * Empty Descending, con la sintaxis ED. * Full Ascending, con la sintaxis FA. * Empty Ascending, con la sintaxis EA. |
Línea 82: | Línea 88: |
||||||<style="text-align: center;">Modo Stack ||||<style="text-align: center;">Modo Convencional || ||<|2>Modo||||<style="text-align: center;">Instrucciones ||||<style="text-align: center;">Instrucciones || ||Carga ||Almacenamiento ||Carga ||Almacenamiento || ||Full Ascending ||LDMFA ||STMFA ||LDMDA ||STMIB || ||Full Descending ||LDMFD ||STMFD ||LDMIA ||STMDB || ||Empty Ascending ||LDMEA ||STMEA ||LDMDB ||STMIA || ||Empty Descending ||LDMED ||STMED ||LDMIB ||STMDA || |
|
Línea 84: | Línea 97: |
|||||| Modo Stack |||| Modo Convencional || || Modo |||| Instrucciones |||| Instrucciones || || || Carga || Almacenamiento || Carga || Almacenamiento || || Full Ascending || LDMFA || STMFA || LDMDA || STMIB || || Full Descending || LDMFD || STMFD || LDMIA || STMDB || || Empty Ascending || LDMEA || STMEA || LDMDB || STMIA || || Empty Descending || LDMED || STMED || LDMIB || STMDA || |
|
Línea 99: | Línea 106: |
Línea 100: | Línea 108: |
STMFD R13!,{R1,R2} | STMFD R13!,{R1,R2} |
Línea 102: | Línea 110: |
||Estado antes de Guardar ||Estado luego de Guardar || ||<img alt="stm1.png" width = "36.28%" {{attachment:stm1.png||height="727px",width="665px"}} src="%ATTACHURL%/stack1_1814.png"> ||<img alt="stm2.png" width = "36.28%" src="%ATTACHURL%/stack2_1814.png"> || |
|
Línea 104: | Línea 114: |
|| Estado antes de Guardar || Estado luego de Guardar || || <img alt="stm1.png" width = "36.28%" src="%ATTACHURL%/stack1_1814.png"> || <img alt="stm2.png" width = "36.28%" src="%ATTACHURL%/stack2_1814.png">|| |
'''Instrucción para Leer''' |
Línea 107: | Línea 116: |
'''Instrucción para Leer''' | |
Línea 110: | Línea 118: |
}}} || Estado antes de Leer || Estado luego de Leer || || <img alt="ldm1.png" width = "32.20%" src="%ATTACHURL%/stack3_1610.png"> || <img alt="ldm2.png" width = "32.20%" src="%ATTACHURL%/stack4_1610.png">|| |
}}} ||Estado antes de Leer ||Estado luego de Leer || ||<img alt="ldm1.png" width = "32.20%" src="%ATTACHURL%/stack3_1610.png"> ||<img alt="ldm2.png" width = "32.20%" src="%ATTACHURL%/stack4_1610.png"> || |
Línea 116: | Línea 123: |
Instrucciones de Carga y Almacenamiento Múltiple
Estas instrucciones permiten:
Cargar múltiples registros de propósitos generales ( un subset o todos ellos) desde la memoria
Almacenar múltiples registros de propósitos generales ( un subset o todos ellos) en la memoria
Las direcciones desde donde se leen los registros o hacia donde se guardan serán siempre posiciones consecutivas, donde el menor registro se almacenará o leerá desde la posición mas baja, y el mayor número de registro lo hará con las posición mas alta.
La sintaxis de la instrucción será
LDM||STM{cond} <modo direccion> <Rn>{!}, <Listado de Registros>{^}
donde:
cond, indica la condición para ejecutar la instrucción.
modo direccion,indica de que forma se irán guardando o leyendo los registro desde o hacia la memoria, existen cuatro tipos distintos.
IA (Increment After) la primera posición de memoria a guardar o leer los datos es la indicada por Rn luego los registros posteriores se irán guardando en posiciones contiguas incrementadas de a 4 bytes, corresponde a P = 0 U = 1.
IB (Increment Before) la primera posición de memoria a guardar o leer los datos es la indicada por Rn + 4, los registros posteriores se irán guardando en posiciones contiguas incrementadas de a 4 bytes, corresponde a P = 1 U = 1.
DA (Decrement After) la última posición de memoria a guardar o leer los datos es la indicada por Rn luego los registros anteriores se irán guardando en posiciones contiguas decrementadas de a 4 bytes, corresponde a P = 0 U = 0.
DB (Decrement Before) la última posición de memoria a guardar o leer los datos es la indicada por Rn - 4, los registros anteriores se irán guardando en posiciones contiguas decrementadas de a 4 bytes, corresponde a P = 1 U = 0.
*!* indica si el registro base se actualizará una vez que se termine de guardar o leer todos los registro corresponde al bit W.
*^* corresponde al bit S, si se coloca en una instrucción STM o LDM que no usan PC, indica que los registros a cargar o leer son los correspondiente al modo usuario y no al modo actual, si se coloca en LDM que usan el PC, este modificador indica que el SPSR es guardado en el CPSR.
Listado de Registros Indica los registros a guardar o leer, es un listado de los nombres de los registros separados con coma.
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
cond |
1 |
0 |
0 |
P |
U |
S |
W |
L |
Rn |
Listado de Registros |
Bit P
- P = 0 Indica que el registro Rn está incluido en el rango de la memoria.
- P = 1 Indica que el registro Rn no está incluido en el rango de memoria, en este caso los datos se tomarán a partir de la siguiente posición de memoria o de la anterior a Rn dependiendo de si se guardan o leen en forma ascendente o descendente.
Bit U Indica el modo en que se toman las sucesivas posiciones de memoria
- U = 1 cada lectura o escritura de un registro se incrementa la posición de memoria, Rn en este caso indica la posición mas baja del bloque en donde se escriben o leen los datos (Si Rn es la posición mas baja o es la anterior a la mas baja depende del bit P).
- U = 0 cada lectura o escritura de un registro se decrementa la posición de memoria, Rn en este caso indica la posición mas alta del bloque en donde se escriben o leen los datos (si Rn es la posición mas alta o es la posterior a la mas alta depende del bit P).
Bit S Este bit tiene dos funciones:
- Instrucciones LDM con carga del PC, este bits indica que el CPSR es cargado desde SPSR,
Nota cuando el procesador esta en modo usuario o sistema, este funcionamiento del LDM dará resultados impredecibles.
- STM o LDM que no usan PC, indica que cuando el procesador está en modo privilegio, los registros correspondiente al modo usuario son transferidos en vez de los registros del modo en uso.
Bit W Indica si el registro base es actualizado o no después de transferirse los datos. En caso de actualizarse, el mismo se decrementará (U=0) o incrementará (U=1) cuatro veces la cantidad de registros utilizados.
Bit L L = 1 indica instrucción de carga (LDM), L = 0 instrucción de almacenamiento (STM)
Listado de Registros posee un bit para cada registro, por ejemplo el bit 15 corresponde al registro 15 (PC), un bit en 1 indica que el registro correspondiente sera cargado o almacenado desde memoria, la instrucción no está diseñada para tener todos los bits en 0 y dará resultados impredecibles para este caso.
Operaciones con el Stack
- Las instrucciones de Carga y Almacenamiento son utilizadas mayormente en dos situaciones, para guardar o recuperar un bloque de datos o como instrucciones de manejo del stack.
En el primer caso, cuando guardamos y luego recuperamos un bloque de datos, lo hacemos de la misma forma, partiendo de una dirección para acceder a los datos en ambos casos.
Cuando se usan para manejar el stack, la dirección que se toma para guardar los registro no será la misma que la dirección de donde parto para leer los mismos, esto es debido a que una instrucción para guardar datos en el stack (push) afectara la dirección del stack en forma opuesta a la instrucción que lee la información (pop).
De esta forma podemos definir el tipo de funcionamiento del stack de la siguiente forma.
Según donde apunta el stack lo dividimos en:
- Full Stacks el puntero del stack indica la dirección del ultimo dato.
- Empty Stack el puntero del stack indica la primera dirección libre.
Según la forma en que guardan los datos:
- Descending stack los datos son guardados en posiciones decrementadas 4 bytes con respecto a la anterior.
- Ascending stack los datos son guardados en posiciones incrementadas 4 bytes con respecto a la anterior.
De estas dos clasificaciones, podemos definir 4 tipos de stack
- Full Descending, con la sintaxis FD.
- Empty Descending, con la sintaxis ED.
- Full Ascending, con la sintaxis FA.
- Empty Ascending, con la sintaxis EA.
Estos modificadores forman un conjunto nuevo de instrucciones, los cuales tienen una equivalencia con la anterior tabla, pero ahora la forma en que funcionará una instrucción de Carga en un modo de stack dado, será distinta al funcionamiento de una instrucción de Almacenamiento en ese mismo modo, esto queda reflejado en la siguiente tabla.
Modo Stack |
Modo Convencional |
|||
Modo |
Instrucciones |
Instrucciones |
||
Carga |
Almacenamiento |
Carga |
Almacenamiento |
|
Full Ascending |
LDMFA |
STMFA |
LDMDA |
STMIB |
Full Descending |
LDMFD |
STMFD |
LDMIA |
STMDB |
Empty Ascending |
LDMEA |
STMEA |
LDMDB |
STMIA |
Empty Descending |
LDMED |
STMED |
LDMIB |
STMDA |
En esta tabla vemos en la primeas columnas, las instrucciones con el subfijo que determina el modo de funcionamiento para manejo de stack, luego en las últimas dos columnas las instrucciones que funcionan en modo equivalente pero usando el modo convencional de subfijo.
Como ejemplo del uso de estas instrucciones para el manejo del stack, vamos a guardar dos registros el R1 y R2 en el stack cuyo puntero está guardado en el registro R13, el modo del stack que usaremos es el mas común y el que utiliza por ejemplo INTEL, en nuestras PC
Modo de stack Full Descending Registros a guardar y luego recuperar R1 y R2
Instrucción para Guardar
STMFD R13!,{R1,R2}
Estado antes de Guardar |
Estado luego de Guardar |
|
Se espera "=" luego de "img"
|
Se espera "=" luego de "img"
|
Instrucción para Leer
LDMFD R13!,{R1,R2}
Estado antes de Leer |
Estado luego de Leer |
Se espera "=" luego de "img"
|
Se espera "=" luego de "img"
|