Instruções de linguagem de máquina

Propaganda
Sistemas de Computação
Instruções
Instruções de
de Linguagem
Linguagem de
de Máquina
Máquina
Linguagem de montagem do
processador MIPS
Sistemas de Computação
• Operações aritméticas
Instrução
Exemplo
Significado
soma
add a, b, c a = b + c
subtração
sub a, b, c
a=b-c
Compilação de dois comandos em C
para MIPS
Sistemas de Computação
Segmento do
Programa em C
Segmento do
Programa em MIPS
a = b + c;
d = a – e;
add a, b, c
sub d, a, e
f = (g + h) – (i + j);
add t0, g, h
add t1, i, j
sub f, t0, t1
Compilação de dois comandos em C
para MIPS
Sistemas de Computação
• Operandos aritméticos localizados em
registradores
Segmento do Programa
em C
Segmento do
Programa em MIPS
a = b + c;
d = a – e;
add $s0, $s1, $s2
sub $s3, $s0, $s4
f = (g + h) – (i + j);
add $t0, $s1, $s2
add $t1, $s3, $s4
sub $s0, $t0, $t1
Instruções para transferência de dados
entre memória e registradores
Sistemas de Computação
• Estruturas de dados mais complexas podem
conter mais dados que o número de registradores
• Dados armazenados na memória têm que ser
transferidos para registradores para operações
aritméticas
• As instruções de transferência de dados devem
fornecer o endereço na memória do dado a ser
acessado
Instruções para transferência de dados
entre memória e registradores
Sistemas de Computação
3
100
2
10
1
101
0
1
Endereço
Processador
Dados
Memória
• Instrução para transferir dado da memória para
registrador: load word (lw)
• Instrução para transferir dado do registrador
para memória: store word (sw)
Instruções para transferência de dados
entre memória e registradores
Sistemas de Computação
• Endereço base armazenado em registrador da
instrução
• Endereço da memória formado pelo deslocamento
adicionado ao conteúdo do registrador base
Segmento do programa em C Segmento do programa em MIPS
g=h+A[8]
lw $t0,8($s3)
add $s1, $s2, $t0
Endereços reais em MIPS
Sistemas de Computação
12
100
8
10
4
101
0
1
Endereço
Processador
Dados
Memória
•
Endereços se referem a bytes
•
Na arquitetura MIPS a palavra é de 32 bits (4 bytes),
fazendo com que endereços das palavras difiram por 4.
•
Em MIPS endereços das palavras devem sempre começar
em múltiplos de 4 (restrição de alinhamento)
Instruções para transferência de dados
entre memória e registradores
Sistemas de Computação
• Endereço base armazenado em registrador da
instrução
• Endereço da memória formado pelo deslocamento
adicionado ao conteúdo do registrador base
Segmento do programa em C Segmento do programa em MIPS
A[12]=h+A[8]
lw $t0,32($s3)
add $t0, $s2, $t0
sw $t0,48($s3)
Representação das instruções do tipo R
Sistemas de Computação
• Cada instrução da linguagem de montagem é
traduzida para a linguagem de máquina expressa
de forma binária
• Campos das instruções de máquina MIPS:
op
6 bits
rd rs
5 bits
rt
5 bits
rd
shamt
5 bits
5 bits
op: código de operação
rs: registrador com primeiro operando fonte
rt: registrador com segundo operando fonte
rd: registrador que guarda resultado da operação
shamt: deslocamento
funct: código de função
funct
6 bits
Representação das instruções do tipo R
Sistemas de Computação
• Tradução de uma instrução de registrador na
linguagem de montagem para linguagem de
máquina
• add $t0, $s1, $s2
0
op
000000
6 bits
rd 17
18
8
0
32
rs
rt
rd
shamt
funct
rd
10001
10010
01000
00000
100000
5 bits
5 bits
5 bits
5 bits
6 bits
Instruções do tipo R
Sistemas de Computação
• Operações aritméticas:
– add rd, rs, rt
– sub rd, rs, rt
• Operações lógicas:
– and rd, rs,rt
– or rd, rs, rt
– sll rd, rt, shamt
– sra rd, rt, shamt
– srl rd, rt, shamt
– xor rd, rs, rt
Representação das instruções do tipo I
Sistemas de Computação
• Tradução de uma instrução de memória na
linguagem de montagem para linguagem de
máquina
• lw $t0, 1200($t1)
35
op
100011
6 bits
rd 9
rs
rd
01001
5 bits
8
rt
0100
5 bits
1200
endereço
0000 0100 1011 0000
16 bits
Representação das instruções de desvio
Sistemas de Computação
• Instrução de desvio
– beq registrador1, registrador2, L1
– bne registrador1, registrador2, L1
Segmento do programa em C
if (i==j) f = g+h;
else f=g-h;
Segmento do programa em MIPS
bne $s3, $s4, else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit:
Compilando o comando while
Sistemas de Computação
Segmento do programa em C Segmento do programa em MIPS
while (save[i] ==k)
Loop: add $t1, $s3, $s3
i = i+j;
add $t1, $t1, $t1
add $t1,$t1,$s6
lw $t0,0($t1)
bne $t0, $s5, Exit
add $s3, $s3, $s4
j Loop
Exit:
Comando switch
Sistemas de Computação
• Permite selecionar uma entre diversas alternativas
– switch (k) {
case
case
case
case
}
0:
1:
2:
3:
f
f
f
f
=
=
=
=
i
g
g
i
+
+
-
j;
h;
h;
j;
break;
break;
break;
break;
• Pode ser implementado utilizando-se comandos ifthen-else aninhados
• Maneira mais eficiente:
– Alternativas são codificadas em uma tabela de endereços,
denominada tabela de endereços de jump
– Na execução do comando basta indexar a tabela e ir para o
endereço encontrado na tabela
– Instrução de desvio incondicional em MIPS jr
Implementação com tabela do comando
switch
Sistemas de Computação
•
Estrutura do programa
Tabela
– obtém
–
–
–
–
–
end.
na
tabela de acordo
com valor de k
vai para endereço
L0: f = i + j
L1: f = g + h
L2: f = g - h
L3: f = i - j
•
k
0
1
2
3
endereço
L0
L1
L2
L3
Código gerado para comando switch
Sistemas de Computação
# Testa se variável k entre 0 e 3
slt $t3, $s5, $zero
bne $t3, $zero, Exit
slt $t3, $s5, $t2
beq $t3, $zero, Exit
# Multiplica k por 4 para obter deslocamento na tabela
add $t1, $s5, $s5
add $t1, $t1, $t1
# Calcula o endereço correto
add $t1, $t1, $t4
lw $t0, 0($t1)
# Vai para o endereço
jr $t0
#Casos do switch
L0: add $s0, $s3, $s4
j Exit
L1: add $s0, $s1, $s2
j Exit
L2: sub $s0, $s1, $s2
j Exit
L3: sub $s0, $s3, $s4
Exit:
Modos de Endereçamento em MIPS
Sistemas de Computação
• Palavra de 32 bits
• Memória endereçada a byte
• Cada instrução tem 32 bits
• Os modos de endereçamento indicam como
encontrar os operandos das instruções
Endereçamento por registrador
Sistemas de Computação
• Indica o endereço de um registrador
6 bits 5 bits 5 bits 5 bits
op rs rt rd … funct
Registradores
Registrador
– Ex: add $s0, $t0, $t1 # $s0 = $t0 + $t1
Endereçamento base mais deslocamento
Sistemas de Computação
• Visa reduzir o tamanho das instruções e facilitar o
processo de relocação de programas
– indica o endereço de um registrador (base) e um valor relativo à
primeira instrução (deslocamento)  endereço efetivo do dado
16 bits
6 bits 5 bits 5 bits
op rs rt
Endereço
Registrador
– Ex: lw $s1, 100($s2)
Memória
+
Byte
Meiapalavra
Palavra
# $s1 = 4 bytes em Memória [$s2 + 100]
lb $s1, 100 ($s2) # coloca byte em Memória [$s2+100] nos 8
bits menos significativos de $s1 e estende o sinal
lh $s1, 100 ($s2) # coloca 2 bytes em Memória [$s2+100]
nos 16 bits menos significativos de $s1 e estende o sinal
Endereçamento imediato
Sistemas de Computação
• Constantes são utilizadas em programas para
indexar arrays, contar iterações de loops, por
exemplo
• Vários programas possuem mais de 50% de suas
operações aritméticas envolvendo constantes
• Como acessar estas constantes ?
lw
add
$t0, EndConst6($zero) # $t0 = constante 6
$s5, $s5, $t0
# soma 6 a $s5
Endereçamento imediato
Sistemas de Computação
• Valor do dado é indicado diretamente no campo
operando
• O dado é obtido junto com a instrução
6 bits
op
5 bits
rs
– Ex: addi $s5, $s5, 6
5 bits
rt
# $s5 = $s5 + 6
16 bits
imediato
Instruções aritméticas e lógicas que
utilizam endereçamento imediato
Sistemas de Computação
• addi rt, rs, imm
• andi rt, rs, imm
• ori rt, rs, imm
• xori rt, rs, imm
• slti rt, rs, imm
Endereçamento imediato
Sistemas de Computação
• Para constantes maiores que 16 bits utiliza-se a
instrução lui (load upper immediate)
• Carrega constante nos bits superiores e preenche
os inferiores com zero
– Ex: lui $t0,255
6 bits
001111
5 bits 5 bits
00000 01000
16 bits
0000 0000 1111 1111
$t0
0000 0000 1111 1111
0000 0000 0000 0000
Endereçamento imediato
Sistemas de Computação
• Qual o código em linguagem de máquina do MIPS
para carregar a constante abaixo de 32bits no
registrador $s0?
0000 0000 0011 1101 0000 1001 0000 0000
Endereçamento pseudo direto
Sistemas de Computação
• Utilizado para desvios incondicionais
– indica o endereço pela concatenação dos 26 bits da instrução com
os 4 bits mais significativos do PC para formar palavra de 32 bits
6 bits
op
26 bits
Endereço
PC
– Ex: j 10000
Memória
:
Palavra
Endereçamento relativo ao PC
Sistemas de Computação
• Utilizado para desvios condicionais
• Utilizando o campo imediato (16 bits), nenhum
programa poderia ser maior que 216
– Solução: PC= Registrador + Endereço de desvio
• Registrador utilizado é o próprio PC
– Pode desviar no intervalo PC-215 a PC+215
16 bits
6 bits 5 bits 5 bits
op rs rt
Endereço
PC
Memória
+
Palavra
– Ex: beq $s1, $s2, 25 # se ($s1 == $s2) desvia para PC + 4 + 100
# (cada instrução tem 4 bytes)
Compilando o comando while
Sistemas de Computação
Loop: add $t1, $s3, $s3
add $t1, $t1, $t1
add $t1,$t1,$s6
lw $t0,0($t1)
bne $t0, $s5, Exit
add $s3, $s3, $s4
j Loop
Exit:
endereço
80000
80004
80008
80012
80016
80020
80024
80028
0
0
0
35
5
0
2
...
19
9
9
9
8
19
instrução
19
9
9
9
22
9
8
21
20
19
80000
0
0
0
0
8
0
32
32
32
32
Como desviar para mais longe
Sistemas de Computação
• Substitui-se a instrução beq, por bne e j
• Exemplo:
beq $s1,$s2,L1
substituído por
bne $s1, $s2, L2
j L1
L2:
Arrays e ponteiros
Sistemas de Computação
• Procedimento para zerar o conteúdo de um array
– utilizando índices de arrays
clear1(int array[], int size)
{
int i;
for (i = 0; i < size; i = i+1)
array[i] = 0;
}
– utilizando ponteiros
clear2(int *array, int size)
{
int *p;
for (p = &array[0]; p < &array[size]; p = p+1)
*p = 0;
}
Arrays e ponteiros - comparação do
código gerado
Sistemas de Computação
•
Código gerado para array
move $t0, $zero
•
Código gerado para ponteiro
move $t0, $a0
loop1: add $t1,$t0,$t0
add $t1,$a1,$a1
add $t1,$t1,$t1
add $t1,$t1,$t1
add $t2,$a0,$t1
add $t2,$a0,$t1
sw $zero,0($t2)
loop2: sw $zero,0($t0)
addi $t0,$t0,1
addi $t0,$t0,4
slt $t3,$t0,$a1
slt $t3,$t0,$t2
bne $t3,$zero,loop1
bne $t3,$zero,loop2
Arquitetura X86 - Propriedades CISC
Sistemas de Computação
• Operações aritméticas podem ler/escrever da/na
memória
• Endereçamento da memória podem envolver
cálculos complexos
– D(Rb,Ri,S)
Mem[Reg[Rb]+S*Reg[Ri]+D]
• D: deslocamento de 1,2 ou 4 bytes
• Rb: Registrador base: * possíveis registradores
• Ri: Registrador de índice: qualquer registrador
• S: Escala: 1,2, 4 ou 8
Download