Bienvenido: Ingresar

Versión 18 con fecha 2010-08-10 16:08:18

Quitar mensaje
location: WebHome / ASMIntroduccionARM / ASMInstruccionesCyAMARM

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.

! indica si el registro base se actualizará una vez que se termine de guardar o leer todos los registro (corresponde al bit W).

^ 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.(corresponde al bit S)

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

Bit U Indica el modo en que se toman las sucesivas posiciones de memoria

Bit S Este bit tiene dos funciones:

Nota cuando el procesador esta en modo usuario o sistema, este funcionamiento del LDM dará resultados impredecibles.

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

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:

Según la forma en que guardan los datos:

De estas dos clasificaciones, podemos definir 4 tipos de stack

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"