Instruções de transferência de dados
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 |
MOVL, Rd, k |
Rd(7..0)
ß k(7..0) |
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 |
MOVL, Rd, k(7..0) |
Rd(7..0)
ß k(7..0) |
Rd fica com uma cópia do valor da constante (de 16 bits). O valor anterior de Rd é destruído. |
Exemplos:
Assembly |
Constante |
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 |
MOV R1, -1 |
FF FFH |
MOVL, R1, FFH |
MOV R1, -128 |
FF80H |
MOVL, R1, 80H |
MOV R1, -32768 |
80 00H |
MOVL, R1, 00H |
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 |
k Î [-128 .. +127] |
|||
MOVH |
Rd, k |
MOVH |
Rd |
k |
Rd(15..8) ¬ k |
Nenhuma |
k Î [0 .. 255] |
|||
MOV |
Rd, k |
MOVL |
Rd |
k |
Rd ¬k(7){8} || k |
Nenhuma |
Se k Î [-128 .. +127] |
|||
MOV |
Rd, k |
MOVL MOVH |
Rd |
k(7..0) |
Rd
¬k(7){8} || k(7..0) |
Nenhuma |
Se k Î [-32768 .. -129] ou |
|||
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 |
Nenhuma |
|
|||
Rd, [Rs] ou [Rs], Rd |
SWAPM |
Rd |
Rs |
TEMP
¬ Mw[Rs] |
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 |
Nenhuma |
SP só é actualizado no fim para ser re-executável |
|||
POP |
Rd |
POP |
Rd |
xxxx |
Rd
¬ Mw[SP] |
Nenhuma |
|
|||
Livre |
|
|
|
|
|
|
|
|||
Livre |
|
|
|
|
|
|
|
|||
Livre |
|
|
|
|
|
|
|