origem - Afonso Ferreira Miguel, MSc

Propaganda
Instruções Assembly x Código de máquina
Microprocessador Didático
Professor Afonso Ferreira Miguel ([email protected])
Disciplina de Projetos Lógicos e Microprocessadores
Curitiba, 1 de junho de 2002.
Mnemônico: MOV <DESTINO>,<ORIGEM>
OPCODE: 0 (000002)
Exemplos:
MOV R3,AC
NB=
0 (não tem nenhum parâmetro constante)
OPCODE= 00000
DESTINO= 0011 (R3)
ORIGEM= 0100 (AC)
Código de Máquina = 0 00000 0011 0100 00 = 00D0h
MOV R0,R3
NB=
OPCODE=
DESTINO=
ORIGEM=
0 (não tem nenhum parâmetro constante)
00000
0000 (R0)
0011 (R3)
Código de Máquina = 0 00000 0000 0011 00 = 000Ch
MOV AC,30h
NB=
1 (tem o parâmetro constante 30h)
OPCODE= 00000
DESTINO= 0100 (AC)
ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1,
o valor do parâmetro (30h) é carregado para ele no FETCH.
Código de Máquina = 1 00000 0100 1000 00 = 8120h
Assim, o programa:
MOV R3,AC
MOV R0,R3
MOV AC,30h
Fica codificado na memória como:
2
Mnemônico: JMP <ENDERECO_DESTINO>
Esta instrução na verdade é um comando MOV PC, <ENDERECO_DESTINO>
Exemplo:
JMP 1F04
NB=
1 (tem o parâmetro constante 1F04h)
OPCODE= 00000 ß é o OPCODE do MOV
DESTINO= 0111 (PC)
ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1,
o valor do parâmetro (1F04h) é carregado para
ele no FETCH.
Código de Máquina = 1 00000 0111 1000 00 = 81E0h
Assim, o programa:
MOV R3,AC
MOV R0,R3
MOV AC,30h
JMP 1F04
Fica codificado na memória como:
3
Mnemônico: LOAD <DESTINO>,<ENDERECO_ORIGEM>
OPCODE: 1 (000012)
Exemplos:
LOAD AC,100h
NB=
1 (tem um parâmetro constante – o endereço)
OPCODE= 00001
DESTINO= 0100 (AC)
ORIGEM= XXXX
Obs.: apesar da origem não ser TEMP, o microcódigo deste opcode já sabe que o dado virá
da posição de memória apontada por TEMP (com NB=1)
Código de Máquina = 1 00001 0100 1000 00 = 8520h
LOAD R3,1A0h
NB=
1 (tem um parâmetro constante – o endereço)
OPCODE= 00001
DESTINO= 0011 (R3)
ORIGEM= XXXX
Obs.: apesar da origem não ser TEMP, o microcódigo deste opcode já sabe que o dado virá
da posição de memória apontada por TEMP (com NB=1)
Código de Máquina = 1 00001 0011 1000 00 = 84E0h
4
Mnemônico: STORE <ENDERECO_DESTINO>,<ORIGEM>
OPCODE: 2 (000102)
Exemplos:
STORE 100h,AC
NB=
1 (tem um parâmetro constante – o endereço)
OPCODE= 00010
DESTINO= XXXX
ORIGEM= 0100 (AC)
Obs.: o destino não importa, pois o microcódigo deste opcode já sabe que o dado deverá ser
armazenado na posição de memória apontada por TEMP.
Código de Máquina = 1 00010 0000 0100 00 = 8810h
STORE FFE2h,R2
NB=
1 (tem um parâmetro constante – o endereço)
OPCODE= 00010
DESTINO= XXXX
ORIGEM= 0010 (R2)
Obs.: o destino não importa, pois o microcódigo deste opcode já sabe que o dado deverá ser
armazenado na posição de memória apontada por TEMP.
Código de Máquina = 1 00010 0000 0010 00 = 8808h
Mnemônico: ADD <DESTINO>,AC,<ORIGEM>
OPCODE: 16 (100002)
Exemplos:
ADD R3,AC,R2
R3 ßAC+R2
NB=
0
OPCODE= 10000
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 10000 0011 0010 00 = 40C8h
ADD R3,AC,128h R3 ßAC+128h
NB=
1 (tem um parâmetro constante – o valor 128)
OPCODE= 10000
DESTINO= 0011 (R3)
ORIGEM= 1000 (TEMP)
Código de Máquina = 0 10000 0011 1000 00 = 40E0h
5
Mnemônico: ADC <DESTINO>,AC,<ORIGEM>
OPCODE: 17 (100012)
Exemplo:
ADC R3,AC,R2
R3 ßAC+R2+carry
NB=
0
OPCODE= 10001
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 10001 0011 0010 00 = 44C8h
Mnemônico: SUB <DESTINO>,AC,<ORIGEM>
OPCODE: 18 (100102)
Exemplo:
SUB R3,AC,R2
R3 ßAC-R2
NB=
0
OPCODE= 10010
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 10010 0011 0010 00 = 48C8h
Mnemônico: SBC <DESTINO>,AC,<ORIGEM>
OPCODE: 19 (100112)
Exemplo:
SBC R3,AC,R2
R3 ßAC-R2-carry
NB=
0
OPCODE= 10011
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 10011 0011 0010 00 = 4CC8h
Mnemônico: INC <DESTINO>,<ORIGEM>
OPCODE: 20 (101002)
Exemplo:
INC R3,R2 R3 ß R2+1
NB=
0
OPCODE= 10100
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 10100 0011 0010 00 = 50C8h
6
Mnemônico: DEC <DESTINO>,<ORIGEM>
OPCODE: 21 (101012)
Exemplo:
DEC R3,R2 R3 ß R2-1
NB=
0
OPCODE= 10101
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 10101 0011 0010 00 = 54C8h
Mnemônico: CPL <DESTINO>,<ORIGEM>
OPCODE: 22 (101102)
Exemplo:
CPL R3,R2 R3 ß NOT(R2)
NB=
0
OPCODE= 10110
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 10110 0011 0010 00 = 58C8h
Mnemônico: AND <DESTINO>,AC,<ORIGEM>
OPCODE: 23 (101112)
Exemplo:
AND R3,AC,R2
R3 ß AC AND R2
NB=
0
OPCODE= 10111
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 10111 0011 0010 00 = 5CC8h
Mnemônico: OR <DESTINO>,AC,<ORIGEM>
OPCODE: 24 (110002)
Exemplo:
OR R3,AC,R2
R3 ß AC OR R2
NB=
0
OPCODE= 11000
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 11000 0011 0010 00 = 60C8h
7
Mnemônico: XOR <DESTINO>,AC,<ORIGEM>
OPCODE: 25 (110012)
Exemplo:
XOR R3,AC,R2
R3 ß AC XOR R2
NB=
0
OPCODE= 11001
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 11001 0011 0010 00 = 64C8h
Mnemônico: RR <DESTINO>,<ORIGEM>
OPCODE: 26 (110102)
Exemplo:
RR R3,R2
R3 ß (carry,R2[15..1])
NB=
0
OPCODE= 11010
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 11010 0011 0010 00 = 68C8h
Mnemônico: RL <DESTINO>,<ORIGEM>
OPCODE: 27 (110112)
Exemplo:
RL R3,R2
R3 ß (carry,R2[15..1])
NB=
0
OPCODE= 11011
DESTINO= 0011 (R3)
ORIGEM= 0010 (R2)
Código de Máquina = 0 11011 0011 0010 00 = 6CC8h
Mnemônico: JNZ <ENDERECO_DESTINO>
OPCODE: 12 (011002)
Exemplo:
JNZ 1F04
NB=
1 (tem o parâmetro – endereço 1F04)
OPCODE= 01100
DESTINO= 0111 (PC)
ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1,
o valor do parâmetro (1F04h) é carregado para ele no FETCH.
Código de Máquina = 1 01100 0111 1000 00 = B1E0h
8
Mnemônico: JZ <ENDERECO_DESTINO>
OPCODE: 13 (011012)
Exemplo:
JZ
1F04
NB=
1 (tem o parâmetro – endereço 1F04)
OPCODE= 01101
DESTINO= 0111 (PC)
ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1,
o valor do parâmetro (1F04h) é carregado para ele no FETCH.
Código de Máquina = 1 01101 0111 1000 00 = B5E0h
Mnemônico: JNC <ENDERECO_DESTINO>
OPCODE: 14 (011102)
Exemplo:
JNC 1F04
NB=
1 (tem o parâmetro – endereço 1F04)
OPCODE= 01110
DESTINO= 0111 (PC)
ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1,
o valor do parâmetro (1F04h) é carregado para ele no FETCH.
Código de Máquina = 1 01110 0111 1000 00 = B9E0h
Mnemônico: JC <ENDERECO_DESTINO>
OPCODE: 15 (011112)
Exemplo:
JC
1F04
NB=
1 (tem o parâmetro – endereço 1F04)
OPCODE= 01111
DESTINO= 0111 (PC)
ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1,
o valor do parâmetro (1F04h) é carregado para ele no FETCH.
Código de Máquina = 1 01111 0111 1000 00 = BDE0h
9
Mnemônico: PUSH <ORIGEM>
OPCODE: 3 (000112)
Exemplos:
PUSH R2
NB=
0 (não tem um parâmetro constante)
OPCODE= 00011
DESTINO= XXXX ß o destino é ignorado
ORIGEM= 0010 (R2)
Código de Máquina = 0 00011 0000 0010 00 = 0C08h
PUSH 317h
NB=
1 (tem um parâmetro constante – o valor 317h)
OPCODE= 00011
DESTINO= XXXX
ORIGEM= 1000 (TEMP)
Código de Máquina = 1 00011 0000 1000 00 = 8C20h
Mnemônico: POP <DESTINO>
OPCODE: 4 (001002)
Exemplos:
POP R2
NB=
0 (não tem um parâmetro constante)
OPCODE= 00100
DESTINO= 0010 (R2)
ORIGEM= XXXX
Código de Máquina = 0 00100 0010 0000 00 = 1080h
Mnemônico: CALL <ENDERECO_DESTINO>
OPCODE: 5 (001012)
Exemplo:
CALL 1F04
NB=
1 (tem o parâmetro constante 1F04h)
OPCODE= 00101
DESTINO= XXXX
ORIGEM= 1000 (TEMP) ß a origem é o TEMP, pois como NB=1,
o valor do parâmetro (1F04h) é carregado para ele no FETCH.
Código de Máquina = 1 00101 0000 1000 00 = 9420h
10
Mnemônico: RET
Esta instrução na verdade é um comando POP PC
Exemplo:
RET
NB=
0 (não tem o parâmetro)
OPCODE= 00100 ß é o OPCODE do POP
DESTINO= 0111 (PC)
ORIGEM= XXXX
Código de Máquina = 0 00100 0111 0000 00 = 11C0h
Mnemônico: CMP AC,<ORIGEM>
Esta instrução na verdade é um comando SUB ?,AC,<ORIGEM> onde o destino não
existe. O objetivo deste comando é comparar AC com outro registrador ou constante,
afetando os flags.
Exemplo:
CMP AC,R2 ? ß AC - R2
NB=
0
OPCODE= 10010 ß é o OPCODE do SUB
DESTINO= 1111 (?) ß é um registrador que não existe
ORIGEM= 0010 (R2)
Código de Máquina = 0 10010 1111 0010 00 = 4BC8h
Download