Nível Máquina
Formatos de Instruções
IA32 e MIPS
AC1 – Formatos de Instruções
1
Stored Program Concept
As instruções são sequências de bits, armazenados em memória,
que são descodificados pela Unidade de Controlo do processador.
É possível descodificar estes números porque a Unidade de
Controlo conhece o formato da informação que estes contêm.
Esta informação consiste geralmente nos seguintes campos:
• opcode – código que identifica a operação;
• identificação dos modos de endereçamento
• operandos (registos, valores imediatos)
Algumas arquitecturas incluem prefixos que modificam o
comportamento da instrução.
AC1 – Formatos de Instruções
2
Formato das Instruções : IA32
Instruções podem variar entre 1 a 17 bytes
AC1 – Formatos de Instruções
3
Formatos das Instruções : IA32
ADDB $0x20, %AL
Opcode = 0x04
0x04 0x20
ADDL $0x5F0043, %EAX
Opcode = 0x05
0x05 0x43 0x00 0x5F 0x00
LOCK ADDL $0x5F0043, 0x08FFA021(%eax, %esi, 2)
Opcode = 0x81, Prefix = 0xF0
0xF0 0x81 0x84 0x70 0x21 0xA0 0xFF 0x08 0x43 0x00 0x5f 0x00
prefixo opcode ModR/M SIB
AC1 – Formatos de Instruções
deslocamento
valor imediato
4
Formato de instruções – MIPS32
A simplicidade do formato das instruções permite o desenho de
uma unidade de controlo mais simples, mais rápida e que facilita a
incorporação de outras funcionalidades no processador.
Simplicidade: as instruções têm tamanho fixo e apenas 3 tipos diferentes
R
I
J
op
rs
rt
rd
shamt
Funct
6 bits
5 bits
5 bits
5 bits
5 bits
6 bits
op
rs
rt
Imm
6 bits
5 bits
5 bits
16 bits
op
Target
6 bits
26 bits
AC1 – Formatos de Instruções
5
Tipo R
6 bits
5 bits
5 bits
5 bits
5 bits
6 bits
op
rs
rt
rd
shamt
funct
Op – código que identifica a instrução. Para R é sempre 0 (excepto rfe=0x10)
funct – identifica a função (operação)
rs, rt – números do dois registos que contêm os operandos
rd – número do registo que virá a conter o resultado
Número de shifts – apenas para sll, srl e sra (0 nas outras instruções)
AC1 – Formatos de Instruções
6
Tipo R
add $t0, $t2, $s0
rt = $s0 = 16
rd = $t0 = 8
shamt = 0
op = 0x00
funct = 0x20
rs = $t2 = 10
op
rs
000000 01010
Hexa:
0
1
AC1 – Formatos de Instruções
5
rt
rd
10000
01000
0
4
shamt
funct
00000 100000
0
2
0
7
Tipo I
addi $t0, $t2, 256
rt = $t0 = 8
imm = 256
op = 0x08
rs = $t2 = 10
op
rs
001000 01010
2
1
AC1 – Formatos de Instruções
4
rt
imm
01000
0000 0001 0000 0000
8
0
1
0
0
8
Tipo I
lw $t9, -20 ($sp)
rt = $t9 = 25
imm = -20
op = 0x23
rs = $sp = 29
op
rs
rt
100011 11101
8
f
AC1 – Formatos de Instruções
11001
b
9
imm
1111 1111 1110 1100
f
f
e
c
9
Instruções de salto – branch e jump
Branch (Tipo I) – endereçamento relativo
A constante de 16 bits indica o número de instruções a saltar
Jump (Tipo J) – endereçamento absoluto
A constante de 26 bits indica os 26 bits menos significativos do endereço
de destino (excluindo os 2 bits menos significativos que são 00)
Jump register (Tipo R) – endereçamento absoluto
O registo indica o endereço de destino
AC1 – Formatos de Instruções
10
Endereçamento relativo
op = 05
rs = $t0 = 8
rt = $0 = 0
for:
subi $t0, $t0, -1
bne $t0, $0, for
addi $t0, $t0, -1
op
rs
rt
imm
000101
001000
000000
1111 1111 1111 1110
PC = imm*4 + PC
AC1 – Formatos de Instruções
11
Endereçamento Absoluto –Tipo J
Endereço destino do jump é dado por:
• 4 bits mais significativos – são obtidos do PC
• 26 bits do meio – obtidos do campo target da instrução
• 2 bits menos significativos – 00 pois as instruções têm que
estar em endereços múltiplos de 4
PC:
Old PC
Instruction Target Field
00
Para saltos que necessitem da especificação dos 32 bits do endereço
de destino usar a instrução jr (jump register) carregando previamente
o valor apropriado num registo
AC1 – Formatos de Instruções
12
Endereçamento absoluto – Tipo J
j longe
Supondo que esta instrução está no endereço de memória
0XE0AA0000 e que longe é uma etiqueta que corresponde a
0xE0000008 então teremos:
op
target
000010
0000 0000 0000 0000 0000 0000 10
PC = 1110 0000 1010 1010 0000 0000 0000 0100
Após substituir os 26 bits apropriados do PC teremos
PC = 1110 0000 0000 0000 0000 0000 0000 1000
AC1 – Formatos de Instruções
13
Valores Imediatos
Como lidar com instruções que tenham constantes de mais de 16 bits
addi $t0, $t0, 0xA00CD
1. Carregar a constante para $at usando lui e ori
2. Usar a versão R da instrução
lui
lui $at,
$at,0x000A
0x000A
ori $at, $at, 0x00CD
add $t0, $t0, $at
$at:
AC1 – Formatos de Instruções
0x000A0000
0x000A00CD
0x????????
14
Formato de Instruções
Tema
MIPS - Instruções I e R
H&P
Sec 3.4, 3.5
MIPS - Instruções J
Sec 3.8
MIPS - Constantes > 16 bits
Sec 3.8
Instruções Intel
AC1 – Formatos de Instruções
Manual Intel
Página da disciplina: “IA32 Intel Architecture Software
Developer's Manual. Volume 2:
The Instruction Set Reference”
15
Download

ppt