Conjunto de instruções: modos e
formatos de endereçamento
Endereçamento
Para alcançar o objetivo de poder referenciar um grande intervalo de posições da memória principal,
uma grande variedade de técnicas de endereçamento foi desenvolvida. Todas envolvem algum tipo
de troca entre intervalo de endereços e/ou flexibilidade de endereçamento por um lado e o número
de referências de memória dentro da instrução e/ou a complexidade de cálculo de endereços por
outro.
Imediato
A forma mais simples de endereçamento. A vantagem do endereçamento imediato é que nenhuma
referência de memória, além de obter a instrução em si, é necessária para obter operando,
economizando um ciclo de memória ou cache dentro do ciclo da instrução. A desvantagem é que o
tamanho do número é limitado ao tamanho do campo de endereço
Direto
Requer apenas uma referência de memória e nenhum cálculo especial. A limitação é que ela oferece
um espaço de endereços limitado.
Indireto
Um campo de endereço se referindo ao endereço de uma palavra na memória, o qual, por sua vez,
contém o endereço completo do operando.
Por registradores
É semelhante ao endereçamento direto. A única diferença é que o campo de endereço se refere a um
registrador em vez de um endereço da memória principal. Apenas um pequeno campo de endereço é
necessário dentro da instrução e nenhuma referência de memória que consome tempo é necessária.
Indireto por registradores
É análogo ao endereçamento indireto. A única diferença é se o campo de endereço referencia um local
de memória ou um registrador. Assim temos para endereçamento indireto de registradores
Por deslocamento
O endereçamento por deslocamento requer que a instrução tenha dois campos de endereço, dos quais
ao menos um é explícito. O valor contido em um campo de endereço (valor = A) é usado diretamente. O
outro campo de endereço refere-se a um registrador cujos conteúdos são adicionados a A para produzir
um endereço efetivo.
Os usos mais comuns do endereçamento por deslocamento:
1. Endereçamento relativo 2. Endereçamento por registrador
base. 3. Indexação.
De pilha
Uma pilha é um vetor linear de posições. Itens são adicionados ao topo da pilha para que, a qualquer
momento, o bloco esteja parcialmente preenchido. Associado à pilha, temos um ponteiro cujo valor é o
endereço do topo da pilha. Alternativamente, dois elementos do topo podem estar nos registradores do
processador. Nesse caso, o ponteiro da pilha referencia o terceiro elemento da pilha. O ponteiro da pilha
é mantido em um registrador. Assim, as referências das posições da pilha em memória são na verdade
endereços indiretos dos registradores
(SUPORTE IMG)
Formatos de Instrução
Um formato da instrução define o layout de bits de uma instrução, no que diz respeito aos campos que
a constituem. Um formato da instrução tem que incluir um opcode e, implícita ou explicitamente, zero
ou mais operandos. Cada operando explicitado no opcode é referenciado usando um dos modos de
endereçamento. Na maioria dos conjuntos de instruções, mais do que um formato de instrução é
usado.
Dentro do processo de um formato de instrução levamos em consideração alguns fatores como:
Tamanho da Instrução
Relação das instruções que serão executados com o hardware ambientado
Alocação de bits
Trânsito de bits que ocorrem na relação da instrução com seu endereçamento
Instruções de tamanhos variáveis
Fornece opcodes com tamanhos diferentes, com várias combinações variáveis e flexíveis quanto ao
endereçamento
Modos de endereçamento x86 e ARM
Endereçamento e ARM
off set: para este modo de endereçamento, a indexação não é usada. Um valor de off set é adicionado
ou subtraído do valor que está no registrador base para formar o endereço de memória.
pré-indexação: o endereço de memória é formado da mesma maneira como no endereçamento de
offset. O endereço de memória é também armazenado de volta no registrador base.
Normalmente, uma máquina RISC, diferentemente de uma máquina CISC, usa um
conjunto de modos de endereçamento relativamente simples e direto. A forma mais
conveniente de classificar esses modos é de acordo com o tipo da instrução.Modo de
endereçamento ARM se refere como registrador base atua, na verdade, como um
registrador indexador para endereçamento de pré-indexação e pós-indexação.
pós-indexação: o endereço de memória é o valor do registrador base.
Endereçamento x86
O x86 é equipado com uma série de formas de endereçamento que vieram
possibilitar execução eficiente de linguagens de alto nível . O registrador de
segmento determina o segmento que é objetivo da referência. Existem seis
registradores de segmento; aquele usado para uma referência específica
depende do contexto da execução e da instrução. Cada registrador de segmento
mantém um índice da tabela de descritores de segmentos, a qual, por sua vez,
mantém o endereço inicial dos segmentos correspondentes. Associado a cada
registrador de segmento visível a usuário temos um registrador de descritor de
segmento, o qual grava as permissões de acesso para o segmento assim como o
endereço inicial e o limite do segmento. Além disso, existem dois registradores
que podem ser usados na construção do endereço: registrador básico e
registrador indexador.
Modo imediato: o operando está incluído na instrução. O operando pode ser um byte, uma palavra
ou uma palavra dupla de dados.
Modo em registrador operando: o operando está localizado em um registrador. Para instruções gerais,
tais como transferência de dados e instruções aritméticas e lógicas, o operando pode ser um dos
registradores gerais de 32,16 ou 8 bits.
Modo de deslocamento: offset do operando é mantido como parte da instrução sendo um
deslocamento de 8, 16 ou 32 bits. Com segmentação, todos os endereços das instruções se referem
meramente a um offset dentro de um segmento.
Modo base: especifica que um dos registradores de 8, 16 ou 32 bits contém o endereço efetivo. Isto é
equivalente ao que definimos como endereçamento indireto de registradores.
Modo base com deslocamento: as instruções incluem um deslocamento a ser adicionado ao
registrador base, o qual pode ser qualquer um dos registradores de uso geral.
Modo de índice escalado com deslocamento: a instrução inclui um deslocamento a ser adicionado a
um registrador, chamado neste caso de registrador indexador. O registrador indexador pode ser
qualquer um dos registradores de uso geral exceto aquele chamado de ESP, o qual é normalmente
usado para processamento de pilhas.
Modo base com índice escalado e deslocamento: soma o conteúdo do registrador indexador
multiplicado por um fator escalar, o conteúdo do registrador base e deslocamento. Isso é útil se um
vetor está armazenado dentro de uma pilha; neste caso, os elementos do vetor teriam tamanho de 2,
4 ou 8 bytes cada. Este modo fornece também indexação efi ciente de um vetor bidimensional quando
os elementos do vetor têm tamanho de 2, 4 ou 8 bytes.
Modo relativo: pode ser usado em instruções de transferência de controle. Um deslocamento é
adicionado ao valor do contador de programa, o qual aponta para a próxima instrução.
Formatos de instrução x86 e ARM
Formatos de instruções x86
Arm é baseado em RISC (Reduced Instruction Set Computing), As instruções de CPU da Arm são
razoavelmente atômicas, com uma correlação muito próxima entre o número de instruções e
micro-ops.
A Arm apresentou sua arquitetura ARMv8 de 64 bits em 2011. Em vez de estender seu conjunto de
instruções de 32 bits, a Arm oferece uma implementação limpa de 64 bits. Para conseguir isso, a
arquitetura ARMv8 usa dois estados de execução, AArch32 e AArch64. Como os nomes indicam, um é
para executar código de 32 bits e outro para 64 bits.
A beleza do design ARM é que o processador pode alternar perfeitamente de um modo para outro
durante sua execução normal. Isso significa que o decodificador para as instruções de 64 bits é um
novo design que não precisa manter a compatibilidade com a era de 32 bits, mas o processador como
um todo permanece compatível com versões anteriores.
Formatos de instruções ARM
x86 é baseado em CISC(Complex Instruction Set Computing) o CISC, por comparação, oferece muito
mais instruções, muitas das quais executam várias operações (como matemática otimizada e
movimentação de dados). Isso leva a um melhor desempenho, mas mais consumo de energia
decodificando essas instruções complexas.
Como todas linguagens de montagem, ela utiliza mnemônicas curtas para representar as operações
fundamentais que a CPU em um computador pode realizar. Compiladores muitas vezes produzem
código de montagem como um passo intermediário ao traduzir um programa de alto nível para
código de máquina.
Linguagem de Montagem
Uma Linguagem de Montagem pura, sem aditivos(macros, pseudo-instruções), é aquela na qual cada
comando produz exatamente uma instrução de máquina. Nesse caso, existe uma correspondência
de um-para-um nas instruções da Linguagem de Montagem e a Linguagem das Instruções de
Máquina.
É mais simples a programação em linguagem de montagem (com nomes simbólicos e ferramentas
auxiliares) do que fazê-lo em linguagem de máquina pura(hexadecimal/binário). Ex: É muito mais
fácil para uma pessoa se lembrar de escrever ADD para adicionar um numero a outro do que
lembrar o seu valor equivalente em hexadecimal para programar na linguagem de máquina.
Principal vantagem: performance! Produz-se código de máquina menor e muito mais rápido. O
programador decide quais instruções de máquina usar diretamente
Aplicações potenciais a serem implementadas diretamente em linguagem de montagem:
Códigos de um cartão inteligente
O código dos drivers dos dispositivos
Rotinas da BIOS
O código em um telefone celular
Os loops internos de aplicações dependentes de performance