DC-UFRPE/Licenciatura Plena em Computação/Arquitetura e organização de computadores/Instruções: Linguagem de Máquina

Fonte: Wikiversidade

Introdução[editar | editar código-fonte]

A linguagem de máquina, também conhecida como código de máquina, é uma linguagem de programação de baixo nível que consiste em código binário que pode ser executado diretamente pela unidade central de processamento (CPU) de um computador. É a linguagem fundamental usada pelos computadores para realizar suas operações básicas. Outras linguagens de programação são traduzidas em código de máquina para que o computador possa executá-las.

Uma instrução informa ao processo qual operação executar. Cada instrução é composta por um opcode (código de operação) e operando(s). Os operandos são geralmente endereços de memória ou dados. Um conjunto de instruções é uma lista dos opcodes disponíveis para um computador. O código de máquina é para o qual o código assembly e outras linguagens de programação são compilados ou interpretados.

ISA[editar | editar código-fonte]

Instruction Set Architecture (ISA) é a parte do processador que é visível ao programador. Ela serve de fronteira entre o hardware e o software de baixo nível. A ISA de um processador pode ser descrita usando 5 categorias:

  • Armazenamento dos operandos no CPU
  • Número de operandos chamados por instrução
  • Localização dos operandos
  • Operações
  • Tipo e tamanho dos operandos

Os 3 tipos mais comuns de ISA são:

  1. Stack - Os operandos estão implicitamente no topo da pilha.
  2. Acumulador - Um operando é implicitamente o acumulador.
  3. General Purpose Register (GPR) - Todos os operandos são explicitamente mencionados, sejam eles registradores ou locais de memória.

Vamos ver o código assembly de

C = A + B;

em todas as 3 arquiteturas:

Stack Acumulador GPR
PUSH A LOAD A LOAD R1,A
PUSH B ADD B ADD R1,B
ADD STORE C STORE R1,C
POP C - -

Nem todos os processadores podem ser claramente marcados em uma das categorias acima. O i8086 possui muitas instruções que usam operandos implícitos, embora tenha um conjunto de registradores geral. O i8051 é outro exemplo, possui 4 bancos de GPRs mas a maioria das instruções deve ter o registrador A como um de seus operandos.

Quais são as vantagens e desvantagens de cada uma dessas abordagens?

Pilha[editar | editar código-fonte]

Vantagens: Modelo simples de avaliação de expressão (polimento reverso). Instruções curtas.

Desvantagens: Uma pilha não pode ser acessada aleatoriamente Isso dificulta a geração de código eficiente. A própria pilha é acessada a cada operação e se torna um gargalo.

Acumulador[editar | editar código-fonte]

Vantagens: Instruções curtas.

Desvantagens: O acumulador é apenas um armazenamento temporário, portanto, o tráfego de memória é o mais alto para essa abordagem.

GPR[editar | editar código-fonte]

Vantagens: Facilita a geração de código. Os dados podem ser armazenados por longos períodos em registradores.

Desvantagens: Todos os operandos devem ser nomeados levando a instruções mais longas.

As CPUs anteriores eram dos primeiros 2 tipos, mas nos últimos 15 anos todas as CPUs fabricadas são processadores GPR. As 2 principais razões são que os registradores são mais rápidos que a memória, quanto mais dados puderem ser mantidos internamente na CPU, mais rápido o programa será executado. A outra razão é que os registradores são mais fáceis de usar por um compilador.[1]

Referências[editar | editar código-fonte]

  1. http://www.cs.kent.edu/~durand/CS0/Notes/Chapter05/isa.html