Múltiplos dados

São 6 instruções disponíveis a saber:

LDM – Carrega múltiplos registadores

Descrição: Carrega as palavras consecutivas apontado pelo registador Rp para os registradores especificados na instrução. O PC pode ser carregada, o que resulta em um salto para o endereço de destino carregado. Se o PC é carregado, o valor de retorno de R12 é testado e as bandeiras são atualizadas. O valor de retorno pode ser opcionalmente ajustado para -1, 0 ou 1.
Operação: I. Loadaddress ← Rp;
if Reglist16[PC] == 1 then
if Rp == PC then
Loadaddress ← SP;
PC ← *(Loadaddress++);
if Rp == PC then
if Reglist16[LR,R12] == B’00
R12 ← 0;
else if Reglist16[LR,R12] == B’01
R12 ← 1;
else
R12 ← −1;
Test R12 and update flags;
else
if Reglist16[LR] == 1
LR ← *(Loadaddress++);
if Reglist16[SP] == 1
SP ← *(Loadaddress++);
if Reglist16[R12] == 1
R12 ← *(Loadaddress++);
Test R12 and update flags;
else
if Reglist16[LR] == 1
LR ← *(Loadaddress++);
if Reglist16[SP] == 1
SP ← *(Loadaddress++);
if Reglist16[R12] == 1
R12 ← *(Loadaddress++);
for (i = 11 to 0)
if Reglist16[i] == 1 then
Ri ← *(Loadaddress++);
if Opcode[++] == 1 then
if Rp == PC then
SP ← Loadaddress;
else
Rp ← Loadaddress;
Sintaxe: I. Ldm Rp{++}, Reglist16
Operandos: I. Reglist16 ∈ {R0, R1, R2, ..., R12, LR, SP, PC} / p ∈ {0, 1, ..., 15} 

LDMTS – Carrega múltiplos registadores para mudar tarefas

Descrição: Carrega as palavras consecutivas apontadas pelo registador Rp para os registradores especificados na instrução. Independentemente de qual contexto a instrução é chamada os registradores fonte residentes no registadores de contexto do usuário.
Operação: I. Loadaddress ←Rp;
for (i = 15 to 0)
if Reglist16[i] == 1 then
Ri USER ←*(Loadaddress++);
if Opcode[++] == 1 then
Rp ← Loadaddress;
Sintaxe: I. ldmts Rp{++}, Reglist16
Operandos: I. Reglist16 ∈ {R0, R1, R2, ..., R12, LR, SP} / p ∈ {0, 1, ..., 15} 

POPM – Empurra múltiplos registradores para a pilha

Descrição: Carrega as palavras consecutivas apontadas pelo registrador SP para os registradores especificados na instrução. O PC pode ser carregada, o que resulta em um salto para o valor carregado. Se o PC é estourado, o valor de retorno de R12 é testado e as bandeiras são atualizadas. R12 pode, opcionalmente, ser atualizada com -1, 0 ou 1. O bit k na codificação de instruções é utilizado.
Operação:
I. if Reglist8[PC] ∧ k == B’1
PC ← *(SP++)
if Reglist8[LR:R12] == B’00
R12 ← 0;
else if Reglist8[LR:R12] == B’01
R12 ← 1;
else
R12 ← −1;
Test R12 and update flags;
else
if Reglist8[PC] == 1 then
PC ← *(SP++);
if Reglist8[LR] == 1 then
LR ← *(SP++);
if Reglist8[R12] == 1 then
R12 ←*(SP++);
if Reglist8[PC] == 1 then
Test R12 and update flags;
if Reglist8[5] == 1 then
R11 ←*(SP++);
if Reglist8[4] == 1 then
R10 ←*(SP++);
if Reglist8[3] == 1 then
R9 ← *(SP++);
R8 ← *(SP++);
if Reglist8[2] == 1 then
R7 ← *(SP++);
R6 ← *(SP++);
R5 ← *(SP++);
R4 ← *(SP++);
if Reglist8[1] == 1 then
R3 ← *(SP++);
R2 ← *(SP++);
R1 ← *(SP++);
R0 ← *(SP++);
Sintaxe: I. popm Reglist8 {, R12 = {-1, 0, 1}}
If the optional R12 = {-1, 0, 1} parameter is specified, PC must be in Reglist8.
If the optional R12 = {-1, 0, 1} parameter is specified, LR should NOT be in Reglist8.
Operandos: I. Reglist8 ∈ {R0- R3, R4-R7, R8-R9, R10,R11, R12, LR, PC} 

PUSHM – puxa os múltiplos registadores para a pilha

descrição: armazena os registadores especificados na instrução para as posições consecutivos apontadas pelo SP.
Operação: I. se Reglist8[0] == 1 então
*(--SP) ←R0;
*(--SP) ←R1;
*(--SP) ←R2;
*(--SP) ←R3;
se Reglist8[1] == 1 então
*(--SP) ←R4;
*(--SP) ←R5;
*(--SP) ←R6;
*(--SP) ←R7;
se Reglist8[2] == 1 então
*(--SP) ←R8;
*(--SP) ←R9;
se Reglist8[3] == 1 então
*(--SP) ←R10;
se Reglist8[4] == 1 então
*(--SP) ←R11;
se Reglist8[5] == 1 então
*(--SP) ←R12;
se Reglist8[6] == 1 então
*(--SP) ←LR;
se Reglist8[7] == 1 então
*(--SP) ←PC;
Sintaxe: I. pushm Reglist8
Operandos: I. Reglist8 ∈ {R0- R3, R4-R7, R8-R9, R10,R11, R12, LR, PC} 

STM - armazena vários registradores

Descrição: Armazena os registradores especificados na posição de memória consecutiva apontada pelo Rp. Ambos os registradores no arquivo de registradores e alguns dos registradores de uso especial podem ser armazenados.
Operação: Storeaddress ← Rp;
se Opcode [-] == 1, então for (i = 0 a 15)
se Reglist16 [i] == 1, então * (- Storeaddress) ← Ri; Rp ← Storeaddress; senão para (i = 15-0)
se Reglist16 [i] == 1, então * (Storeaddress + +) ← Ri;
sintaxe: I. stm {---} Rp, Reglist16
operandos: I. Reglist16 ∈ {R0, R1, R2, ..., R12, LR, SP, PC} / p ∈ {0, 1, ..., 15}

STMTS – armazena múltiplos registradores para mudar tarefa

Store Multiple Registers for Task Switch
Description
Stores the registers specified to the consecutive memory locations pointed to by Rp. The registers specified all reside in the application context.
Descrição: Armazena os registradores especificados para as posições de memória consecutivas apontado por Rp. O registadores especificados todos residem no contexto da aplicação.
Storeaddress ← Rp;
se Opcode[--] == 1 então
para (i = 0 to 15)
se Reglist16[i] == 1 então
*(--Storeaddress) ←RiApp;
I. Rp ← Storeaddress;
então
para (i = 15 to 0)
se Reglist16[i] == 1 então
*(Storeaddress++) ←RiApp;
Sintaxe: I. stmts
{--}Rp, Reglist16
Operandos: I. Reglist16 ∈ {R0, R1, R2, ..., R12, LR, SP} / p ∈ {0, 1, ..., 15} 


Nenhum comentário:

Postar um comentário