linguagens de montagem

22
LINGUAGENS de MONTAGEM RICARDO ANIDO

Upload: elsevier-saude

Post on 03-Aug-2016

224 views

Category:

Documents


0 download

DESCRIPTION

Este livro procura apresentar linguagens de montagem com a perspectiva de que elas são um ótimo meio de iniciar o estudo de arquitetura de processadores, e iniciar o estudo de como funcionam linguagens de alto nível. O projeto apresenta diversos exemplos de como construções de linguagens de mais alto nível são implementadas em linguagem de montagem (comandos repetitivos, comandos de seleção como IF ou SWITCH, passagem de parâmetros, recursão, etc).

TRANSCRIPT

Page 1: Linguagens de Montagem

Linguagens de montagem são as linguagens de programação mais básicas que existem. Apesar de linguagens de montagem para processadores distintos serem similares na forma, uma linguagem de montagem é intimamente ligada à arquitetura e ao conjunto de instruções do processador para a qual ela foi desenvolvida.

Este livro apresenta o conjunto de instruções e a linguagem de montagem corres-pondente de dois processadores: LEG, um processador didático, e ARM, um processador comercial muito utilizado atualmente, especialmente em dispositivos móveis. Grande quantidade e variedade de exemplos de programas são usadas para ilustrar, de forma didática, o funcionamento das instruções.

Durante a apresentação do conjunto de instruções dos processadores, conceitos fundamentais em outros tópicos importantes em computação são introduzidos:

• Organização de computadores, ilustrando o funcionamento interno básico de um processador e sua interação com memória e dispositivos de entrada e saída.

• Linguagens de programação, apresentando como comandos de linguagens de alto nível são traduzidos para linguagem de montagem pelos compiladores, incluindo tópicos como implementação de variáveis locais a procedimentos, passagem de parâmetros por valor e por referência, retorno de valor por funções e recursão.

• Sistemas operacionais, mostrando como funcionalidades específicas do proces-sador são usadas para proteção do próprio Sistema Operacional, como interrup-ções, exceções e modos supervisor/usuário.

Para permitir que os leitores implementem e testem seus próprios programas em linguagem de montagem, em www.elsevier.com.br são disponibilizadas para uso gratuito ferramentas especialmente desenvolvidas em Java, possibilitando que siste-mas compostos por dispositivos como botões, leds, temporizadores e mostradores de sete segmentos sejam desenvolvidos e executados no computador do leitor.

Com o conhecimento adquirido no livro, o leitor certamente se tornará um profis-sional mais completo e um melhor programador, mesmo que utilize apenas lingua-gens de programação de alto nível.

LING

UA

GEN

S de MO

NTA

GEM

LINGUAGENSde MONTAGEM

RIC

AR

DO

AN

IDO

RICARDO ANIDO

Page 2: Linguagens de Montagem

LINGUAGENSde MONTAGEMRICARDO ANIDO

Page 3: Linguagens de Montagem

© 2016, Elsevier Editora Ltda.Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998.Nenhuma parte deste livro, sem autorização prévia por escrito da editora, poderá ser reproduzida ou transmitida sejamquais forem os meios empregados: eletrônicos, mecânicos, fotográficos, gravação ou quaisquer outros.

ISBN: 978-85-352-8520-8ISBN (versão digital): 978-85-352-8521-5

Copidesque: Anna Carolina da Costa AvelhedaRevisão tipográfica: Marco Antonio Corrêa

Elsevier Editora Ltda.Conhecimento sem FronteirasRua Sete de Setembro, 111 – 16º andar20050-006 – Centro – Rio de Janeiro – RJ

Rua Quintana, 753 – 8º andar04569-011 – Brooklin – São Paulo – SP

Serviço de Atendimento ao Cliente0800 026 53 [email protected]

Consulte nosso catálogo completo, os últimos lançamentos e os serviços exclusivos no site www.elsevier.com.br.

NOTAMuito zelo e técnica foram empregados na edição desta obra. No entanto, podem ocorrer erros de digitação, impressãoou dúvida conceitual. Em qualquer das hipóteses, solicitamos a comunicação ao nosso serviço de Atendimento ao Clientepara que possamos esclarecer ou encaminhar a questão.Para todos os efeitos legais, nem a editora, nem os autores, nem os editores, nem os tradutores, nem os revisores oucolaboradores, assumem qualquer responsabilidade por qualquer efeito danoso e/ou malefício a pessoas ou propriedadesenvolvendo responsabilidade, negligência etc. de produtos, ou advindos de qualquer uso ou emprego de quaisquermétodos, produtos, instruções ou ideias contidos no material aqui publicado.

A Editora

CIP-BRASIL. CATALOGAÇÃO NA PUBLICAÇÃOSINDICATO NACIONAL DOS EDITORES DE LIVROS, RJ

A616L

Anido, RicardoLinguagens de Montagem / Ricardo Anido. - 1. ed. Rio de Janeiro : Elsevier,

2016.

il. ; 24 cm.

ApêndiceInclui índiceISBN 978-85-352-8520-8

1. Computação. 2. Informática. I. Título.

16-31611 CDD:004CDU:004

Page 4: Linguagens de Montagem

Para Fátima e Clara

Page 5: Linguagens de Montagem

Agradecimentos

Este livro foi finalizado enquanto o autor estava em estágio de pós-doutoramento noImperial College, Londres, com bolsa da Fundação de Pesquisa do Estado de São Paulo(FAPESP, processo 2014/26560-5). O autor agradece à Fapesp, à Unicamp e ao ImperialCollege pela oportunidade. O autor agradece ainda às centenas de alunos da Unicampque, ao longo dos anos, como usuários compulsórios das ferramentas desenvolvidas e deversões anteriores do texto do livro, ajudaram a melhorar a qualidade das ferramentas edo livro.

Page 6: Linguagens de Montagem

Prefácio

Linguagens de montagem são as linguagens de programação mais simples que existem esão muito diferentes de linguagens de programação de alto nível como Python, C, C++,Java, Lua ou outras. Linguagens de montagem são difíceis de usar, porque não têm asfacilidades às quais programadores estão acostumados quando utilizam linguagens dealto nível. Por exemplo, em linguagens de montagem não há verificação de tipos, nemcomandos estruturados tais como for ou while, e mesmo estruturas de dados básicas emlinguagens de alto nível, como vetores de duas dimensões, são custosas de implementar.

Programas escritos em linguagem de montagem são dificilmente portáveis, pois umalinguagem de montagem é estreitamente ligada a uma dada arquitetura de processador.Uma arquitetura de processador basicamente descreve os componentes internos doprocessador, o conjunto de instruções que o processador pode executar e como essasinstruções devem ser codificadas para que o processador possa interpretá-las e executá-lascorretamente. Em linguagemdemontagemnormalmente há um comando correspondentepara cada instrução do conjunto de instruções de um processador, o que faz com quelinguagens de montagens sejam muito próximas do hardware, e muito dependentes deuma arquitetura específica de processador. Assim, um programa escrito em linguagemde montagem para uma determinada arquitetura (como INTEL x86, ARM, MIPS, etc.)em geral não é facilmente adaptável para um processador de arquitetura diferente.

Quando os primeiros computadores comerciais foram construídos, linguagens demontagem eram praticamente as únicas linguagens de programação disponíveis, de formaque virtualmente todos os programas eram escritos em linguagens de montagem. Mesmodepois do aparecimento de muitas outras linguagens de programação, alguns programas,como por exemplo sistemas operacionais, continuaram a ser escritos usando somentelinguagens de montagem. Hoje em dia, no entanto, não há sentido em usar linguagensde montagem para escrever qualquer programa de médio porte: para quase qualquertipo de aplicação, o programador encontrará uma linguagem de programação que émais apropriada do que linguagem de montagem como ferramenta de implementação.Ainda assim, linguagens de montagem são usadas regularmente e há muitas razões paraestudá-las.

Um compilador é um programa que transforma um programa escrito em uma lin-guagem de programação para um código que pode ser executado em uma determinada

Page 7: Linguagens de Montagem

x Prefácio

arquitetura de processador. A maioria dos compiladores para linguagens de alto nível, noentanto, não produz diretamente código executável: produz na realidade um programaem linguagem de montagem, que é então traduzido para código executável. Versões atu-ais de compiladores para linguagens de alto nível geram código extremamente eficiente,considerando tanto a quantidade de memória que o código necessita para executar, comoo tempo que o código gerado leva para executar. Entretanto, algumas aplicações têmnecessidades muito especiais, difíceis de implementar usando linguagens de alto nível deforma eficiente, ou mesmo impossíveis de implementar em linguagens de alto nível. Emtais aplicações, partes são escritas em linguagem de montagem ou trechos escritos emlinguagem de alto nível são otimizados manualmente depois que o programa é traduzidoem linguagem de montagem pelo compilador. Exemplos de tais aplicações incluem:

• sistemas operacionais, que antigamente eram escritos inteiramente em linguagemde montagem e hoje em dia são escritos quase que totalmente em linguagens dealto nível (especialmente C e C++), mas contêm algumas partes que lidam comhardware de muito baixo nível;

• jogos e aplicações 3-D, nos quais velocidade de execução é vital para uma boaexperiência de usuário;

• sistemas de tempo real, nos quais tamanho do código é uma limitação, e rapidez naresposta é crítica, como sistemas de controle de voo ou marcapassos de coração.

Nessas aplicações, um bom entendimento de linguagens de montagem é essencial. Masprovavelmente a melhor razão para um cientista da computação estudar linguagens demontagem nos dias de hoje é que, pela razão de serem tão próximas da arquitetura do pro-cessador, elas são ferramentas excelentes para introduzir três tópicos muito importantespara cientistas da computação:

• arquitetura de computadores

• sistemas operacionais e

• linguagens de programação.

Obviamente, neste livro apenas alguns aspectos de cada um dos três tópicos são aborda-dos, e ainda assim de maneira introdutória, já que o objetivo é o estudo de linguagensde montagem. Mas o conteúdo do livro e os exercícios propostos permitem que o leitorganhe conhecimentos básicos que serão úteis para o estudo mais aprofundado dessestrês tópicos. E, mais importante, com o conhecimento adquirido o leitor se tornaráum melhor programador, mesmo que ele somente utilize linguagens de alto nível, poissaberá aproveitar da melhor maneira possível os recursos oferecidos pelo computador,por sistemas operacionais e por linguagens de programação.

Page 8: Linguagens de Montagem

Prefácio xi

Audiência

O material do livro é direcionado para cursos de graduação em Ciência ou Engenhariade Computação, cursos técnicos de formação em Computação, ou ainda cursos de gra-duação em Engenharia Elétrica ou Mecatrônica. É necessário conhecimento básico emprogramação; vários exemplos usam a linguagem C, mas apenas como forma de ilustrara tradução de comandos básicos de uma linguagem de alto nível para linguagem de mon-tagem. Conhecimento de outra linguagem, como Java ou Pascal, também é adequadopara acompanhar os exemplos.

Organização do livro

Neste livro estudaremos o conjunto de instruções e a linguagem de montagem corres-pondente de dois processadores: um fictício, didático, e um real, comercial. Na primeiraparte do livro é apresentado o processador didático, chamado LEG. No entanto, paraum melhor entendimento de linguagens de montagem, é imperativo estudar tambémum processador real. Assim, na segunda parte do livro é apresentado o processadorARM, atualmente um dos mais utilizados comercialmente, presente principalmente emdispositivos móveis, como tablets e telefones celulares.

Há vantagens e desvantagens em usar um processador fictício. A principal vantagemé que, livre das restrições que processadores reais têm, como consumo de energia,custo e tamanho, um processador fictício pode ser muito mais didático, com instruçõescodificadas de maneira simples, que pode ser facilmente entendida e mesmo montadamanualmente. Além disso, o conjunto de instruções pode demonstrar as principaiscaracterísticas de um processador real, como diferentes modos de endereçamento, masmantendo um número pequeno de instruções. Por outro lado, a desvantagem é queferramentas de software existentes, como montadores e ligadores, não podem ser usadas,e não é possível executar exemplos do livro diretamente em computadores e sistemasoperacionais reais. Para solucionar esse problema são fornecidas ferramentas paramontare executar código no processador fictício, como descrito na próxima Seção.

O livro está organizado da seguinte maneira. O Capítulo 1 apresenta como a infor-mação é representada na memória do computador, descrevendo como são representadosnúmeros inteiros, números fracionários e caracteres. O Capítulo 2 traz uma primeira in-trodução ao processador LEG e à organização básica de computadores, mostrando comofunciona um processador e sua comunicação com memória e dispositivos de entrada esaída. O Capítulo 3 introduz linguagens de montagens e descreve o funcionamento deum montador simples de dois passos, para montar um programa contido em um únicoarquivo, para que os leitores conheçam como um programa-fonte é processado de formaa poder ser executado pelo computador.

Os Capítulos de 4 a 8 apresentam em detalhes o repertório de instruções do proces-sador LEG, com vários exemplos de programação, sendo que o Capítulo 7 trata maisespecificamente da implementação de procedimentos. O Capítulo 8 trata de entrada esaída, mostrando as dificuldades e soluções para a comunicação do processador com o

Page 9: Linguagens de Montagem

xii Prefácio

mundo exterior. A segunda parte do livro apresenta, como estudo de caso, o processadorARM. Da mesma forma que no caso do processador LEG, o repertório de instruções doARM é apresentado e ilustrado através de vários exemplos de programas, nos Capítulosde 9 a 13. Finalmente, no Capítulo 14 são apresentados conceitos complementares aoestudo de linguagens de montagem: uma visão mais geral do funcionamento de mon-tadores para o caso de programas formados por vários módulos descritos em arquivosseparados, e o funcionamento de ligadores para juntar, em tempo de montagem ou emtempo de execução, os módulos montados separadamente pelo montador.

Ferramentas de Desenvolvimento

Para permitir que os leitores possam praticar e testar seus programas escritos em lin-guagem de montagem, estão disponíveis ferramentas de desenvolvimento que podem serutilizadas de forma gratuita.

A principal ferramenta disponibilizada é um simulador, capaz de executar códigoexecutável. Há duas versões do simulador: um simulador LEG e um simulador ARM. Osimulador LEG lê código binário gerado pelomontador para o processador LEG, tambémdisponibilizado. O simulador ARM lê código binário no formato ELF, gerado pordiversos montadores, comerciais ou de domínio público, como por exemplo o montadordo sistema GNU-Linux.

Em ambas as versões, LEG e ARM, o simulador inclui comandos para:

• execução passo a passo ou contínua;

• definição de pontos de parada (breakpoints) de caso de execução, leitura ou escritade posições de memória;

• visualização e alteração do estado da memória e de registradores;

• uso de interrupções e entrada e saída;

• e muitas outras funcionalidades.

Além disso, para permitir experiências com dispositivos de entrada e saída, os simula-dores LEG e ARM implementam também dispositivos de entrada e saída tipicamenteencontrados em sistemas computacionais, como conjuntos de leds de várias cores, botõesde liga/desliga, displays de sete segmentos, teclado de 12 teclas e outros.

Omontador LEG e os simuladores ARM e LEG foram implementados em Java e exe-cutam em virtualmente qualquer sistema operacional. As ferramentas estão disponíveisna internet, na página de recursos extras do livro:

www.elsevier.com.br

Uma descrição sucinta das ferramentas (montador LEG, simuladores dispositivos de E/S)é apresentada no Apêndice, ao final do livro.

Page 10: Linguagens de Montagem

Sumário

1 Organização da memória e representação digital da informação 11.1 Organização da memória de computadores . . . . . . . . . . . . . . . . 11.2 Representação de inteiros sem sinal . . . . . . . . . . . . . . . . . . . 31.3 Representação de números fracionários . . . . . . . . . . . . . . . . . 201.4 Representação de caracteres . . . . . . . . . . . . . . . . . . . . . . . 251.5 Ordem de bytes na palavra . . . . . . . . . . . . . . . . . . . . . . . . 281.6 Notação de números em programas de computadores . . . . . . . . . . 301.7 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2 Introdução à organização de computadores 332.1 Organização de computadores . . . . . . . . . . . . . . . . . . . . . . 332.2 O processador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.3 Modos de endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . 392.4 Um pequeno programa . . . . . . . . . . . . . . . . . . . . . . . . . . 412.5 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

3 Introdução a linguagens de montagem 433.1 Linguagens de montagem . . . . . . . . . . . . . . . . . . . . . . . . . 433.2 Como funciona um montador . . . . . . . . . . . . . . . . . . . . . . . 513.3 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

4 Transferência de dados 594.1 Copia registrador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594.2 Carrega registrador . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614.3 Carrega registrador com byte . . . . . . . . . . . . . . . . . . . . . . . 684.4 Armazena registrador . . . . . . . . . . . . . . . . . . . . . . . . . . . 704.5 Armazena byte de registrador . . . . . . . . . . . . . . . . . . . . . . . 724.6 Usos de modos de endereçamento por linguagens de alto nível . . . . . 744.7 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Page 11: Linguagens de Montagem

xiv Sumário

5 Instruções aritméticas e desvios 795.1 Adição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795.2 Subtração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815.3 Instruções de desvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835.4 Nova instrução aritmética: comparação . . . . . . . . . . . . . . . . . 895.5 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

6 Instruções lógicas e de deslocamento 1036.1 Instruções lógicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036.2 Instruções de deslocamento . . . . . . . . . . . . . . . . . . . . . . . . 1126.3 Instruções de rotação . . . . . . . . . . . . . . . . . . . . . . . . . . . 1166.4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

7 Procedimentos e funções 1237.1 Procedimentos em linguagens de programação . . . . . . . . . . . . . . 1237.2 Chamada e retorno de procedimento . . . . . . . . . . . . . . . . . . . 1307.3 Procedimentos com parâmetros . . . . . . . . . . . . . . . . . . . . . . 1347.4 Retorno de valores de funções . . . . . . . . . . . . . . . . . . . . . . 1397.5 Passagem de parâmetros por referência e por valor . . . . . . . . . . . . 1447.6 Variáveis locais a procedimentos . . . . . . . . . . . . . . . . . . . . . 1477.7 Recursão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1507.8 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

8 Entrada e saída 1558.1 Arquitetura de E/S . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1558.2 Instruções de entrada e saída . . . . . . . . . . . . . . . . . . . . . . . 1568.3 Sincronização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1618.4 Interrupções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1638.5 Exceções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1728.6 Interrupções e o sistema operacional . . . . . . . . . . . . . . . . . . . 1738.7 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

Estudo de caso: o processador ARM 181

9 ARM: características gerais 1839.1 O processador ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . 1839.2 Modos de Operação . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1839.3 Registradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1849.4 Instruções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1889.5 Arquitetura carrega/armazena . . . . . . . . . . . . . . . . . . . . . . . 1919.6 Unidade de deslocamento . . . . . . . . . . . . . . . . . . . . . . . . . 191

Page 12: Linguagens de Montagem

Sumário xv

9.7 Convenções do montador . . . . . . . . . . . . . . . . . . . . . . . . . 1929.8 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

10 Transferência entre registrador e memória 19510.1 Codificação das instruções de carga e armazenamento de registrador . . 19510.2 Endereçamento direto . . . . . . . . . . . . . . . . . . . . . . . . . . . 19610.3 Modo de endereçamento indireto por registrador . . . . . . . . . . . . . 19710.4 Modos de endereçamento pré-indexados . . . . . . . . . . . . . . . . . 19810.5 Modos de endereçamento pós-indexados . . . . . . . . . . . . . . . . . 20210.6 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206

11 Desvios e processamento de dados 20711.1 Desvios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20711.2 Processamento de dados . . . . . . . . . . . . . . . . . . . . . . . . . 20911.3 Multiplicação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21811.4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

12 Transferências múltiplas, pilhas e procedimentos 22512.1 Instruções para transferências múltiplas . . . . . . . . . . . . . . . . . 22512.2 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22812.3 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

13 Entrada, saída e interrupções 23913.1 Instruções para entrada e saída . . . . . . . . . . . . . . . . . . . . . . 23913.2 Interrupções e exceções . . . . . . . . . . . . . . . . . . . . . . . . . . 24113.3 Chamada a sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24613.4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249

14 Montadores, ligadores e carregadores 25114.1 Montando um programa dividido em módulos . . . . . . . . . . . . . . 25114.2 Seções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25614.3 O carregador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25814.4 Bibliotecas e ligação dinâmica . . . . . . . . . . . . . . . . . . . . . . 259

Apêndices 261A Montador para LEG . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261B Simuladores para LEG e ARM . . . . . . . . . . . . . . . . . . . . . . 263C Dispositivos de E/S para os simuladores . . . . . . . . . . . . . . . . . 272D Exemplos de uso das ferramentas . . . . . . . . . . . . . . . . . . . . . 279E Lista das instruções do LEG . . . . . . . . . . . . . . . . . . . . . . . 282

Page 13: Linguagens de Montagem

Capítulo 1

Organização da memória erepresentação digital da informação

Este capítulo apresenta como a informação é organizada e representada na memória docomputador. Ele introduz conceitos básicos de organização da informação na memória,como endereçamento e ordem de bytes, e mostra em detalhes como números e caracteressão representados na memória de computadores.

1.1 Organização da memória de computadores

A unidade de informação em sistemas digitais é o bit, que pode assumir apenas doisvalores: zero ou um. Fisicamente um bit pode ser implementado em diversas tecnologias,como circuitos elétricos na memória do computador, ou meio magnético em unidadesexternas de armazenamento – não iremos entrar emmais detalhes neste livro. Amemóriado computador é composta de um número enorme destes circuitos de bits, organizados empalavras. Uma palavra é um conjunto de tamanho fixo de bits. Por exemplo, a Figura 1.1mostra a representação esquemática de uma memória com apenas oito palavras, em quecada palavra contém 16 bits.

Computadores diferentes podem usar palavras de tamanhos diferentes. Os primeiroscomputadores pessoais utilizavam palavras de oito bits (uma palavra de oito bits échamada de byte). Computadores pessoais atuais utilizam palavras de 32 ou 64 bits,enquanto computadores de maior porte utilizam palavras de 128 bits. A quantidade dememória de um computador é tradicionalmente medida em bytes, independentementedo tamanho da palavra utilizada. Mais especificamente, são utilizadas as abreviaçõesKB (kilobytes, ou seja, milhares de bytes), MB (megabytes, ou milhões de bytes), GB(gigabytes, ou bilhões de bytes) e TB (terabytes, ou trilhões de bytes). Em algunscontextos, usamos também o sistema binário para medir a quantidade de memória, comas abreviações KiB (Kibibytes, ou seja, 1024 bytes), MiB (mebibytes, ou 10242 bytes),GiB (gibibytes, ou 10243 bytes) e TiB (tebibytes, ou 10244 bytes).

Page 14: Linguagens de Montagem

2 Capítulo 1. Organização da memória e representação digital da informação

Figura 1.1: Esquema de memóriacom oito palavras de 16 bits.

A memória de um computador pode ser dividida em dois tipos: a memória primária,de acesso muito rápido mas com tamanho limitado, e uma memória secundária, deacesso bem mais lento mas com tamanho muito maior (discos rígidos, por exemplo).Os primeiros computadores pessoais possuíam apenas algumas centenas de milharesde bytes de memória primária e outras centenas de milhares de memória secundária.Computadores pessoais atuais possuem alguns gigabytes de memória primária, e cercade um terabyte de memória secundária.

A memória é um componente passivo do computador. O principal componente ativoé a unidade de processamento central, ou simplesmente processador. O processadoracessa a memória para leitura e para escrita, utilizando-a para armazenar informaçõesque devem ser processadas pelos programas.

Nos primeiros computadores a sequência de instruções a ser executada pela máquina(o “programa”) era construída como resultado da interconexão física, comfios e chaves, dealgumas centenas de componentes. Esse era o caso do primeiro computador de propósitogeral, o ENIAC (acrônimo do nome completo em inglês, Electronic Numerical Integratorand Computer) construído na década de 1940, na Universidade da Pennsylvania. A trocado “programa” a ser executado pela máquina durava dias; hoje em dia esse tipo demáquina é conhecido pelo nome de computador de programa fixo. O primeiro grandeavanço da área de programação foi a percepção de que o “programa” a ser executado,ou seja, a sequência de instruções que devem ser executadas pelo processador, poderiatambém ser armazenado na mesma memória utilizada para armazenar dados. Essaarquitetura, proposta ainda na década de 1940, ficou conhecida como arquitetura de VonNeumann, um de seus inventores. Essa descoberta mostrou que uma mesma máquinapoderia não apenas executar computações (programas) diferentes, mas que também osprogramas poderiam ser trocados muito rapidamente, em comparação com o tempo quedemorava para configurar uma máquina de programa fixo.

Como dados e instruções compartilham a mesma memória, e toda informação éarmazenada na memória do computador na forma de sequências de zeros e uns, a inter-

Page 15: Linguagens de Montagem

1.2. Representação de inteiros sem sinal 3

pretação dessas sequências é responsabilidade exclusiva do programador: o processadornão tem meios de determinar se uma dada sequência de bits representa por exemplo umainstrução ou um dado. E, se for um dado, se a sequência de bits representa um caractere,um valor inteiro ou um valor real. O programador é responsável por garantir que oprocessador interprete o conteúdo da memória corretamente.

Neste capítulo vamos estudar como números (inteiros e fracionários) e caracteressão representados na memória do computador. No capítulo seguinte veremos como sãorepresentadas as instruções a serem executadas pelo processador.

1.2 Representação de inteiros sem sinal

Estamos acostumados a representar números no sistema decimal, que utiliza dez dígitos(de 0 a 9). Como cada bit da memória do computador armazena apenas dois valores,é natural utilizar uma representação binária, que utiliza apenas os dígitos 0 e 1, pararepresentar valores inteiros no computador. No entanto, a manipulação de valores embinário, se conveniente para o computador, muitas vezes é inconveniente para nós,humanos, devido ao grande número de dígitos que temos que usar para descrever valoresaltos. A representação hexadecimal (que utiliza dezesseis dígitos) é uma alternativa maiscômoda do que a binária, por ser mais compacta. Nesta Seção vamos estudar esses doissistemas de representação de números, binário e hexadecimal, e suas relações com osistema decimal, com o qual estamos acostumados.

1.2.1 Notação Posicional

Os sistemas binário e hexadecimal, assim como o sistema decimal, são baseados nanotação posicional. Isto quer dizer que o valor representado por um dígito depende daposição que o dígito ocupa em um número. Por exemplo, o dígito 7 representa setentatanto em 671 quanto em 6375, por ser o segundo da direita para a esquerda em ambosos números. Já o dígito 6 representa 600 no primeiro número mas 6000 no segundonúmero, porque está em posições distintas nesses dois números. O sistema romano derepresentação de números é um exemplo de notação que não é posicional: o dígito Xvale dez tanto em XIII (em que é o primeiro a partir da esquerda e o quarto a partir dadireita) quanto em CCXV (em que é o terceiro a partir da esquerda e o segundo a partirda direita).

A base de um sistema numérico é o número de dígitos que esse sistema utiliza. Porexemplo, no sistema binário a base é 2, e no sistema hexadecimal a base é 16. O valor comque um dígito contribui para o valor total do número em uma representação posicional éo valor do dígito multiplicado por uma potência da base do sistema numérico usado. Seo número tem, em uma dada base b, a representação

dndn−1. . . d2d1d0

Page 16: Linguagens de Montagem

4 Capítulo 1. Organização da memória e representação digital da informação

em que cada di representa um dígito, então di contribui para o valor do número com ovalor do dígito di multiplicado pela base elevada à i-ésima potência. O dígito mais àesquerda, por representar a parcela de maior valor no número, é usualmente chamado dedígito mais significativo. Correspondentemente, o dígito mais à direita, que representa amenor parcela, é chamado de dígito menos significativo. O valor do número, em decimal,é dado pela Equação 1.1:

(δn×bn)+(δn−1×bn−1)+ . . .+(δ2×b2)+(δ1×b1)+δ0 (1.1)

em que cada expressão entre parênteses representa o valor (na base 10) de um dígito nabase b, e δi é o valor do dígito di na base 10.

Para uma determinada base b, necessitamos símbolos que identifiquem b valores dedígitos (de 0 a b−1). Para qualquer base b≤ 10, podemos usar os dígitos usuais de 0 ab− 1. Por exemplo, para base 8, usamos 0, 1, 2, 3, 4, 5, 6 e 7 para representar os oitodígitos. Para bases maiores que 10, é necessário acrescentar alguns símbolos aos usuais.Para base 16, em particular, a convenção é utilizar os símbolos 0,1,2, . . .8,9,A,B,C,D,Ee F, com os caracteres deA a F representando os dígitos de dez a quinze, respectivamente.

1.2.2 Conversão entre binário e hexadecimal

O número de valores distintos que podemos representar usando um número fixo dedígitos k em uma determinada base b é bk: cada dígito k pode tomar qualquer um dos bvalores entre 0 e b−1. Assim, se os valores a serem representados são inteiros positivos,podemos representar os números no intervalo [0,bk− 1]. Por exemplo, usando quatrodígitos na base 2 podemos representar todos os números no intervalo [0,15]. Note queeste exemplo ilustra uma correspondência interessante entre as representações binária ehexadecimal: quatro dígitos binários têm o mesmo poder de representação de um dígitohexadecimal (16 valores distintos). A Figura 1.2 mostra as representações dos númerosde 0 a 15 em binário e hexadecimal.

Como cada número binário de quatro bits corresponde a um dígito hexadecimal (evice-versa), podemos usar a representação hexadecimal como uma forma abreviada darepresentação binária, convertendo cada quatro bits para a representação hexadecimalequivalente. E como o número de bits do valor a ser convertido pode não ser múltiplode quatro, na conversão começamos a agrupar os bits da direita para a esquerda. Se oúltimo grupo não possuir quatro bits, simplesmente completamos o que falta com zeros(pois zeros à esquerda não influem no valor do número em notação posicional).

Page 17: Linguagens de Montagem

1.2. Representação de inteiros sem sinal 5

Decimal Binário Hexadecimal

0 0000 0

1 0001 1

2 0010 2

3 0011 3

4 0100 4

5 0101 5

6 0110 6

7 0111 7

8 1000 8

9 1001 9

10 1010 A

11 1011 B

12 1100 C

13 1101 D

14 1110 E

15 1111 F

Figura 1.2: Representação binária e hexadecimalde números inteiros de 0 a 15.

AFigura 1.3mostra dois exemplos de conversão binário para hexadecimal:1111011110002= F7816 e 111010001011102 = 3A2E16. No segundo exemplo, como o número de dí-gitos na representação binária não é múltiplo de quatro, completamos com dois zeros àesquerda.

Figura 1.3: Conversão debinário para hexadecimal.

Para converter hexadecimal em binário usamos o procedimento inverso. Ou seja, cadadígito hexadecimal é substituído pela representação binária do valor do dígito. AFigura 1.4 mostra um exemplo de conversão de hexadecimal para binário: 1D5416 =11101010101002. Como zeros à esquerda não são significativos, descartamos os trêszeros mais à esquerda da representação binária.

Page 18: Linguagens de Montagem

6 Capítulo 1. Organização da memória e representação digital da informação

Figura 1.4: Conversão dehexadecimal para binário.

1.2.3 Conversão de binário e hexadecimal para decimal

A Equação 1.1 pode ser utilizada diretamente para converter para a base decimalnúmeros representados em outras bases. É conveniente memorizar as primeiras po-tências de 16 para agilizar o processo de conversão entre hexadecimal e decimal:16,256,4096,65536 . . . Note que é mais fácil começar o cálculo a partir do dígito menossignificativo, de forma que a potência da base seja crescente. A Figura 1.5 mostra umaconversão de hexadecimal para decimal: 2A7F16 = 10909.

Figura 1.5: Conversão dehexadecimal para decimal.

A conversão de números binários em decimais se faz de forma similar, mas como omultiplicador é sempre 0 ou 1, basta efetuar a soma das potências de 2 para as posiçõesem que o dígito é 1. A Figura 1.6 ilustra a conversão de um número binário para decimal:101100012 = 177.

Figura 1.6: Conversão debinário para decimal.

Page 19: Linguagens de Montagem

1.2. Representação de inteiros sem sinal 7

Outra maneira de converter binário em decimal, que envolve um número menor demultiplicações, é fazer primeiro a conversão de binário para hexadecimal, usando ométodo de substituição direta, e então converter de hexadecimal para decimal.

1.2.4 Conversão de decimal para hexadecimal e binário

Considere novamente a Equação 1.1, que calcula o valor de um número N de n+1 dígitosem uma base b qualquer:

(δ n×bn)+(δn−1×bn−1)+ . . .+(δ2×b2)+(δ1×b1)+δ0

Se dividirmos N pela base b, o resto da divisão é δ0, pois este é o único termo da equaçãonão divisível pela base b. Note ainda que δ0 é a parcela correspondente ao dígito maisà direita na representação do número e que vale entre 0 e b−1. Assim, partindo de umnúmero decimal N, podemos determinar o dígito mais à direita na representação dessenúmero na base b tomando o resto da divisão de N por b. O quociente dessa divisão é

(δ n×bn−1)+(δn−1×bn−2)+ . . .+(δ3×b2)+(δ2×b1)+δ1

Novamente, cada termo é divisível por b exceto δ1. Se dividirmos este valor novamentepor b, resto da divisão será δ1 (portanto esse é o valor do segundo dígito da representaçãona base b) e o novo quociente será

(δ n×bn−2)+(δn−1×bn−3)+ . . .+(δ4×b2)+(δ3×b1)+δ2

e o processo continua até que o quociente seja zero. A Figura 1.7 mostra a conversãodo valor 2223 (decimal) para hexadecimal. O resto da primeira divisão é 15, que é ovalor do dígito menos significativo da representação hexadecimal (d0 = F16); o resto dasegunda divisão é 10 (d1 = A16), e o resto da terceira divisão é 8 (d2 = 816), de formaque 2223 = 8AF16.

Figura 1.7: Conversão de decimalpara hexadecimal.

Page 20: Linguagens de Montagem

8 Capítulo 1. Organização da memória e representação digital da informação

A conversão de decimal para binário também pode ser feita pelo mesmo método. Outramaneira, que envolve um número menor de divisões, é primeiro converter o númerodecimal para hexadecimal e então fazer a substituição de cada dígito pela representaçãobinária correspondente.

1.2.5 Aritmética em hexadecimal

Quando programamos ou depuramos programas em linguagem de montagem às vezes énecessário somar e subtrair números em hexadecimal. Em vez de converter os númerospara decimal, efetuar a operação, e fazer a conversão do resultado para hexadecimal, éconveniente fazer a operação diretamente em hexadecimal. Aritmética em hexadecimalnão é muito diferente da decimal, pois o princípio é o mesmo. Basta lembrar que estamosem uma base diferente: na adição, o vai-um só ocorre quando a soma de uma coluna dedígitos excede 15, e não 9. Na subtração, quando tomamos 1 emprestado de uma colunamais à esquerda, é preciso lembrar que esse empréstimo representa 16 e não 10. AsFiguras 1.8 e 1.9 mostram exemplos de soma e subtração em hexadecimal.

Figura 1.8: Somando 4ED316 e 1A6916,com resultado 693C16.

Page 21: Linguagens de Montagem

1.2. Representação de inteiros sem sinal 9

Figura 1.9: Subtraindo 4A8716 de 83B516,com resultado 392E16.

Outro caso comum é a necessidade de multiplicação de um número hexadecimal por umapotência de 2 como 2, 4, ou 8. Neste caso, é mais fácil fazer primeiro a conversão parabinário e efetuar a operação embinário, pois paramultiplicar umnúmero na representaçãobinária por 2 basta acrescentar um zero à direita. Da mesma forma, para multiplicar umnúmero hexadecimal por 16 basta acrescentar um zero à direita da representação dessenúmero emhexadecimal. Note ainda que para dividir por 2 umnúmeroN na representaçãobinária basta eliminar o dígito menos significativo, deslocando para a direita todos osoutros dígitos. O dígito eliminado é o resto da divisão de N por 2 (zero ou um).

1.2.6 Representação de inteiros sem sinal

Como vimos, um número com k dígitos na base b pode representar bk valores distintos.Se quisermos representar somente números naturais (inteiros positivos), podemos repre-sentar os números de 0 a bk− 1. Por exemplo, na representação binária com 16 bits,podemos representar naturais de 0 a 216−1, ou seja, de 0 a 65535.

1.2.7 Representação de inteiros com sinal

Normalmente não queremos representar somente números positivos, mas também nega-tivos. Vamos considerar três métodos de representação, em binário, de números inteiroscom sinal: sinal e magnitude, complemento de um e complemento de dois. Os trêsmétodos têm em comum o fato de reservar um bit para indicar que o valor representadoé negativo. Nos três métodos, o bit reservado é o mais à esquerda, ou seja, o bit maissignificativo. Este bit é usualmente chamado bit de sinal, e, por convenção, o bit desinal igual a 1 significa que o valor representado é negativo. Nos exemplos a seguir,consideraremos sempre números com 16 bits.

Page 22: Linguagens de Montagem

Linguagens de montagem são as linguagens de programação mais básicas que existem. Apesar de linguagens de montagem para processadores distintos serem similares na forma, uma linguagem de montagem é intimamente ligada à arquitetura e ao conjunto de instruções do processador para a qual ela foi desenvolvida.

Este livro apresenta o conjunto de instruções e a linguagem de montagem corres-pondente de dois processadores: LEG, um processador didático, e ARM, um processador comercial muito utilizado atualmente, especialmente em dispositivos móveis. Grande quantidade e variedade de exemplos de programas são usadas para ilustrar, de forma didática, o funcionamento das instruções.

Durante a apresentação do conjunto de instruções dos processadores, conceitos fundamentais em outros tópicos importantes em computação são introduzidos:

• Organização de computadores, ilustrando o funcionamento interno básico de um processador e sua interação com memória e dispositivos de entrada e saída.

• Linguagens de programação, apresentando como comandos de linguagens de alto nível são traduzidos para linguagem de montagem pelos compiladores, incluindo tópicos como implementação de variáveis locais a procedimentos, passagem de parâmetros por valor e por referência, retorno de valor por funções e recursão.

• Sistemas operacionais, mostrando como funcionalidades específicas do proces-sador são usadas para proteção do próprio Sistema Operacional, como interrup-ções, exceções e modos supervisor/usuário.

Para permitir que os leitores implementem e testem seus próprios programas em linguagem de montagem, em www.elsevier.com.br são disponibilizadas para uso gratuito ferramentas especialmente desenvolvidas em Java, possibilitando que siste-mas compostos por dispositivos como botões, leds, temporizadores e mostradores de sete segmentos sejam desenvolvidos e executados no computador do leitor.

Com o conhecimento adquirido no livro, o leitor certamente se tornará um profis-sional mais completo e um melhor programador, mesmo que utilize apenas lingua-gens de programação de alto nível.

LING

UA

GEN

S de MO

NTA

GEM

LINGUAGENSde MONTAGEM

RIC

AR

DO

AN

IDO

RICARDO ANIDO