DC-UFRPE/Licenciatura Plena em Computação/Arquitetura e organização de computadores/Instruções: Linguagem de Máquina
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:
- Stack - Os operandos estão implicitamente no topo da pilha.
- Acumulador - Um operando é implicitamente o acumulador.
- 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]