Instruções de transferência de dados

Voltar

As instruções MOVL e MOVH permitem especificar uma constante de 8 bits para inicializar apenas um dos bytes (o de menor e de maior peso, respectivamente) de um dado registo. Permitem resolver o problema de inicializar os 16 bits de um registo com instruções de apenas 16 bits (usando duas instruções). O assemblador permite especificar apenas uma instrução MOV com uma constante de 16 bits, gerando as instruções necessárias de acordo com o valor da constante

assembly

Exemplos

Instruções equivalentes

RTL

Efeito

MOV  Rd, k

-128 £ k £ +127

MOV    R0,-128
MOV    R3, 0
MOV     R6, +127

MOVL, Rd, k

Rd(7..0) ß k(7..0)
Rd(15..8)
ß k(7){8 }

Rd fica com uma cópia do valor da constante (de 8 bits) estendida para 16 bits com o seu bit de sinal, k(7). O valor anterior de Rd é destruído.

k £ -129 ou k ³ -128

MOV    R7, -32768
MOV    R2, -1000
MOV    R5, +500
MOV     R8, +32767

MOVL, Rd, k(7..0)
MOVH, Rd, k(15..8)

Rd(7..0) ß k(7..0)
Rd(15..8)
ß k(7){8 }
Rd(15..8)
ß k(15..8)

Rd fica com uma cópia do valor da constante (de 16 bits). O valor anterior de Rd é destruído.

Exemplos:

Assembly

Constante
(Hexadecimal 16 bits)

Instruções máquina

MOV    R1, 0

00 00H

MOVL, R1, 00H

MOV    R1, +1

00 01H

MOVL, R1, 01H

MOV    R1, +127

00 7FH

MOVL, R1, 7FH

MOV    R1, +32767

7F FFH

MOVL, R1, FFH
MOVH, R1, 7FH

MOV    R1, -1

FF FFH

MOVL, R1, FFH

MOV    R1, -128

FF80H

MOVL, R1, 80H

MOV    R1, -32768

80 00H

MOVL, R1, 00H
MOVH, R1, 80H

A tabela seguinte descreve as formas de acesso à memória em dados e a sua utilização típica.

Instrução

Modos de endereçamento

Operação com a memória

Utilização típica

MOV

Rd, [Rs]

Indirecto

Leitura da memória

(16 bits)

Transferência de variáveis (16 bits) entre memória e registos

MOV

Rd, [Rs + off]

Baseado

MOV

Rd, [Rs + Ri]

Indexado

MOV

[Rd], Rs

Indirecto

Escrita da memória

(16 bits)

MOV

[Rd + off], Rs

Baseado

MOV

[Rd + Ri], Rs

Indexado

MOVB

Rd, [Rs]

Indirecto

Leitura da memória (8 bits)

Processamento de bytes individuais (cadeias de caracteres ASCII, por exemplo)

MOVB

[Rd], Rs

Indirecto

Escrita da memória (8 bits)

MOVP

Rd, [Rs]

Indirecto

Leitura da memória (16 bits) sem usar a cache nem a memória virtual

Leitura de periféricos

MOVP

[Rd], Rs

Indirecto

Escrita de periféricos

SWAP

Rd, [Rs] ou

[Rs], Rd

Indirecto

Troca atómica de dados (16 bits) entre memória e registo. Mesmo com caches, o acesso à memória é forçado

Troca de dados, semáforos

PUSH

Rd

Implícito (SP)

Escrita na pilha

Guardar valores para mais tarde recuperar

POP

Rd

Implícito (SP)

Leitura da pilha

Recuperar valores guardados na pilha

As instruções de transferência de dados são as seguintes:

Classe

Sintaxe em assembly

Campos da instrução (16 bits)

Acções

Flags afectadas

Comentários

1º opcode (4bits)

2º opcode (4bits)

1º operando (4bits)

2º operando (4bits)

Instruções de transferência de dados

MOV

Rd, [Rs + off]

LDO

Rd

Rs

off/2

Rd ¬ Mw[Rs + off]

Nenhuma

off Î [-16 .. +14]

Rd, [Rs]

Rd

Rs

0000

Rd ¬ Mw[Rs + 0000]

Nenhuma

 

Rd, [Rs + Ri]

LDR

Rd

Rs

Ri

Rd ¬ Mw[Rs + Ri]

Nenhuma

 

[Rd + off], Rs

STO

Rs

Rd

off/2

Mw[Rd + off] ¬ Rs

Nenhuma

off Î [-16 .. +14]

[Rd], Rs

Rs

Rd

0000

Mw[Rd + 0000] ¬ Rs

Nenhuma

 

[Rd + Ri], Rs

STR

Rs

Rd

Ri

Mw[Rd + Ri] ¬ Rs

Nenhuma

 

MOVB

Rd, [Rs]

XFER

LDB

Rd

Rs

Rd ¬ 0{8} || Mb[Rs]

Nenhuma

 

[Rd], Rs

STB

Rd

Rs

Mb[Rd] ¬  Rs(7..0)

Nenhuma

O byte adjacente a Mb[Rd] não é afectado

MOVP

Rd, [Rs]

LDP

Rd

Rs

Rd ¬ Mw[Rs]

Nenhuma

Não usa memória virtual nem caches (para acesso aos periféricos)

[Rd], Rs

STP

Rd

Rs

Mw[Rd] ¬ Rs

Nenhuma

MOVL

Rd, k

MOVL

Rd

k

Rd ¬k(7){8} || k

Nenhuma

Î [-128 .. +127]
k é extendido a 16 bits com sinal

MOVH

Rd, k

MOVH

Rd

k

Rd(15..8) ¬ k

Nenhuma

Î [0 .. 255]
O byte de menor peso não é afectado

MOV

Rd, k

MOVL

Rd

k

Rd ¬k(7){8} || k

Nenhuma

Se k  Î [-128 .. +127]

MOV

Rd, k

MOVL MOVH

Rd
Rd

k(7..0)
k(15..8)

Rd ¬k(7){8} || k(7..0)
Rd(15..8)
¬ k(15..8)

Nenhuma

Se k  Î [-32768 .. -129] ou
Î [+128 .. +32767]

Rd, Rs

XFER

MOVRR

Rd

Rs

Rd ¬ Rs

Nenhuma

 

Ad, Rs

MOVAR

Ad

Rs

Ad ¬ Rs

Nenhuma

 

Rd, As

MOVRA

Rd

As

Rd ¬ As

Nenhuma

 

Rd, USP

MOVRU

Rd

xxxx

Rd ¬ USP

Nenhuma

O SP lido é o de nível utilizador, independentemente do bit NP do RE

USP, Rs

MOVUR

xxxx

Rs

USP ¬ Rs

Nenhuma

O SP escrito é o de nível utilizador, independentemente do bit NP do RE

SWAP

Rd, Rs

SWAPR

Rd

Rs

TEMP ¬ Rd
Rd
¬ Rs
Rs
¬ TEMP

Nenhuma

 

Rd, [Rs] ou

[Rs], Rd

SWAPM

Rd

Rs

TEMP ¬ Mw[Rs]
Mw[Rs]
¬ Rd
Rd
¬ TEMP

Nenhuma

Recomeçável sem reposição de estado mesmo que um dos acessos à memória falhe

PUSH

Rd

PUSH

Rd

xxxx

Mw[SP-2] ¬ Rd
SP
¬ SP – 2

Nenhuma

SP só é actualizado no fim para ser re-executável

POP

Rd

POP

Rd

xxxx

Rd ¬ Mw[SP]
SP
¬ SP + 2

Nenhuma

 

Livre

 

 

 

 

 

 

 

Livre

 

 

 

 

 

 

 

Livre