Bienvenido: Ingresar
location: Diferencias para "WebHome/ASMIntroduccionARM/ASMInstruccionesCyAMARM"
Diferencias entre las revisiones 14 y 15
Versión 14 con fecha 2010-06-10 17:07:15
Tamaño: 8377
Comentario:
Versión 15 con fecha 2010-06-10 17:08:30
Tamaño: 8333
Comentario:
Los textos eliminados se marcan así. Los textos añadidos se marcan así.
Línea 110: Línea 110:
 . {{attachment:stm1.png|width="30%"}}

||<tablewidth="50%">Estado antes de Guardar ||Estado luego de Guardar ||
|| {{attachment:stm1.png|width="30"|height="274px",width="251px"}} || {{attachment:stm2.png|width="30"|height="277px",width="225px"}} ||
||Estado antes de Guardar ||Estado luego de Guardar ||
|| {{attachment:stm1.png|height="274px",width="251px"}} || {{attachment:stm2.png|height="274px",width="225px"}} ||
Línea 122: Línea 120:
||'''Se espera "=" luego de "img"''' ||'''Se espera "=" luego de "img"''' || || {{attachment:ldm1.png|height="274px",width="251px"}} || {{attachment:ldm2.png|height="274px",width="225px"}} ||

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

height="274px",width="251px"

height="274px",width="225px"

Instrucción para Leer

LDMFD R13!,{R1,R2}

Estado antes de Leer

Estado luego de Leer

height="274px",width="251px"

height="274px",width="225px"

UntitledWiki: WebHome/ASMIntroduccionARM/ASMInstruccionesCyAMARM (última edición 2012-07-04 18:46:03 efectuada por GuillermoSteiner)