Sunteți pe pagina 1din 75

Arquitetura de Computadores

Anotaes de aula

Luciano Jos Senger


Copyright
c 2015 Luciano Jos Senger

Este trabalho est em constante evoluo. No imprima este material, preserve o meio ambiente!

March 2015
Sumrio

1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1 A unidade central de processamento 5
1.2 Objetivo 7

2 Arquitetura MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1 Arquitetura MIPS 10
2.1.1 Conjunto de registradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1.2 Exemplo de cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.3 Pseudo-instrues comuns de Montadores MIPS . . . . . . . . . . . . . . . . . . . . . 12
2.1.4 Formatos de Instruo MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.5 Intrues lgicas a aritmticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2 Exerccios 14
2.3 O simulador SPIM 16
2.3.1 Executando programas no XSPIM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3.2 Uso da memria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4 Segmento de dados e E/S com assembly do MIPS 19
2.4.1 Utilizao de variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.2 Servios do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5 Ponto Flutuante no MIPS 23
2.6 Procedimentos 27
2.6.1 Procedimentos e a pilha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.7 Entrada e Sada 30
2.8 Entrada e sada atravs de polling 30
2.9 Excees de Execuo no MIPS 31
2.10 Exerccios 37
3 Famlia de processadores x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.1 A arquitetura x86 39
3.1.1 Utilizao do programa DEBUG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2 Linguagem de montagem 41
3.2.1 Organizao da memria nos processadores 8086/8088 . . . . . . . . . . . . . . 45
3.2.2 Organizao da memria pelo software bsico do DOS . . . . . . . . . . . . . . 45
3.3 Instrues de transferncia de controle 48
3.4 Arquitetura x86 de 32 bits 51
3.5 Montagem do programas em Assembly no Linux 52
3.6 Procedimentos na arquitetura Intel de 32 bits 55
3.6.1 Trabalhando com os argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . ....... 58
3.6.2 Ligao de cdigo em 32 bits na linguagem C . . . . . . . . . . . . . . . ....... 58
3.6.3 Verificando em tempo de execuo as chamadas de sistema . . ....... 64
3.6.4 Interao com o sistema operacional: obtendo os argumentos da linha de
comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....... 65
3.6.5 Um pouco mais sobre o alinhamento . . . . . . . . . . . . . . . . . . . . . . . ....... 66
3.6.6 Utilizao de macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....... 67
3.7 Chamada a rotinas externas 68
3.8 Arquitetura de 64 bits 68

4 Concluso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
A unidade central de processamento
Objetivo

1 Introduo

1.1 A unidade central de processamento


Na maioria dos equipamentos eletrnicos atuais, desde os portteis (como celulares e ta-
blets), passando pelas estaes de trabalho desktop at os supercomputadores, h no mnimo
uma Unidade Central de Processamento (UCP). Em sistemas de computao atuais, a UCP
implementada em um microprocessador por meio de uma nica pastilha (chip), chamada de
circuito integrado, responsvel pelo processamento. O microprocessador implementa todas
as funes aritmticas e lgicas, funes de temporizao e interao com outros dispositivos
perifricos, como as memrias de armazenamento voltil e dispositivos de entrada e sada. Alm
de computadores tradicionais, microprocessadores esto presentes em vrios equipamentos e so
responsveis por controlar as operaes em mquinas do cotidiano, desde geladeiras at sistemas
de injeo eletrnica em automveis. Microprocessadores apresentam quatro caractersticas
bsicas: Conjunto de instrues (tambm chamado de arquitetura do conjunto de instrues),
tamanho de palavra (representado em bits), velocidade de clock (em MHz ou GHz) e nmero de
unidades de processamento (ncleos). Tais caractersticas permitem diferenciar os processadores
entre si e ao longo da histria.
Embora a histria dos computadores e da computao remonte ao ano 3.000 (AC), com a
inveno e utilizao do baco, foi a partir da dcada de 1940 que houveram grandes avanos
na computao, com a definio e implementao dos primeiros computadores eletrnicos de
programa armazenado. Essa dcada definiu a terceira gerao da computao e definiu as bases
para a construo dos processadores contemporneos. Mais tarde e a partir da dcada de 70,
avanos significativos ocorreram com a criao do primeiro circuito integrado e com a dissemi-
nao dos microprocessadores. Desde ento, a indstria dos microprocessadores tem crescido
sob a regncia da Lei de Moore, que pressupoe que o desempenho dos microprocessadores dobra
a cada 18 meses, com reflexo direto da integrao e densidade de componentes por circuito
integrado.
Esse crescimento permitiu que a integrao de componentes, que era em torno de milhares
de transistores em 1971 (com o Intel 4004, um processador de 4 bits) passasse para a bilhes
de componentes em tempos atuais com os processadores de 64 bits. As melhorias em termos
de organizao interna dos microprocessadores com a incluso de nveis de memria cache,
unidades de execuo independentes, pipelines e tcnicas de predio de execuo permitiram
tambm que a escala de integrao de componentes fosse acompanhada por um acrescimento
6 Introduo

substancial de desempenho ao longo dos anos. Como reflexo, o crescimento da industria de


microprocessadores permitiu tambm a reduo de custos e dessa forma a disseminao da
computao, antes restrita a centros de computao isolados para toda a sociedade, na forma de
computadores pessoais, telefones e equipamentos microprocessados com software embarcado,
como modems, eletrnicos de uso geral e roupas.
A explorao correta do conjunto de instrues pelos programadores de software bsico,
sistemas operacionais e compiladores de vital importncia para o desempenho, confiabilidade,
segurana do software e reduo do consumo de energia. Desastres e prejuzos financeiros tem
sido gerados pela falta do conhecimento dos detalhes do conjunto de instrues e da organizao
dos processadores.
Dentre os erros de programao mais divulgados e relacionados com detalhes da arquitetura
de computadores, destacam-se os casos de erro de software bsico no controle dos msseis Patriot
e do foguete Ariane 5 [5]. No caso dos msseis de defesa Patriot, como descreve o relatrio
estadunidense Patriot Missile Defense: Software Problem Led to System Failure at Dhahran,
o software bsico apresentou um erro, conforme explicado pelo fragmento de texto abaixo,
extrado do relatrio:

The range gates prediction of where the Scud will next appear is a function of the
Scuds known velocity and the time of the last radar detection. Velocity is a real num-
ber that can be expressed as a whole number and a decimal (e.g., 3750.2563...miles
per hour). Time is kept continuously by the systems internal clock in tenths of
seconds but is expressed as an integer or whole number (e.g., 32, 33, 34...). The
longer the system has been running, the larger the number representing time. To
predict where the Scud will next appear, both time and velocity must be expressed as
real numbers. Because of the way the Patriot computer performs its calculations and
the fact that its registers are only 24 bits long, the conversion of time from an integer
to a real number cannot be any more precise than 24 bits. This conversion results
in a loss of precision causing a less accurate time calculation. The effect of this
inaccuracy on the range gates calculation is directly proportional to the targets
velocity and the length of the system has been running. Consequently, performing
the conversion after the Patriot has been running continuously for extended periods
causes the range gate to shift away from the center of the target, making it less likely
that the target, in this case a Scud, will be successfully intercepted.

Devido a falha no sistema de defesa Patriot, msseis iraquianos SCUD atingiram o territrio do
Kuwait, durante a guerra do golfo, e no mnimo 28 pessoas foram mortas em 25 de fevereiro de
1991.
Em outro caso, o foguete Ariane 5 explodiu apenas 40 segundos aps deixar o solo. Seria a
primeira viagem do foguete, aps uma dcada de desenvolvimento e investimentos de 7 Bilhes
de dolares. O Foguete e a sua carga valiam 500 milhes de dolares. Aps investigao, o comit
responsvel concluiu que a causa da falha foi um erro de software, no sistema de controle inercial.
Os seguintes fragmentos de texto, extrados do relatrio final, explicam as causas:

On 4 June 1996, the maiden flight of the Ariane 5 launcher ended in a failure. Only
about 40 seconds after initiation of the flight sequence, at an altitude of about 3700
m, the launcher veered off its flight path, broke up and exploded.
The failure of the Ariane 501 was caused by the complete loss of guidance and
attitude information 37 seconds after start of the main engine ignition sequence (30
seconds after lift-off). This loss of information was due to specification and design
errors in the software of the inertial reference system.
1.2 Objetivo 7

The internal SRI* software exception was caused during execution of a data con-
version from 64-bit floating point to 16-bit signed integer value. The floating point
number which was converted had a value greater than what could be represented
by a 16-bit signed integer.

Outro desastre relacionado com o mau funcionamento do software de sistema ocorreu no Canad,
em 1985. Trs pessoas morreram e mais trs pessoas sofreram ferimentos graves quando uma
mquina de tratamento por radiao, chamada de Therac-25, apresentou defeito e entregou doses
letais de radiao aos pacientes. O erro foi causado pelo software operacional da mquina.
Tambm na dcada de 1980, em 1983 toda a humanidade poderia ser extinta por um erro no
sistema de defensivo sovitico (Rssia). Nesse ano, o sistema de alarme de msseis falsamente
indicou que os Estados Unidos haviam lanado 5 misseis ao territrio sovitico. Felizmente, os
russos interpretaram que se os Estados Unidos atacassem eles lanariam mais que 5 msseis e
que o sistema de controle deveria apresentar comportamento anmalo, fato que foi confirmado
posteriormente.
Tais fatos demonstram a importncia do estudo da organizao e arquitetura de computadores
para os estudantes da rea de computao: alunos de Cursos de Cincia da Computao precisam
saber os detalhes da arquitetura de instrues para criar compiladores; alunos de Cursos de
Sistemas de Informao e Engenharia de Software precisam saber dimensionar sistemas de
computao para a implantar tecnologias de informao; e alunos de Cursos de Engenharia de
Computao devem conhecer os detalhes da arquitetura dos computadores para projetar software
embarcado, otimizar o uso de compilador, desenvolver hardware de interface e projetar novos
processadores.

1.2 Objetivo
O objetivo deste texto apresentar detalhes de arquitetura de computadores, sob o ponto
de vista prtico, para o desenvolver de software bsico, comum em sistemas operacionais e
sistemas computacionais embarcados. Para esse objetivo, o livro organizado em duas partes
principais. Na primeira parte, so apresentados os conceitos de arquiteturas de conjunto reduzido
de instrues, por meio da descrio detalhada da arquitetura MIPS. Na segunda parte, conceitos
de arquiteturas de conjunto complexo de instrues so abordados com o estudo da arquitetura
x86.
Detalhes dos conjuntos de instrues so apresentadas por meio de exemplos prticos de
programas em linguagem de montagem e do resultado da compilao e montagem de programas
escritos na linguagem C. Ao longo do material, so informados detalhes dos softwares e sistemas
operacionais empregados, visando facilitar a reproduo dos experimentos relatados em aulas de
laboratrio.
Por ser empregado como material de apoio nas aulas de organizao e arquitetura de computa-
dores, que so dinmicas, esse material est em constante evoluo. Por isso e pela preocupao
com o meio ambiente, no se recomenda imprimir este material. Recomenda-se tambm verificar
no site 1 do autor a verso mais atualizada do texto.

1 http://www.ljsenger.net
Arquitetura MIPS
Conjunto de registradores
Exemplo de cdigo
Pseudo-instrues comuns de Montado-
res MIPS
Formatos de Instruo MIPS
Intrues lgicas a aritmticas
Exerccios
O simulador SPIM
Executando programas no XSPIM
Uso da memria
Segmento de dados e E/S com assembly
do MIPS
Utilizao de variveis
Servios do sistema
Ponto Flutuante no MIPS
Procedimentos
Procedimentos e a pilha
Entrada e Sada
Entrada e sada atravs de polling
Excees de Execuo no MIPS
Exerccios
2 Arquitetura MIPS

A partir da dcada de 1970, uma discusso sobre projeto de arquitetura de conjunto de ins-
trues tornou-se importante nas universidades e na indstria de computadores [4]. A discusso
era baseada em duas filosofias principais: construir computadores com conjuntos de instrues
simples, que realizam tarefas simples em um tempo de clock reduzido (Reduced Instruction
Set Computer - RISC), ou construir computadores com instrues mais complexas, que geram
programas de tamanho menor em memria e que necessitam de mais de um ciclo de clock para
serem executadas (Complex Instruction Set Computer - CISC).
At a decada de 1970 e 1980, os computadores seguiam a idia CISC, com arquiteturas com
conjuntos de instrues cada vez mais complexos. Por exemplo, um representante da filosofia
CISC, a famlia de computadores VAX era comum nos anos 1980 e inclua um conjunto de 304
instrues. Ao contrrio, o computador UC Berkeley RISC I que surgiu tambm na dcada
de 1980 continha apenas 31 instrues. Esse computador mais tarde deu origem ao processador
SPARC e a arquitetura MIPS.
A filosofia RISC surgiu do trabalho do grupo dos professores Patterson e Henessy, que
verificaram que grande parte das instrues existentes em uma arquitetura CISC no adotada
pelo compilador na traduo de cdigo em linguagem de alto nvel para linguagem de mquina [6].
Patterson constatou que o sistema operacional Unix completo, compilado para um sistema CISC
(Motorola 68000), utilizara apenas 30% de suas instrues. Assim, grande parte do conjunto
de circuitos eltricos dedicados decodificao e execuo das instrues era usada com baixa
frequncia ou mesmo no usada. Tal contribuio foi muito relevante para a indstria de
computadores da poca. Como exemplo, os computadores da famlia VAX implementavam 304
instrues, ao passo que o primeiro computador RISC, o UC Berkeley RISC I, implementava
apenas 32 instrues.
Nessa mesma poca, a idia de construir um processador empregando apenas uma pastilha
(chip) estava se tornando a tendncia do mercado. Agregar mais componentes em uma mesma
pastilha era um problema da indstria. Quanto mais componentes, maior a complexidade e o
custo de fabricao. Estava ficando difcil unir a filosofia CISC com a idia de apenas uma
pastilha. A arquitetura VAX foi um exemplo claro deste problema. Quando a DEC tentou produzir
uma verso da arquitetura VAX empregando apenas uma pastilha para o processador, eles
observaram que no conseguiriam implementar o conjunto inteiro de instrues na pastilha. A
soluo adotada foi implementar as instrues mais complexas: quando o processador encontrava
10 Arquitetura MIPS

tal instruo no programa, era gerada uma exceo que disparava uma interrupo interna. A
interrupo interna era uma sequncia de instrues aritmticas comuns que permitiam calcular
um polinmio.
Alm disso, processadores compostos de vrias pastilhas tornam-se mais lentos, desde que
h um atraso de comunicao entre os componentes do sistema. Por exemplo, o IBM PC tinha
as suas funes de processamento espalhadas pela placa me, com processador matemtico,
controlador de memria e gerenciador de interrupes alocados em pastilhas diferentes.
Arquiteturas RISC apresentam as seguintes caractersticas:
a maioria das instrues so executadas em apenas um ciclo de mquina;
a arquitetura de load/store, que significa que as nicas instrues que acessam a memria
so as instrues load e store. Na arquitetura MIPS, por exemplo, a sequncia de
operaes:
lw $ t 0 , 0 ( $ s p )
addi $t0 , $t0 , 1
sw $ t 0 , 0 ( $ s p )

Permite incrementar um valor armazenado em memria (referenciado pelo registrador $sp


aps uma sequncia da instruo lw e da sw. Ao contrrio, a instruo da arquitetura Intel:
add ebx , [ e c x ]

Permite somar ao registrador ebx um valor armazenado na memria e referenciado pelo


registrador ecx, sem necessidade de empregar previamente uma instruo de load.
as instrues tem tamanho fixo, por exemplo 32 bits;
a arquitetura de instrues ortogonal, pois todas as instrues podem empregar todos os
operandos (registradores);
o conjunto de instrues reduzido aquelas realmente necessrias, que no comprometam
o desempenho da implementao. Por exemplo, o processador SPARC no possui uma
instruo de multiplicao. Se o compilador encontra uma expresso como a seguir:
i = j k;

ele deve gerar uma sequncia de deslocamentos e somas que permitem resolver a expresso.
Ao contrario, na arquitetura Intel, o compilador empregaria a instruo imull;
Orthogonal architecture: qualquer instruo pode usar qualquer operando. Um contra-
exemplo a essa idia a instruo STOS, existente na arquitetura Intel, que armazena em
memria cpias de strings, que s pode ser empregada com os registradores EAX, ECX e
EDI;
Implementao da Unidade de Controle na forma hardwired e no com o uso de micropro-
grama.

2.1 Arquitetura MIPS


A arquitetura RISC mais popular a MIPS. Todas as instrues so de 32 bits e todas as
instrues que no acessam a memria executam em um ciclo de mquina. As instrues que
acessam a memria usam dois ciclos de mquina, caso haja um acerto de cache. Se no houver
um acerto de cache, o processador entra no estado de stall at que a memria cache esteja pronta.

2.1.1 Conjunto de registradores


O MIPS tem 32 registradores, descritos na tabela 2.1: importante salientar que o conjunto
2.1 Arquitetura MIPS 11

Tabela 2.1: Registradores da arquitetura MIPS


Registrador Mnemnico Descrio
$0 zero contm a constante zero
$1-$2 v0-v1 para retorno de valores
$4-$7 a0-a3 argumentos de procedimentos
$8-$15 t0-t7 temporrios
...
$28 gp ponteiro para memria
$29 sp ponteiro de pilha
$30 fp pointeiro de registro de ativao
$31 ra registrador para salvamento de retorno

de instrues ortogonal, de forma que a coluna Descrio apresenta apenas a conveno em-
pregada pelo software bsico MIPS. Por exemplo, a instruo add pode operar com quaisquer
registradores do banco.

2.1.2 Exemplo de cdigo


Para demonstrar como a gerao de cdigo para a arquitetura MIPS, podemos empregar a
ferramenta gcc
:
g c c S < n o m e d o a r q u i v o . c >

A opo -S traduz o cdigo em C:


int x , y ;
main ( ) {

x = 7;
y = 5;
soma ( x , y ) ;
exit (1);
}

R A gerao de cdigo para a arquitetura MIPS com o uso do gcc possvel em um sistema
real MIPS ou empregando uma tcnica de cross-compiling, onde um cdigo em linguagem
de alto nvel compilado para uma arquitetura alvo diferente do sistema real hospedeiro.
Assim, possvel gerar cdigo MIPS, por exemplo, empregando um sistema Linux que
est sendo executado em uma arquitetura x86.

Na listagem a seguir pode-se verificar quais foram as instrues, rtulos e diretivas empregadas
na compilao e montagem do programa. Algumas informaes foram suprimidas da listagem
para facilitar a leitura. A instruo li (Load Immediate) armazena o valor 7 no registrador
$21 . A instruo sw (Store Word) copia o valor do registrador para o endereo de memria x.
Instrues similares so empregadas para atualizar o valor de y. A instruo lw recupera os
valores de x e y em memria para os registradores $3 e $2.

1 Na verdade, li uma pseudo-instruo que ser convertida para a instruo MIPS real ori
12 Arquitetura MIPS

A pseudo-instruo move atribui os valores de $3 e $2 para os registradores $4 e $5, que so


usados pela conveno da arquitetura como parmetros de procedimentos. O objetivo preparar
a chamada para o procedimento ssoma. Nota-se aqui uma caracterstica de arquiteturas RISC,
pois os parmetros do procedimento (e tambm o retorno) so passados por registradores e no
pela pilha do sistema.

Listagem de Cdigo 2.1: Exemplo de cdigo em assembly MIPS


. comm x ,4 ,4
. comm y ,4 ,4
. text
. align 2
. globl main
. ent main
main :
li $2 , 7
sw $2 , x
li $2 , 5
sw $2 , y
lw $3 , x
lw $2 , y
move $4 , $3
move $5 , $2
jal soma
li $4 , 1
jal exit
soma :
addu $2 , $3 , $2
j $31

A subrotina soma invocado pela instruo:

Listagem de Cdigo 2.2: Exemplo de cdigo em assembly MIPS


jal soma

que significa jump and link. A instruo addu (Add unsigned) realiza a soma dos valores. Essa
instruo tem trs operandos, o primeiro o destino e os demais operandos fonte. o retorno da
subrotina faz uso do registrador $31:

2.1.3 Pseudo-instrues comuns de Montadores MIPS


Pseudo-instrues so instrues que parecem ao programador como instrues reais, mas
na verdade so instrues que so resolvidas pelo montador. Ao encontrar tais instrues, o
montador as traduz para um conjunto de instrues reais de mquina.
Algumas instrues apresentadas at aqui so pseudo-instrues. Por exemplo, a pseudo-
instruo li traduzida como:

Listagem de Cdigo 2.3: Exemplo de cdigo em assembly MIPS


o r i $2 , $0 , 7
2.1 Arquitetura MIPS 13

2.1.4 Formatos de Instruo MIPS


A arquitetura MIPS implementa trs formatos de instrues:
Os formatos esto descritos a seguir:
Formato I:
op: bits 31-26
rs (source): bits 25-21
rt (destination): bits 20-16
imm: bits 15-0
Formato J:
op: bits 31-26
dist: bits 25-0
Formato R:
op: bits 31-26
rs (source): bits 25-21
rt (source): bits 20-16
rd (destination): bits 15-11
shamt: bits 10-6
funct: bits 5-0
O campo shamt usado nas instrues que realizam o deslocamento de valores em registra-
dores. O campo dist no formato J corresponde a um nmero que representa 1/4 da distncia
para o alvo do desvio. Desde que as instrues MIPS tem 4 Bytes de tamanho, a distncia para
o alvo do desvio mltiplo de 4. O formato J usado para saltos incondicionais, que incluem
tambm a instruo call. Saltos condicionais empregam o formato I.
Note que o campo imm interpretado conforme o cdigo de operao. Na instruo addi ,
por exemplo, esse campo tratato como uma constante/nmero com sinal. Na instruo addiu,
esse campo tratado como um nmero sem sinal.

R Desde que o tamanho de palavra MIPS igual a 32, os valores imediatos de 16 bits
descritos pelo campo imm devem ser estendidos antes de serem processados pela ULA. Na
prtica estender um nmero de 16 bits para 32 bits significa copiar o bit mais significativo
do nmero de 16 bits para os demais bits at completar 32 bits. Por exemplo, a seguinte
sequncia de duas instrues:

Listagem de Cdigo 2.4: Exemplo de cdigo em assembly MIPS


a d d i $6 , $7 , 0 xb123
addiu $9 , $10 , 0 xb123

No primeiro caso, o valor 0xb123 estendido para o nmero de 32 bits 0xffffb123. Na


segunda instruo, o nmero resultante igual a 0x0000b123.
14 Arquitetura MIPS

2.1.5 Intrues lgicas a aritmticas


A listagem a seguir apresenta exemplos do conjunto de instruo MIPS.
Listagem de Cdigo 2.5: Exemplo de cdigo em assembly MIPS
add rd , r s , r t # r d < r s + r t
addu rd , r s , r t # r d < r s + r t ( w i t h o u t o v e r f l o w )
a d d i rd , r s , imm # r d < r s + imm

and rd , r s , r t # r d < r s AND r t


a n i rd , r s , imm # r d < r s AND imm

n o t rd , r s # r s < NOT r d

or rd , r s , r t # r d < r s OR r t
o r i rd , r s , imm # r d < r s OR imm

s l l rd , r t , s h a m t # r d < r t << s h a m t
s r l rd , r t , s h a m t # r d < r t >> s h a m t

sub rd , r s , r t # r d < r s r t
subu rd , r s , r t # r d < r s r t ( w i t h o u t o v e r f l o w )

2.2 Exerccios

Exerccio 2.1 Considerando o programa abaixo, determine o formato para cada instruo e
os valores decimais de cada campo: 

Listagem de Cdigo 2.6: Exemplo de cdigo em assembly MIPS


addi $v0 , $ z e r o , 0
lw $v1 , 0 ( $a0 )
sw $v1 , 0 ( $a1 )
addi $a1 , $a1 , 4
beq $v1 , $ z e r o , l o o p

Exerccio 2.2 Desenhe o grafo de controle para o programa a seguir: 

Listagem de Cdigo 2.7: Exemplo de cdigo em assembly MIPS


switch ( k ){
case 0: f = i + j ;
break ;
case 1: f = g + h ;
break ;
case 2: f = g h ;
break ;
case 3: f = i j ;
break ;
}
2.2 Exerccios 15

Exerccio 2.3 Converta para MIPS o seguinte programa na linguagem C, considerando que
o vetor a encontra-se armazenado no endereo base referenciado por $s0: 

Listagem de Cdigo 2.8: Exemplo de cdigo em assembly MIPS


int i = 0;
int j ;

j = 64;

while ( j < 128){


a [ i ] = a [ j ] + 1;
j += 1 ;
}

Exerccio 2.4 Converta para MIPS o programa seguinte, considerando que os endereos
base para as variveis esto em $s0 e $s1: 

Listagem de Cdigo 2.9: Exemplo de cdigo em assembly MIPS


# define a l f a 32;

int i ;
int x [64];

i n t main ( ) {

i = 0;
w h i l e ( i < 64 ) {
i f ( x [ i ] > 0)
x[ i ] = x[ i ] + alfa ;
else
x[ i ] = alfa ;
i ++;
}
}
16 Arquitetura MIPS

Exerccio 2.5 Gere um grafo de controle para o programa a seguir e converta esse programa
para o assembly do MIPS. 

Listagem de Cdigo 2.10: Exemplo de cdigo em assembly MIPS


i f ( a >= 5 ) {
b = c + d;
e = c + d;
} else {
b = c d;
e = c + 0;
}

2.3 O simulador SPIM


O SPIM [2, 3, 1] simulador que permite executar programas computacionais escritos em
assembly para o os processadores MIPS R2000 e R3000. O SPIM um sistema completo,
pois considera um sistema embarcado com processador, memria e sistema operacional para a
arquitetura MIPS.
O ambiente de simulao composto por janelas, sendo que cada uma apresenta informaes
sobre os detalhes da arquitetura e do programa em execuo.
1. Messages: apresenta as mensagens enviadas pelo ambiente de simulao, principalmente
sobre o carregamento do programa e erros de sintaxe e execuo;
2. Text Segment: esta janela mostra as instrues que foram carregadas para a memria, sem
a seo de dados;
3. Data Segment: esta janela corresponde ao segmento de dados, que so as variveis estticas
do programa;
4. Registers: apresenta os registradores e os valores contidos em cada registrador no instante
atual de execuo;
5. Console: esta janela permite que sejam inseridos dados para a comunicao com o
simulador XSPIM e que o programa em execuo possa enviar mensagens para o usurio.

2.3.1 Executando programas no XSPIM


Os segmentos de dados e de textos esto organizados de acordo com a seguinte conveno
na memria principal:

Listagem de Cdigo 2.11: Exemplo de cdigo em assembly MIPS


0 x00400000 T e x t s e g m e n t p r o g r a m i n s t r u c t i o n s
0 x10000000 D a t a s e g m e n t
0x7FFFFFFF , and d e c r e a s i n g a d d r e s s e s ,
Stack segment

Os programas que so executados no SPIM devem ser escritos na linguagem assembly.


conveniente que os programas sejam escritos em um editor de textos convencional (p.e. o vim) e
que o arquivo fonte seja salvo com a extenso .s.

Primeiro exemplo
Por exemplo, considere o programa que calcule a operao aritmetica f = (g + h) (i + j).
Edite e salve o cdigo abaixo com o nome de exemplo1.s e abra-o no SPIM atravs do menu
2.3 O simulador SPIM 17

File, Open.... Observe que os registradores esto todos zerados. Agora clique no menu Step
para executar o programa passo a passo. Observe agora a mudana no estado dos registradores.

Listagem de Cdigo 2.12: Exemplo de cdigo em assembly MIPS


. text

. g l o b l main

main :
l i $s1 , 1 5
l i $s2 , 3 6
a d d i $s3 , $ z e r o , 12
a d d i $s4 , $ z e r o , 19
add $ t 0 , $s1 , $ s 2
add $ t 1 , $s3 , $ s 4
sub $s0 , $ t 0 , $ t 1

Exerccio 2.6 A pseudo-instruo li $s1,15 convertida para qual instruo? 

2.3.2 Uso da memria


O programa anterior assume que os dados trabalhados pelo programa so passados pelas
instrues atravs do modo de endereamento imediato. Devido ao segmento de dados situar-se
longe do incio do programa (gp), a partir do endereo de memria 1000000016 , instrues de
load/store no podem referenciar dados com os seus 16 bits de offset. Por exemplo, para
carregar uma word do segmento de dados no endereo 1001002016 no registrador $v0 utiliza-se
duas instrues:

Listagem de Cdigo 2.13: Exemplo de cdigo em assembly MIPS


l u i $s0 , 0 x1001 # 0 x1001 s i g n i f i c a
# 1001 na b a s e 16
lw $v0 , 0 x0020 ( $ s 0 ) # 0 x10010000 +
# 0 x00000020
#= 0 x10010020

Para evitar de utilizar a instruo lui a cada load/store, os processadores MIPS dedicam um
registrador ($gp) como ponteiro global para o segmento de dados estticos. Esse registrador
contm o endereo 1000800016 , de forma que instrues load/store possam usar os bits de
offset para ter acesso ao primeiro 64 KB de memria no segmento de dados estticos. Com o
uso do ponteiro global, o exemplo por ser reescrito atravs de uma instruo simples:

Listagem de Cdigo 2.14: Exemplo de cdigo em assembly MIPS


lw $v0 , 0 x8020 ( $gp )

Segundo Exemplo
Por exemplo, atravs de um array de 10 elementos (words) que inicia no endereo de
memria gp (em direo aos endereos crescentes), escreva um programa que transfira este
array para os endereos a partir do endereo 2000:
18 Arquitetura MIPS

Listagem de Cdigo 2.15: Exemplo de cdigo em assembly MIPS

. data
. text
. g l o b l main

main :
addi $s0 , $gp , 0
addi $s1 , $gp , 2 0 0 0
addi $s2 , $gp , 0
addi $s2 , $s2 , 4 0
addi $t0 , $zero ,16

dados :
sw $ t 0 , 0 ( $ s 0 )
a d d i $s0 , $s0 , 4
addi $t0 , $t0 , 1 6
bne $s0 , $s2 , d a d o s
a d d i $s0 , $gp , 0

transfere :
lw $ t 0 , 0 ( $ s 0 )
sw $ t 0 , 0 ( $ s 1 )
a d d i $s0 , $s0 , 4
a d d i $s1 , $s1 , 4
bne $s0 , $s2 , t r a n s f e r e

Exerccio 2.7 Modifique o primeiro exemplo para calcular a expresso: f = (g h) + (i j).




Exerccio 2.8 Modifique o segundo exemplo de forma que sejam transferidas 15 itens do
array, considerando que o valor de incremento para o contedo do vetor seja igual a 4, e no
16. 

Exerccio 2.9 Calcule o valor do endereo inicial do array de destino de forma que os
dois arrays fiquem em regies consecutivas da memria. 

Exerccio 2.10 Modifique o segundo exemplo para seja calculado, a partir dos dados do
a[i]4
array original, a seguinte expresso: bi = a[i]+1 , sendo ai o elemento i do array fonte e b[i]
o elemento i do array destino. Considere a diviso como uma diviso inteira, sem considerar
a parte fracionria, e que o ltimo elemento do vetor destino b ter o valor igual a a[i]4
a[i] . Dica:
utilize a instruo MIPS div para as divises e sll para multiplicaes. 
2.4 Segmento de dados e E/S com assembly do MIPS 19

2.4 Segmento de dados e E/S com assembly do MIPS


A programao em linguagem assembly para o MIPS apresenta algumas facilidades para
o desenvolvimento de software. Um aspecto importante a possibilidade de utilizao de
variveis em memria, ao invs da utilizao de operaes de load/store utilizando diretamente
endereos de memria. Outro aspecto a utilizao de servios do sistema para realizar operaes
de E/S atravs do console. Tais aspectos so descritos nas sees a seguir.

2.4.1 Utilizao de variveis


A diretiva .data em linguagem assembly do MIPS permite informar ao montador o incio
do segmento de dados (data segment). nessa poro de memria que podem ser utilizadas
variveis e seus identificadores.
O primeiro exemplo mostra algumas maneiras de utilizar o segmento de dados, atravs da
declarao de variveis dos tipos .byte e .word. Na seo do cdigo de programa (.text),
pode-se observar a utilizao das variveis const1 e const2. Apesar das variveis serem
declaradas aparentemente como constantes, seus valores podem ser alterados durante a execuo
do programa, pois os nomes const1 e const2 so apenas facilidades disponibilizadas pelo
montador para o desenvolvimento de cdigo.

Listagem de Cdigo 2.16: Exemplo de cdigo em assembly MIPS


. data

const1 : . byte 1
const2 : . word 4
array1 : . b y t e 9 , 2 1 , 1 6 , 1 8 , 38
tam1 : . byte 5
array2 : . word 2 0 6 , 1 5 4 3 , 3 4 8 , 7 0 9 , 7 0 0 0 , 994
tam2 : . b y t e 24

. text

. g l o b l main
main :
l b $s0 , c o n s t 1
lw $s1 , c o n s t 2

A execuo deste cdigo no SPIM produz a seguinte sada para o segmento de dados
(os endereos de memria e as informaes adicionais foram suprimidas para melhorar a
apresentao):

Listagem de Cdigo 2.17: Exemplo de cdigo em assembly MIPS


DATA
0 x00000001 0 x00000004 0 x12101509 0 x00000526
0 x000000ce 0 x00000607 0 x0000015c 0 x000002c5
0 x00001b58 0 x000003e2 0 x00000018 0 x00000000

Pode-se obervar que o vetor 9,21,16,18,38 representado pela palavra 0x12101509 e pelo
primeiro byte da palavra 0x00000526. Como os dados so gravados sequencialmente na me-
mria, a varivel tam1 armazenada nessa mesma palavra, no segundo byte. Assim, pode-se
observar que o SPIM interpreta a ordem dos bytes em memria da forma little-endian, de
20 Arquitetura MIPS

forma que as palavras em memria so preenchidas de trs para frente 2 . O ltimo valor do
array1 armazenado em outra posio de memria e aps ele h um byte contendo o tamanho
do array. O array2 utiliza toda a posio de memria (word) para cada elemento.

Exerccio 2.11 Modifique o programa de forma que a varivel const2 armazene o valor
igual a -4, ao invs de 4, carregue o novo programa no SPIM e verifique a representao de
valores negativos na memria, utilizando complemento de 2. 

A directiva .space n permite reservar espao para uma varivel em memria, ini- cializando-
a com o valor 0:

Listagem de Cdigo 2.18: Exemplo de cdigo em assembly MIPS


. data
p a l a v r a 1 : . word 0 x10
espaco : . space 4
p a l a v r a 2 : . word 0 x20

Exerccio 2.12 Qual intervalo de posies foram reservadas para a varivel espaco?
Quantos bytes e palavras foram reservados no total? 

A directiva .align n alinha os dados em endereos mltiplos de 2:

Listagem de Cdigo 2.19: Exemplo de cdigo em assembly MIPS


. data
byte1 : . b y t e 0 x16
. align 2
espaco : . space 4
byte2 : . b y t e 0 x20
pal : . word 10

A linguagem assembly do MIPS fornece outros tipos alm de .word e .byte. Exemplos
so os tipos .double para armazenar valores de ponto flutuante com preciso dupla, o .float
para preciso simples, o .half para armazenar meias-palavras (16 bits) e o tipo .asciiz que
armazena strings.

2.4.2 Servios do sistema


O SPIM implementa um lista de servios que servem para facilitar principalmente na interface com
o usurio por meio de um console. Para utilizar um desses servios, basta colocar em $v0 o cdigo do
servio, definir os parmetros (se houverem) e em seguida utilizar a instruo syscall.
Tal forma de utilizao de servios, com pequenas diferenas, utilizada tambm em outras arquite-
turas para a comunicao com o cdigo do sistema operacional ou de uma seo de programas residentes
em memrias no volteis(p.e. BIOS) Os servios implementados pelo SPIM esto descritos em sua
documentao [2] e na Tabela 2.2.
A seguir apresentado um exemplo de programa em assembly do MIPS para o clculo de mdias de
notas:
2O
processador MIPS pode operar tanto em big-endian como em little-endian; o SPIM/SPIM utiliza o padro
da mquina que o simulador est sendo executado. Dessa forma, o SPIM/SPIM utiliza a forma de ordenao
little-endian no Intel 80x86 e big-endian no Macintosh.
2.4 Segmento de dados e E/S com assembly do MIPS 21

Tabela 2.2: Servios implementados pelo SPIM


Servio Cd. Parmetros Resultados
print_int 1 $a0 = integer
print_float 2 $f12 = float
print_double 3 $f12 = double
print_string 4 $a0 = string
read_int 5 integer (em $v0)
read_float 6 float (em $f0)
read_double 7 double (em $f0
read_string 8 $a0 = buffer, $a1 = length
sbrk 9 $a0 = quantidade, endereo (em $v0)
exit 10 Encerra a execuo do programa

Listagem de Cdigo 2.20: Exemplo de cdigo em assembly MIPS


. data
msg1 : . asciiz " \ n E n t r e o numero de a v a l i a c o e s : "
msg2 : . asciiz " \ n E n t r e um v a l o r p a r a a n o t a "
msg3 : . asciiz ": "
msg4 : . asciiz " \ nA media d a s n o t a s e : "
. text
. globl main
main :
add $ t 0 , $ z e r o , $ z e r o
add $ t 1 , $ z e r o , $ z e r o
numnotas :
l i $v0 , 4
l a $a0 , msg1
syscall
l i $v0 , 5
syscall
add $s0 , $v0 , $ z e r o
loopnotas :
addi $t0 , $t0 , 1
l i $v0 , 4
l a $a0 , msg2
syscall
l i $v0 , 1
add $a0 , $ z e r o , $ t 0
syscall
l i $v0 , 4
l a $a0 , msg3
syscall
l i $v0 , 5
syscall
add $ t 1 , $ t 1 , $v0
bne $ t 0 , $s0 , l o o p n o t a s
Calcula :
div $t1 , $s0
mflo $ t 2
l i $v0 , 4
l a $a0 , msg4
syscall
22 Arquitetura MIPS

l i $v0 , 1
add $a0 , $ z e r o , $ t 2
syscall
l i $v0 , 5
syscall

Exerccio 2.13 Para o programa abaixo, identifique quais aes esto sendo realizadas, atravs da
simulao da execuo no simulador SPIM:

Listagem de Cdigo 2.21: Exemplo de cdigo em assembly MIPS


. data

const1 : . byte 1
const2 : . word 4
array1 : . byte 9 , 2 1 , 1 6 , 4 , 38
tam1 : . byte 5
array2 : . word 2 0 6 , 1 5 4 3 , 3 4 8 , 7 0 9 , 7 0 0 0 , 994
tam2 : . byte 24

. text
. g l o b l main

main :
l b $s0 , c o n s t 1
lw $s1 , c o n s t 2
add $s2 , $ z e r o , $ z e r o
add $ t 0 , $ z e r o , $ z e r o
l b $ t 1 , tam1
soma1 :
lb $t2 , a r r a y 1 ( $t0 )
add $s2 , $s2 , $ t 2
add $ t 0 , $ t 0 , $ s 0
bne $ t 0 , $ t 1 , soma1
add $s3 , $ z e r o , $ z e r o
add $ t 0 , $ z e r o , $ z e r o
l b $ t 1 , tam2
soma2 :
lw $ t 2 , array2 ( $t0 )
add $s3 , $s3 , $ t 2
add $ t 0 , $t0 , $s1
bne $ t 0 , $ t 1 , soma2


2.5 Ponto Flutuante no MIPS 23

2.5 Ponto Flutuante no MIPS


A Figura 2.1 demonstra o panorama geral para a utilizao de ponto flutuante no MIPS.

R A traduo costumeira de floating point para ponto flutuante no adequada para o Brasil,
pois utilizamos a vrgula como separador entre a parte inteira e fracionria. A traduo
ideal seria vrgula flutuante.

Figura 2.1: Realizao de converses (casting) entre words e nmeros em ponto flutuante

Como outras arquiteturas, o MIPS admite os formatos de preciso simples e preciso dupla, de acordo
com o padro IEEE 754. Para a implementao das operaes em ponto flutuante, os projetistas da
arquitetura MIPS decidiram acrescentar 32 registradores de ponto flutuante separados, chamados de $f0,
$f1,... usados para preciso simples e preciso dupla. Para isso, foi necessrio incluir instrues de
load/store adicionais para movimentar os dados para os registradores de ponto flutuante, chamadas de
lwc1 e swc1. Um exemplo de cdigo em assembly para o MIPS, para carregar dois nmeros de preciso
simples da memria, som-los e depois armazenar o resultado na memria descrito abaixo:

Listagem de Cdigo 2.22: Exemplo de cdigo em assembly MIPS


lwc1 $f4 , x ( $sp )
lwc1 $f6 , y ( $sp )
add . s $f2 , $f4 , $ f 6
swc1 $f2 , x ( $sp )

Como exemplo, a instruo add.d $f0, $f2, $f4 realiza o clculo em preciso dupla.

R Apenas registradores de ndice para (por exemplo $f0, $f2 e $f8) podem ser empre-
gados em preciso dupla. Valores em preciso dupla so representados em 64 bits e
necessitam ser carregados usando dois registradores de 32 bits. Usar um registrador de
ndice impar em preciso dupla gera uma inconsistncia que detectada pela unidade de
controle MIPS. Tal inconsistncia dispara uma exceo (interrupo) no processamento
realizado pelo processador.

Outros exemplos:
sub.s e sub.d para subtrao
mul.s e mul.d para multiplicao
div.s e div.d para diviso
As instrues mov.s e mov.d copiam dados entre os registradores de ponto flutuante. Para transferir
dados entre o banco de registradores inteiros e o banco de registradores em ponto flutuante as instrues
mtc1 e mfc1 so empregadas:
24 Arquitetura MIPS

Listagem de Cdigo 2.23: Exemplo de cdigo em assembly MIPS


mtc1 $ t 0 , $ f 0 # $ f 0 = $ t 0
mfc1 $ t 0 , $ f 0 # $ t 0 = $ f 0

Exemplos de load/store:

Listagem de Cdigo 2.24: Exemplo de cdigo em assembly MIPS


lwc1 $f2 , 0 ( $a0 ) # $ f 2 = M[ $a0 ]
swc1 $f4 , 4 ( $ s p ) # M[ $ s p +4] = $ f 4

O nome c1 na instruo significa coprocessor 1.


A seguir, um exemplo para o clculo:

( f ahrenheit 32.0) 5.0


celsius = (2.1)
9.0

Listagem de Cdigo 2.25: Exemplo de cdigo em assembly MIPS


# $ f 1 2 tem o v a l o r a s e r c o n v e r t i d o
celsius :
l i $ t 0 , 32
mtc1 $ t 0 , $ f 4
c v t . s . w $f4 , $ f 4
l i . s $f6 , 0 . 5 5 5 5 5
sub . s $f0 , $f12 , $ f 4
mul . s $f0 , $f0 , $ f 6
jr $ra

A Figura 2.2 detalha o processo de converso (casting) em ponto flutuante, usado no programa com a
instruo cvt.s.w $f4, $f4.

Figura 2.2: Organizao MIPS para ponto flutuante

Uma questo importante que os projetistas de computadores enfrentam no suporte aritmtica


computacional de ponto flutuante se devem usar os mesmo registradores empregados pelas instrues
com inteiros ou acrescentar um conjunto especial de ponto flutuante. Como os programas realizam
operaes com inteiros e operaes com pontos flutuantes sobre dados diferentes, a separao dos
registradores o aumentar ligeiramente o nmero de instrues necessrias para executar um programa. O
maior impacto criar um conjunto separado de instrues de transferncia de dados para mover dados
entre os registradores de ponto flutuante e memria. Os benefcios dos registradores de ponto flutuante
separados so:
existncia do dobro dos registradores sem utilizar mais bits no formato de instruo;
dobro de largura de banda de registradores, com registradores separados para inteiros e nmeros
em ponto flutuante.
A Tabela 2.3 apresenta as instrues MIPS para ponto flutuante.
2.5 Ponto Flutuante no MIPS 25

Tabela 2.3: Instrues de ponto flutuante


Instruo Exemplo Significado Comentrio
Soma add.s $f2,$f4,$f6 $f2 = $f4 + $f6 Floating-Point add
(single precision)
Subtrao sub.s $f2,$f4,$f6 $f2 = $f4 - $f6 Floating-Point sub
(single precision)
Multiplicao mul.s $f2,$f4,$f6 $f2 = $f4 * $f6 Floating-Point mul-
tiply (single preci-
sion)
Diviso div.s $f2,$f4,$f6 $f2 = $f4 / $f6 Floating-Point
divide (single
precision)
Soma add.d $f2,$f4,$f6 $f2 = $f4 + $f6 Floating-Point add
(double precision)
Subtrao sub.d $f2,$f4,$f6 $f2 = $f4 - $f6 Floating-Point sub
(double precision)
Multiplicao mul.d $f2,$f4,$f6 $f2 = $f4 * $f6 Floating-Point mul-
tiply (double preci-
sion)
Diviso div.d $f2,$f4,$f6 $f2 = $f4 / $f6 Floating-Point
divide (double
precision)
Load lwc1 $f1,100($2) $f1 = Me- 32-bit data to FP re-
mory[$2+100] gister
Store swc1 $f1,100($2) Memory[$2+100] = 32-bit data to me-
$f1 mory
Desvio (se verdade) bc1t 100 if (cond == 1) go to PC relative branch if
PC+4+100 FP condition
Desvio (se falso) bc1f 100 if (cond == 0) go to PC relative branch if
PC+4+100 not condition
Comparao c.lt.s $f2,$f4 if ($f2 < $f4) Floating-point com-
(eq,ne,lt,le,gt,ge) cond=1; else pare less than single
cond=0 precision
Comparao c.lt.d $f2,$f4 if ($f2 < $f4) Floating-point com-
(eq,ne,lt,le,gt,ge) cond=1; else pare less than dou-
cond=0 ble precision
26 Arquitetura MIPS

Exerccio 2.14 Escreva um programa em assembly que imprima os 20 primeiros nmeros da


sequncia de Fibonacci. A sequncia de Fibonacci obtida, partindo com os nmeros 1 1, atravs
da soma dos dois nmeros anteriores. Por exemplo, a sequncia de nmeros 1, 1, 2, 3, 5, 8
descreve os 6 primeiros nmeros da srie de Fibonacci. 

Exerccio 2.15 Muitos experimentos foram feitos para averiguar a preferncia humana por formas
e propores. Uma proporo que parece ser a preferida entre todas, chamada de proporo urea
(), alm de ser esteticamente agradvel, compatvel com a fisiologia humana. A proporo urea
igual a = 1, 6180339. Esse nmero tem muitas qualidades fascinantes, notadas pela primeira vez
no Ocidente por Euclides, por volta de 300 a.C. Os artistas da renascena chamavam de "proporo
divina": organismos naturais, como o corpo humano, as plantas, os animais e todas as coisas vivas
esto relacionadas com essa proporo. A proporo urea pode ser obtida atravs da sequncia de
Fibonacci, dividindo quaisquer nmeros prximos da sequncia. medida que aumenta o nmero
de elementos da srie de Fibonacci, maior a preciso do valor de . A Figura 2.3 ilustra como a
proporo urea foi empregada na construo do Parthenon. Escreva um programa em assembly para
o MIPS que mostre como a proporo de ouro pode ser obtida atravs da sequncia de Fibonacci. 

Figura 2.3: Parthenon e a proporo de ouro


2.6 Procedimentos 27

2.6 Procedimentos
Procedimentos permitem utilizar sequncias de instrues frequentemente usadas em um programa
de maneira simples. Atravs de procedimentos, pode-se reduzir o nmero de vezes que tais instrues so
empregadas em seu cdigo. Com o uso de procedimentos, o cdigo torna-se legvel e a modularidade
incrementada.
Procedimentos tem caractersticas que so compartilhadas entre a maioria das linguagens de progra-
mao. As caractersticas principais so: argumentos, valores de retorno, dados locais e o comportamento.
Procedimento tambm tem dois atores: o caller, que o cdigo que chama o procedimento e o callee, que
o procedimento chamado. Note que em chamadas aninhadas 3 , o callee torna-se o caller de um outro
procedimento. Isso traz algumas complicaes que precisam ser resolvidas e que sero discutidas mais
adiante.
Um procedimento em MIPs tem a estrutura bsica listada a seguir:

Listagem de Cdigo 2.26: Exemplo de cdigo em assembly MIPS


procedimento :
jr $ra

O smbolo procedimento um rtulo que ser mapeado em um endereo de memria. O procedimento


retorna para a instruo seguinte a qual ele foi chamado com o uso da instruo jr $ra. Para invocar o
procedimento, emprega-se a instruo jal:

Listagem de Cdigo 2.27: Exemplo de cdigo em assembly MIPS


j a l procedimento

A instruo jal (Jump and link) salva o endereo do contador de programa (PC) no registrador $ra 4
e executa um salto incondicional para o endereo de parmetro (no exemplo, o rtulo procedimento).
O procedimento deve conter instrues para executar uma tarefa til. Existem algumas convenes 5
para criao de procedimentos em MIPS:
os registradores de valores salvos ($s0-$s7) devem conter o mesmo valor antes e depois da
ativao do procedimento;
o endereo em $ra deve ser preservado para ser empregado ao final do procedimento, visando o
retorno correto para a instruo seguinte ao jal;
os endereos dos registradores $sp e $fp devem conter os mesmos valores antes e aps a execuo
do procedimento;
no necessrio preservar o valor dos demais registradores ($a0-$a3; $t0-$t9; $v0-$v1).

2.6.1 Procedimentos e a pilha


A pilha uma rea de memria que serve para os seguintes propsitos em relao aos procedimentos:
passagem de argumentos para o procedimento;
memria para salvar e aps restaurar os valores dos registradores que sero alterados pelo procedi-
mento;
memria para salvar os registradores operacionais de procedimentos ($sp, $fp e $ra).
A topo da pilha referenciado pelo registrador $sp. Para incluir uma word na pilha utiliza-se a seguinte
sequencia de instrues:

Listagem de Cdigo 2.28: Exemplo de cdigo em assembly MIPS


a d d i $sp , $sp , 4
sw $s0 , 0 ( $ s p )

A listagem a seguir apresenta um exemplo de procedimento que segue as convenes MIPs e faz uso
da pilha para salvar e restaurar os registradores.
3 procedimentos que chamam outros procedimentos
4 lembre-se que no momento que a instruo jal est sendo executada, o contador de programa referencia a
prxima instruo do programa
5 convenes so regras que so importantes para que software de diferentes fontes possam coexistir
28 Arquitetura MIPS

Listagem de Cdigo 2.29: Exemplo de cdigo em assembly MIPS


procedure :
a d d i $sp , $sp , 12
sw $ r a , 8 ( $ s p )
sw $s0 , 4 ( $ s p )
sw $s1 , 0 ( $ s p )
a d d i $s0 , $ z e r o , 40
a d d i $s0 , $ z e r o , 22
sub $a0 , $s0 , $ s 1
jal procedure2
lw $s1 , 0 ( $ s p )
lw $s0 , 4 ( $ s p )
lw $ r a , 8 ( $ s p )
a d d i $sp , $sp , 12
jr $ra # return ;

A parcela de cdigo do procedimento onde alocado espao na pilha e os registradores so salvos


chamada de prefcio. A parcela que realiza a tarefa do procedimento chamada de corpo. A parcela que
restaura os valores da pilha para os registradores chamado de eplogo.
Na arquitetura MIPS, os registradores $a0-$a3 so empregados para passagem de parmetros. Se
houver necessidade ( que ocorre em procedimentos que recebem mais do que quatro parmetros de
entrada), a pilha empregada para a passagem dos argumentos adicionais.
Como exemplo, o programa a seguir demonstra um procedimento que recebe 4 argumentos atravs
dos registradores e um quinto argumento atravs da pilha. Note que o procedimento executa uma chamada
para o procedimento2 antes de retornar para o seu caller.

Listagem de Cdigo 2.30: Exemplo de cdigo em assembly MIPS


procedimento :
a d d i $sp , $sp , 4
sw $ r a , 0 ( $ s p )
add $a0 , $a0 , $a1
add $a0 , $a0 , $a2
add $a0 , $a0 , $a3
lw $ t 0 , 4 ( $ s p ) #
add $a0 , $a0 , $ t 0
jal procedure2
lw $ r a , 0 ( $ s p )
a d d i $sp , $sp , 4
jr $ra

O quinto argumento foi obtido a partir da pilha alm do espao alocado pelo prefcio. Um forma de
organizar a pilha para facilitar tal forma de acesso utilizar o registrador $fp.
O registrador $fp (emphframe pointer) referencia o endereo na pilha antes da alocao realizada
no prefcio. Se o procedimento utiliza o ponteiro de quadro, deve salv-lo na pilha. A listagem a seguir
demonstra como utilizar o $fp.
2.6 Procedimentos 29

Listagem de Cdigo 2.31: Exemplo de cdigo em assembly MIPS


procedimento :
a d d i $sp , $sp , 8
sw $fp , 4 ( $ s p )
sw $ r a , 0 ( $ s p )
a d d i $fp , $sp , 8
add $a0 , $a0 , $a1
add $a0 , $a0 , $a2
add $a0 , $a0 , $a3
lw $ t 0 , 0 ( $ f p )
add $a0 , $a0 , $ t 0
jal procedure2
lw $ r a , 0 ( $ s p )
a d d i $sp , $sp , 4
jr $ra

Variveis locais ao procedimento so alocadas na pilha e procedimentos que retornam valores,


chamados de funes, o fazem atravs do registrador $v0.
Quanto usados nmero em ponto flutuante, a conveno que os argumentos sejam passados pelos
registradores $f12-$f15. Os valores de retorno so atravs dos registradores $f0-$f1. A conveno
que os registradores $f0-$f19 devem ser salvos pelo caller. Os registradores $f20-$f31 devem ser
salvos pelo callee.

Exerccio 2.16 Escreva um procedimento em MIPS que calcule a soma dos elementos de um vetor.
O procedimento deve receber como argumentos o endereo base do vetor e uma word que indica o
tamanho do vetor. 

Exerccio 2.17 Escreva um procedimento em MIPS que calcule a mdia dos elementos de um
vetor. Para isso, empregue uma chamada para o procedimento anteriormente criado (soma) 

Exerccio 2.18 Escreva um procedimento que calcule o produto entre dois vetores. 

Exerccio 2.19 Escreva um procedimento que calcule a soma dos elementos recebidos como
argumentos na pilha. O ltimo argumento, topo da pilha, dever indicar a quantidade de argumentos
recebidos. 

Exerccio 2.20 Escreva um procedimento em MIPS que calcule o nmero de ouro (proporo
urea) atravs da sequencia de Fibonacci. O procedimento deve receber como parmetro o tamanho
da sequncia. 
30 Arquitetura MIPS

2.7 Entrada e Sada


Os processadores relacionam-se com o munto exterior por meio de um sistema de entrada e sada
(E/S). O sistema composto de interfaces e dispositivos. Interfaces so constitudas por circuitos, chamado
controladores ou dispositivo de E/S. Estas interfaces e controladores so especficas de cada perifrico
e o computador comunica com eles a fim de program-los e/o comunicar com os perifricos, lendo e
escrevendo em elementos endereveis chamados portos.
Quando os endereos destes portos correspondem a endereos do espao de memria do computador,
para ler ou escrever nestes portos utiliza-se as mesmas instrues que lem/escrevem da memria. Neste
caso diz-se que o sistema de E/S se encontra mapeado na memria. este o sistema utilizado no caso do
processador MIPS. Se, por outro lado, se utilizam instrues especiais, diz-se que o computador possui
um mapa de endereos de E/S independente (verses antigas de processadores da Intel).

2.8 Entrada e sada atravs de polling


A tcnica de polling realizada empregando um porto de leitura/escrita de dados e pelo menos um
porto de controle. O processador reconhece se o dispositivo est pronto atravs de um conjunto de bits de
estado.
Para o teclado, o porto de controle no SPIM est mapeado no endereo 0xffff0000. O bit 0 o
bit de estado, que indica que foi digitado um caracter no teclado. O endereo do porto de dados para
o teclado 0xffff0004. No SPIM, para sada de dados via console os endereos so: porto de dados:
0xffff000c e porto de controle 0xffff0008. Nesse caso, o bit 0 corresponde ao bit de estado que indica
que o dispositivo est pronto para escrita.

R O simulador SPIM deve ser executado com a opo Mapped I/O.

Listagem de Cdigo 2.32: Exemplo de cdigo em assembly MIPS


. data
buffer : . byte 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0

. text
. g l o b l main

main :

l a $s0 , b u f f e r
l u i $s1 , 0 x f f f f
a d d i $s3 , $ z e r o , 10

L1 : lb $t0 , 0( $s1 )
a n d i $ t 0 , $ t 0 , 0 x01
beq $ t 0 , $ z e r o , L1

lb $t1 , 4( $s1 )
sb $ t 1 , 0 ( $ s 0 )
a d d i $s0 , $s0 , 1
a d d i $s3 , $s3 , 1

bne $s3 , $ z e r o , L1

l i $v0 , 1 0
syscall

O cdigo a seguir demonstra o uso da entrada e sada para o console:

Listagem de Cdigo 2.33: Exemplo de cdigo em assembly MIPS


2.9 Excees de Execuo no MIPS 31

. d a t a 0 x10010000
msg : . a s c i i z " A r q u i t e t u r a de c o m p u t a d o r e s "
. data 0 xffff0008
c o u t : . s p a c e 1 # p o r t o de c o n t r o l e
. data 0 xffff000c
out : . s p a c e 1 # p o r t o de e s c r i t a
. text
. g l o b l main
main :
l a $a0 , msg
l a $a1 , o u t
l b $s0 , 0 ( $a0 )
l a $a2 , c o u t

L1 : l b $ t 0 , 0 ( $a2 )
andi $t0 , $t0 , 1
beq $ t 0 , $0 , L1
sb $s0 , 0 ( $a1 )
a d d i $a0 , $a0 , 1
l b $s0 , 0 ( $a0 )
bne $s0 , $ z e r o , L1

L2 : l b $ t 0 , 0 ( $a2 )
andi $t0 , $t0 , 1
beq $ t 0 , $0 , L1
sb $0 , 0 ( $a1 )
jr $ra

Exerccio 2.21 Escreva um programa em Assembly que leia at 10 caracteres do teclado e os


imprima em vdeo, sem utilizar syscalls. Utilize entrada e sada programada e os portos de entrada e
sada diretamente. 

2.9 Excees de Execuo no MIPS


A arquitetura MIPS considera uma exceo um alterao no esperada no fluxo do programa, que
podem ter origens interna e externa. Exemplos de excees internas so : overflows aritmticos, instrues
no definidas, falhas de pgina. Exemplos de excees externas, tambm chamadas como assncronas
pois no dependem diretamente do comportamento do programa, so: requisio de E/S por dispositivos
e erros de memria. A seguir, alguns exemplos de instrues que geram excees internas:

Listagem de Cdigo 2.34: Exemplo de cdigo em assembly MIPS


# d i v i d e by z e r o b r e a k p o i n t
div $t0 , $t0 , $zero
# arithmetic overflow
l i $t1 , 0 x 7 f f f f f f f
addi $t1 , $t1 , 1
# non e x i s t e n t memory a d d r e s s b u s e r r o r
sw $ t 2 , 1 2 4 ( $ z e r o )
# nona l i g n e d a d d r e s s a d d r e s s e r r o r
sw $ t 2 , 1 2 5 ( $ z e r o )
# invalid instruction
. word 0 x d e a d b e e f

comum designar uma exceo externa como interrupo. As excees internas so chamadas de
traps. Quando uma exceo ocorre, o controle de execuo transferido para outro programa, chamado de
32 Arquitetura MIPS

rotina de tratamento de exceo. Tal rotina faz parte do sistema operacional e dos software gerenciadores
de dispositivos (drivers). Aps a execuo desta rotina, o controle do processador devolvido ao
programa.
importante observar que a rotina de tratamento de exceo deve salvar o contexto do programa e
que, por ser invocada de forma assncrona, o cdigo executado no pode receber parmetros como um
procedimento regular MIPS. A arquitetura MIPS reserva os registradores $26 e $27 ($k0 e $k1) para
serem utilizados pela rotina de tratamento.
O coprocessador 0, que est sempre presente no MIPS (ao contrrio do coprocessador 1) empregado
para implementar o controle de excees. O sistema de memria virtual tambm implementado no
coprocessador 0.
O processador opera em dois modos possveis: user e kernel. O processador executa em modo
kernel quando ocorre uma exceo, pois o coprocessador 0 s pode ser usado nesse modo. H uma
parcela da memria do sistema disponvel apenas para o modo kernel. Os registradores do modo kernel
podem ser acessados com o uso das instrues da Tabela 2.4 e a Tabela 2.5 apresenta o registradores do
coprocessador 0.
O registrador BadVaddr (Bad virtual address) armazena o endereo de memria incorreto. Por
exemplo, um programa que acesse a memria com um endereo no alinhado ir gerar um exceo e
o endereo desalinhado e incorreto ser armazenado nesse registrador. O registrador Cause fornece
informaes sobre as interrupes pendentes (bit 10 a 15) e a causa da exceo. O cdigo da exceo
armazenado como um inteiro sem sinal nos bits 2 a 5 (Figura 2.4).

Tabela 2.4: Instrues para acesso ao contudo dos registradores do coprocessador 0


Instruo Comentrio
mfc0 Rdest, C0src Move o contedo do registrador do Coprocessador 0 C0src
para o registrador destino Rdest.
mtc0 Rsrc, C0dest O registrador de inteiros Rsrc movido para o
registo C0dest do Coprocessador 0.
lwc0 C0dest, address Carrega palavra a partir do endereo address para o registo C0dest.
swc0 C0src, address Armazena o contedo do registo C0src no endereo address na memria.

Tabela 2.5: Registradores do coprocessador 0


Registrador Nome Utilizao
8 BadVAddr Endereo de memria onde ocorreu a exceo.
12 Status Mscara da interrupo, bits enable e status na altura da interrupo.
13 Cause Tipo de excepo e bits de interrupes penden- tes.
14 EPC Endereo da instruo que causou a interrupo.

Figura 2.4: Registrador Cause

O registrador status (Figura 2.5) implementa uma mscara de interrupes nos bits 8 a 15 e
informao de estado nos bits 0 a 5.
A mscara de interrupes permite que mltiplos nveis de interrupes serem mascaradas ao invs
de todas as interrupes serem mascaradas de cada vez. Existem um total de 8 nveis de interrupo: 3
nveis de software e 5 nveis de hardware. Se o bit for igual a 1, o nvel correspondente de interrupes
habilitado.
2.9 Excees de Execuo no MIPS 33

Tabela 2.6: Excees


Cdigo Nome Descrio
0 INT Interrupo
4 ADDRL load de um endereo ilegal
5 ADDRS store para um endereo ilegal
6 IBUS Erro de barramento durante fetch de instruo
7 DBUS Erro de barramento referncia a dados.
8 SYSCALL Instruo syscall executada.
9 BKPT Instruo break executada.
10 RI Instruo reservada.
12 OVF Overflow aritmtico.

Figura 2.5: Registrador Status

Os bits kernel/user de habilitao de interrupes permitem que interrupes possam ser aninhadas.
Isso feito para que no se negligencie a ocorrncia de outras interrupes, especialmente quando uma
interrupo de baixa prioridade (por exemplo o disco de armazenamento) est sendo tratada e uma
interrupo de prioridade maior (teclado) ocorre.
O valor igual a 1 no bit de kernel/user indica que a rotina de tratamento est rodando em modo kernel
e um valor igual a 0 indica que est rodando em modo user. Os bits em uso pelo coprocessador so os
menos significativos do registrador. Assim, os bits de 0 a 5 implementam uma pilha de 3 nveis com
informao sobre as excees anteriores.
Quando uma interrupo ocorre, os bits so deslocados a esquerda por 2 e os bits 5 e 4 so perdidos.
Os bits 1 a 0 so substitudos por zeros, oque significa que as interrupes so desabilitadas (o que permite
que o cdigo tenha tempo de processamento para realizar aes de salvamento de valores antes de ser
interrompido por outras interrupes) e que a rotina est sendo executada em modo kernel A instruo
rfe (return from exception) desloca os bits 5 a 2 por duas posies.
Ao contrrio de uma chamada de procedimento, que emprega a instruo jal (que salva o endereo
de retorno no registrador $ra e transfere co controle para o endereo provido pela instruo), na chamada
da rotina de tratamento de exceo no existe uma chamada explcita. O controle transferido para
um endereo fixo em memria (0x80000080) quando uma exceo ocorre. A rotina de tratamento de
exceo deve estar localizada neste endereo. Nota-se que o mecanismo de tratamento de excees no
vetorizado. Se o tratamento fosse vetorizado, o dispositivo (excees externas) ou o cdigo do programa
(syscall) indicaria o endereo da rotina de tratamento, cada rotina em regies diferentes em memria.
O registrador epc (Exception Program Counter) empregado para armazenar o endereo da execuo
que estava sendo executada quando a exceo ocorreu. A arquitetura MIPS faz uma distino clara
entre interrupes (excees externas) e traps (chamadas explcitas de syscall. No caso de interrupo,
o contador de programa j foi avanado no momento que o controle foi transferido para a rotina de
tratamento. No caso de uma chamada para syscall, o contador de programa ainda no foi incrementado.
Assim, a seguir apresentada a sequncia de retorno no caso de uma interrupo:
34 Arquitetura MIPS

Listagem de Cdigo 2.35: Exemplo de cdigo em assembly MIPS


mfc0 $k0 , $ t 0
rfe
j r k0

e no caso de uma trap

Listagem de Cdigo 2.36: Exemplo de cdigo em assembly MIPS


mfc0 $k0 , $ t 0
addiu $k0 , 4
rfe
j r k0

Uma sequencia mais completa:

Listagem de Cdigo 2.37: Exemplo de cdigo em assembly MIPS


. t e x t 0 x80000080
mfc0 $k0 , $13 # $k0 = $Cause ;
mfc0 $k1 , $14 # $k1 = $EPC ;
a n d i $k0 , $k0 , 0 x003c # $k0 &= 0 x 0 0 3 c ;
bne $k0 , $ z e r o , NotIO
sw $ r a , s a v e 0 ( $0 )
j a l ReadByte
lw $ r a , s a v e 0 ( $0 )
j r $k1

A seguir, o cdigo completo do manipulador de excees MIPS:

Listagem de Cdigo 2.38: Exemplo de cdigo em assembly MIPS


# SPIM S20 MIPS s i m u l a t o r .
# The d e f a u l t e x c e p t i o n h a n d l e r f o r s p i m .
#
# C o p y r i g h t ( C ) 1990 2004 James Larus , l a r u s @ c s . w i s c . edu .
# ALL RIGHTS RESERVED .
#
# SPIM i s d i s t r i b u t e d u n d e r t h e f o l l o w i n g c o n d i t i o n s :
#
# You may make c o p i e s o f SPIM f o r y o u r own u s e and m o d i f y t h o s e c o p i e s .
#
# A l l c o p i e s o f SPIM m u s t r e t a i n my name and c o p y r i g h t n o t i c e .
#
# You may n o t s e l l SPIM o r d i s t r i b u t e d SPIM i n c o n j u n c t i o n w i t h a c o m m e r i c a l
# p r o d u c t o r s e r v i c e w i t h o u t t h e e x p r e s s e d w r i t t e n c o n s e n t o f James L a r u s .
#
# THIS SOFTWARE I S PROVIDED AS IS AND WITHOUT ANY EXPRESS OR
# IMPLIED WARRANTIES , INCLUDING , WITHOUT LIMITATION , THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE .
#

# $Header : $

# D e f i n e t h e e x c e p t i o n h a n d l i n g code . T h i s m u s t go f i r s t !

. kdata
2.9 Excees de Execuo no MIPS 35

__m1_ : . a s c i i z " Exception "


__m2_ : . a s c i i z " o c c u r r e d and i g n o r e d \ n "
__e0_ : . asciiz " [ Interrupt ] "
__e1_ : . a s c i i z " [ TLB ] "
__e2_ : . a s c i i z " [ TLB ] "
__e3_ : . a s c i i z " [ TLB ] "
__e4_ : . a s c i i z " [ Address e r r o r in i n s t / data f e t c h ] "
__e5_ : . a s c i i z " [ Address e r r o r in s t o r e ] "
__e6_ : . a s c i i z " [ Bad i n s t r u c t i o n a d d r e s s ] "
__e7_ : . a s c i i z " [ Bad d a t a a d d r e s s ] "
__e8_ : . a s c i i z " [ Error in syscall ] "
__e9_ : . a s c i i z " [ Breakpoint ] "
__e10_ : . a s c i i z " [ Reserved i n s t r u c t i o n ] "
__e11_ : . a s c i i z ""
__e12_ : . a s c i i z " [ Arithmetic overflow ] "
__e13_ : . a s c i i z " [ Trap ] "
__e14_ : . a s c i i z ""
__e15_ : . asciiz " [ Floating point ] "
__e16_ : . a s c i i z ""
__e17_ : . a s c i i z ""
__e18_ : . a s c i i z " [ Coproc 2 ] "
__e19_ : . a s c i i z ""
__e20_ : . a s c i i z ""
__e21_ : . a s c i i z ""
__e22_ : . a s c i i z " [MDMX] "
__e23_ : . a s c i i z " [ Watch ] "
__e24_ : . a s c i i z " [ Machine c h e c k ] "
__e25_ : . a s c i i z ""
__e26_ : . a s c i i z ""
__e27_ : . a s c i i z ""
__e28_ : . a s c i i z ""
__e29_ : . a s c i i z ""
__e30_ : . a s c i i z " [ Cache ] "
__e31_ : . a s c i i z ""
__excp : . word __e0_ , __e1_ , __e2_ , __e3_ , __e4_ , __e5_ , __e6_ , __e7_ , __e8_ , __e9_
. word __e10_ , __e11_ , __e12_ , __e13_ , __e14_ , __e15_ , __e16_ , __e17_ , __e18_ ,
. word __e19_ , __e20_ , __e21_ , __e22_ , __e23_ , __e24_ , __e25_ , __e26_ , __e27_ ,
. word __e28_ , __e29_ , __e30_ , __e31_
s1 : . word 0
s2 : . word 0

# T h i s i s t h e e x c e p t i o n h a n d l e r c o d e t h a t t h e p r o c e s s o r r u n s when
# an e x c e p t i o n o c c u r s . I t o n l y p r i n t s some i n f o r m a t i o n a b o u t t h e
# e x c e p t i o n , b u t can s e r v e r a s a model o f how t o w r i t e a h a n d l e r .
#
# B e c a u s e we a r e r u n n i n g i n t h e k e r n e l , we can u s e $k0 / $k1 w i t h o u t
# saving t h e i r old values .

# T h i s i s t h e e x c e p t i o n v e c t o r a d d r e s s f o r MIPS1 ( R2000 ) :
# . k t e x t 0 x80000080
# T h i s i s t h e e x c e p t i o n v e c t o r a d d r e s s f o r MIPS32 :
. k t e x t 0 x80000180
# S e l e c t t h e a p p r o p r i a t e one f o r t h e mode i n w h i c h SPIM i s c o m p i l e d .
. set noat
move $k1 $ a t # Save $at
. set at
36 Arquitetura MIPS

sw $v0 s 1 # Not ree n t r a n t and we can t t r u s t $ s p


sw $a0 s 2 # B u t we n e e d t o u s e t h e s e r e g i s t e r s

mfc0 $k0 $13 # Cause r e g i s t e r


s r l $a0 $k0 2 # E x t r a c t ExcCode F i e l d
a n d i $a0 $a0 0 x 1 f

# P r i n t i nf or mat io n about e x ce p t i on .
#
l i $v0 4 # syscall 4 ( print_str )
l a $a0 __m1_
syscall

l i $v0 1 # syscall 1 ( print_int )


s r l $a0 $k0 2 # E x t r a c t ExcCode F i e l d
a n d i $a0 $a0 0 x 1 f
syscall

l i $v0 4 # syscall 4 ( print_str )


a n d i $a0 $k0 0 x3c
lw $a0 _ _ e x c p ( $a0 )
nop
syscall

bne $k0 0 x18 ok_pc # Bad PC e x c e p t i o n r e q u i r e s s p e c i a l c h e c k s


nop

mfc0 $a0 $14 # EPC


a n d i $a0 $a0 0 x3 # I s EPC worda l i g n e d ?
beq $a0 0 ok_pc
nop

l i $v0 10 # E x i t on r e a l l y bad PC
syscall

ok_pc :
l i $v0 4 # syscall 4 ( print_str )
l a $a0 __m2_
syscall

s r l $a0 $k0 2 # E x t r a c t ExcCode F i e l d


a n d i $a0 $a0 0 x 1 f
bne $a0 0 r e t # 0 means e x c e p t i o n was an i n t e r r u p t
nop

# I n t e r r u p t s p e c i f i c code goes here !


# Don t s k i p i n s t r u c t i o n a t EPC s i n c e i t h a s n o t e x e c u t e d .

ret :
# R e t u r n f r o m ( noni n t e r r u p t ) e x c e p t i o n . S k i p o f f e n d i n g i n s t r u c t i o n
# a t EPC t o a v o i d i n f i n i t e l o o p .
#
mfc0 $k0 $14 # Bump EPC r e g i s t e r
addiu $k0 $k0 4 # Skip f a u l t i n g i n s t r u c t i o n
# ( Need t o h a n d l e d e l a y e d b r a n c h c a s e h e r e )
2.10 Exerccios 37

mtc0 $k0 $14

# R e s t o r e r e g i s t e r s and r e s e t p r o c e s o r s t a t e
#
lw $v0 s 1 # Restore other r e g i s t e r s
lw $a0 s 2

. set noat
move $ a t $k1 # Restore $at
. set at

mtc0 $0 $13 # C l e a r Cause r e g i s t e r

mfc0 $k0 $12 # Set Status re g i st e r


o r i $k0 0 x1 # I n t e r r u p t s enabled
mtc0 $k0 $12

# R e t u r n f r o m e x c e p t i o n on MIPS32 :
eret

# R e t u r n s e q u e n c e f o r MIPSI ( R2000 ) :
# rfe # Return from e x c e p t i o n h a n d l e r
# S h o u l d be i n j r s d e l a y s l o t
# j r $k0
# nop

# Standard s t a r t u p code . I n v o k e t h e r o u t i n e " main " w i t h a r g u m e n t s :


# main ( argc , argv , e n v p )
#
. text
. globl __start
__start :
lw $a0 0 ( $ s p ) # argc
addiu $a1 $ s p 4 # argv
addiu $a2 $a1 4 # envp
s l l $v0 $a0 2
addu $a2 $a2 $v0
j a l main
nop

l i $v0 10
syscall # s y s c a l l 10 ( e x i t )

. globl __eoth
__eoth :

2.10 Exerccios

Exerccio 2.22 Modifique o cdigo bsico de tratamento de excees do SPIM, inserindo o cdigo
abaixo. O programa define o cdigo necessrio para que a entrada de dados se possa gerir perante
38 Arquitetura MIPS

interrupes e as aes que se devem ser executadas para as excees. Carregue e execute este novo
cdigo no simulador SPIM com as opes Mapped I/O e sem a opo Load Trap File.
1. O que faz este programa? O que ocorre quando uma tecla pressionada?
2. Modifique o programa anterior para imprimir o caracter teclado.


Listagem de Cdigo 2.39: Exemplo de cdigo em assembly MIPS


ext :
l i $v0 4
l a $a0 i n t e r
syscall
l i $v0 1
l b $a0 i n
syscall
sb $a0 l i d o ( $0 )
l i $v0 1
l b $a0 l i d o ( $0 )
syscall
l i $v0 , 1 0 5 # t e c l a i
beq $a0 , $v0 , ok
bne $a0 , $v0 , c o n t i n u a
ok :
l i $v0 4
l a $a0 c a r a c t e r
syscall
continua :
mtc0 $0 , $13 # Limpar o r e g i s t o Cause

Exerccio 2.23 Escreva um programa que imprima Up, Down, Left e Direita quando forem
pressionadas as teclas i,k,j e l. Utilize o sistema MIPS de E/S por interrupes para tratamento das
teclas. A impresso das mensagens deve ser realizada atravs syscalls.

A arquitetura x86
Utilizao do programa DEBUG
Linguagem de montagem
Organizao da memria nos processa-
dores 8086/8088
Organizao da memria pelo software
bsico do DOS
Instrues de transferncia de controle
Arquitetura x86 de 32 bits
Montagem do programas em Assembly no
Linux
Procedimentos na arquitetura Intel de 32
bits
Trabalhando com os argumentos
Ligao de cdigo em 32 bits na lingua-
gem C
Verificando em tempo de execuo as
chamadas de sistema
Interao com o sistema operacional:
obtendo os argumentos da linha de
comando
Um pouco mais sobre o alinhamento
Utilizao de macros
Chamada a rotinas externas
3 Famlia de processadores x86
Arquitetura de 64 bits

3.1 A arquitetura x86


A arquitetura x86 tem suas origens no Intel 8086, um microprocessador com unidade lgica e
aritmtica, registradores internos e a maior parte das suas instrues que operam com palavras de 16 bits.
O barramento de dados tem a largura 16 bits 1 . O barramento de endereos de 20 bits, que permite
enderear 1 M (220 ) posies de memria (1MBytes).
A arquitetura do 8086 pode ser organizada em duas unidades distintas: a BIU (Bus Interface Unit)
e a EU (Execution Unit). A BIU envia endereos para o barramento de endereos, l instrues da
memria, l e escreve dados nas portas e na memria. Assim, a BIU a unidade responsvel por todas as
transferncias de dados e endereos atravs dos barramentos. Por sua vez, a EU diz BIU onde encontrar
instrues ou dados, decodifica e executa as instrues.
O 8086 foi lanado em junho de 1978 e tinha um clock de 4, 77 MHz. A IBM resolveu adotar o
8088 para o seu computador pessoal por dois motivos: manter os custos do PC reduzidos e manter a
compatibilidade com chips perifricos: o 8088 aceitava um barramento interno de 16 bits (como o 8086),
mas seu barramento externo era de 8 bits. O processador 8088 foi implementado com 29.000 transistores
e compactado num pacote de 40 pinos.
O modelo de programao bsico muito similar aos processadores mais modernos (de 32 e 64
bits) e as caractersticas atuais (como registradores, tipos de dados e modo de endereamento) so
extenses do conjunto de recursos do 8086 original. No diagrama de blocos da Figura 3.1 esto ilustrados
os componentes principais do microprocessador 8088: registradores, unidade lgica e aritmtica e os
barramentos.
A UCP tem 4 registradores internos, cada um de 16 bits, chamados de AX, BX, CX e DX. Esses
registradores so de uso geral e tambm podem ser usados como registradores de 8 bits. Para isso, tais
registradores devem ser referenciados como, por exemplo, AH e AL, que so, respectivamente, o Byte
high e o low do registrador AX. Esta nomenclatura tambm se aplica para os registradores BX, CX e DX.
Os registradores do processador 8088 esto ilustrados na Tabela 3.1.

3.1.1 Utilizao do programa DEBUG


O DEBUG um programa que tem sua origem no sistema operacional MS-DOS, e serve para a
criao e depurao de programas. Atravs do DEBUG, pode-se verificar os registradores do sistema,
realizar consultas na memria do sistema e o desenvolvimento e alterao de programas simples.

R O DEBUG era um programa comum no tempo do sistema DOS, e ficou disponvel at


pouco tempo nos sistemas operacionais Windows 7. A partir do Windows 7, o DEBUG foi
1 Um barramento com largura de 16 bits permite que o processador acesse a memria e nos portos de E/S utilizando

16 bits de uma s vez.


40 Famlia de processadores x86

Figura 3.1: Diagrama de blocos do processador 8088

removido da instalao do sistema Windows. Apesar disso, ele pode ser empregado com
um emulador. Os exemplos a seguir consideram o emulador DOSEMU sendo executado
em um sistema hospedeiro Linux. O DOSEMU tambm pode ser executado em sistemas
Windows.

O DEBUG pode apenas criar programas com a extenso .COM, e por causa das caractersticas deste
tipo e programa, eles no podem exceder os 64 KB, e tambm devem iniciar no endereo de memria
0100H dentro do segmento especfico. Programas .COM, de acordo com o software bsico do MS-DOS e
posteriormente Windows, no so realocveis em memria. Isso comumente chamado de programa
em modelo plano (emphflat model), que define programas que iniciam em uma regio sempre fixa em
memria e no permitida a utilizao de smbolos para pontos de entrada (por exemplo, a funo main()
em programas na linguagem C).
Os comandos principais programa DEBUG esto descritos na Tabela 3.2.
possvel visualizar os valores dos registradores internos da UCP usando o programa DEBUG.

Listagem de Cdigo 3.1: Exemplo de cdigo em assembly MIPS


C : / >DEBUG [ Enter ]

- O hfen no canto inferior esquerdo da tela prompt do programa. Para visualizar o contedo dos
registradores, experimente:

Listagem de Cdigo 3.2: Exemplo de cdigo em assembly MIPS


r [ Enter ]
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI =0000 DI =0000
DS=0D62 ES=0D62 SS=0D62 CS=0D62 I P =0100 NV UP EI PL NZ NA PO NC
0D62 : 0 1 0 0 2E CS :
0D62 : 0 1 0 1 803ED3DF00 CMP BYTE PTR [ DFD3 ] , 0 0 CS : DFD3=03
3.2 Linguagem de montagem 41

Tabela 3.1: Registradores


AX Registrador Acumulador
BX Registrador Base
CX Registrador Contador
DX Registrador de Dados
DS Registrador de Segmento de Dados
ES Registrador de Segmento Extra
SS Registrador de Segmento de Pilha
CS Registrador de Segmento de Cdigo
BP Registrador Apontador da Base
SI Registrador de ndice Fonte
DI Registrador de ndice Destino
SP Registrador Apontador de Pilha
IP Registrador Apontador da Prxima Instruo
F Registrador de Flag

Tabela 3.2: Comandos do programa DEBUG


Comando Descrio
A Montar instrues simblicas em cdigo de mquina
D Mostrar o contedo de uma regio da memria
E Entrar dados na memria, iniciando num endereo especfico
G Executar um programa executvel na memria
N Dar nome a um programa
P Proceder, ou executar um conjunto de instrues relacionadas
Q Sair do programa DEBUG
R Mostrar o contedo de um ou mais registradores
T Executar passo a passo as instrues
U Desmontar o cdigo de mquina em instrues simblicas
W Gravar um programa em disco

Atravs desse comando, so mostrados o contedo de todos os registradores internos da CPU; um


modo alternativo para visualizar um nico registrador usar o comando r seguido do parmetro que faz
referncia ao nome do registrador:

Listagem de Cdigo 3.3: Exemplo de cdigo em assembly MIPS


r b x
BX 0000
:

Este comando mostrar o contedo do registrador BX e mudar o indicador do DEBUG de - para :.


Tal prompt significa que possvel, embora no obrigatria, a mudana do valor contido no registrador,
bastando digitar o novo valor e pressionar [Enter]. Pressionando apenas [Enter], o valor antigo se
mantm.

3.2 Linguagem de montagem


Nas linhas do cdigo em Linguagem Assembly h duas partes: a primeira a instruo a ser executada;
a segunda, os parmetros da instruo. Por exemplo:
42 Famlia de processadores x86

Listagem de Cdigo 3.4: Exemplo de cdigo em assembly MIPS


add ah , bh

A instruo add o comando a ser executado, ah e bh so os parmetros. As instrues para os


processadores x86 apresentam no mximo dois operandos, sendo que o primeiro operando tambm o
destino, caso a operao representada seja uma instruo aritmtica. Existem instrues de um operando
e instrues de nenhum operando. Isso caracteriza uma diferena em arquiteturas regulares como o MIPS,
onde as instrues tem sempre o mesmo tamanho e quase sempre a mesma quantidade de operandos.
Por exemplo:

Listagem de Cdigo 3.5: Exemplo de cdigo em assembly MIPS


mov a l , 25

No exemplo acima, a instruo mov serve para mover o valor 25 para o registrador al.

Listagem de Cdigo 3.6: Exemplo de cdigo em assembly MIPS


add a l , [ 1 7 0 ]

No cdigo acima, os colchetes no segundo parmetro significa que o endereo de memria 170h ser
consultado e o seu contedo ser atribudo ao registrador al. Os colchetes permitem empregar o modo de
endereamento direto.
O programa a seguir realiza a soma de dois valores, armazenados nos registradores ax e bx. Para
montar um programa no DEBUG usado o comando a (assemble); quando esse comando empregado,
especifica-se um endereo inicial para o nosso programa como o parmetro. No caso de omisso, o
endereo inicial o especificado pelos registradores CS:IP, que 0100h. Este endereo corresponde ao
endereo de memria no relocvel que os programas no sistema operacional DOS devem iniciar.

Listagem de Cdigo 3.7: Exemplo de cdigo em assembly MIPS


a 100[ enter ]
mov ax , 0 0 0 2 [ e n t e r ]
mov bx , 0 0 0 4 [ e n t e r ]
add ax , bx [ e n t e r ]
nop [ e n t e r ] [ e n t e r ]

O programa move o valor 0002 para o registrador ax, move o valor 0004 para o registrador bx,
adiciona o contedo dos registradores ax e bx, guardando o resultado em ax e finalmente a instruo nop
(nenhuma operao) finaliza o programa.

Listagem de Cdigo 3.8: Exemplo de cdigo em assembly MIPS


C : \ >DEBUG
a 100
0D62 : 0 1 0 0 mov ax , 0 0 0 2
0D62 : 0 1 0 3 mov bx , 0 0 0 4
0D62 : 0 1 0 6 add ax , bx
0D62 : 0 1 0 8 nop
0D62 : 0 1 0 9

O comando t serve para executar passo a passo as instrues:

Listagem de Cdigo 3.9: Exemplo de cdigo em assembly MIPS


t
AX=0002 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI =0000 DI =0000
DS=0D62 ES=0D62 SS=0D62 CS=0D62 I P =0103 NV UP EI PL NZ NA PO NC
0D62 : 0 1 0 3 BB0400 MOV BX, 0 0 0 4

Vemos o valor 0002 no registrador AX.


3.2 Linguagem de montagem 43

Listagem de Cdigo 3.10: Exemplo de cdigo em assembly MIPS


t
AX=0002 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI =0000 DI =0000
DS=0D62 ES=0D62 SS=0D62 CS=0D62 I P =0106 NV UP EI PL NZ NA PO NC
0D62 : 0 1 0 6 01D8 ADD AX, BX
t
AX=0006 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI =0000 DI =0000
DS=0D62 ES=0D62 SS=0D62 CS=0D62 I P =0108 NV UP EI PL NZ NA PE NC
0D62 : 0 1 0 8 90 NOP

Exerccio 3.1 Verifique qual o contedo dos registradores CS e DS com os comandos:


r CS
r DS


R Na arquitetura 8086 o registrador CS referencia o segmento de cdigo do programa e DS o


segmento de dados do programa. O comando a 100 inicia a montagem de um programa
no endereo CS:0100.

Exerccio 3.2 Atravs de comandos do DEBUG, altere o valor do registrador AX para 5. 

Exerccio 3.3 No DEBUG, execute o comando d 000A. Qual segmento de memria foi empregado
pelo comando? Execute o comando r DS e altere o valor do registrador DS para 0f00 e execute o
comando d. Qual o resultado? 

Exerccio 3.4 Qual a diferena em utilizar a parte alta e a parte baixa dos registradores, por
exemplo AH e AL, ao invs de utilizar AX? Um valor atribudo ao registrador AH altera o valor do
registrador AL? Crie um programa simples no DEBUG para verificar essa situao. 

Exerccio 3.5 Execute passo a passo o programa abaixo. Verifique qual o tamanho em Bytes
ocupado na memria para cada instruo em Assembly. 

Listagem de Cdigo 3.11: Exemplo de cdigo em assembly MIPS


mov ax , 0
mov ah , 2
mov al , 2
add ax , ax
mov bx , ax
mov bl , 0
add bx , bx
nop

Exerccio 3.6 Qual a diferena das duas instrues de mquina abaixo? Quais so os modos de
endereamento utilizados? 
44 Famlia de processadores x86

Listagem de Cdigo 3.12: Exemplo de cdigo em assembly MIPS


mov ah , 12
mov a l , [ 1 2 ]

Exerccio 3.7 Limpe o flag carry com o comando no debug rf, digitando NC. Monte o programa
abaixo no DEBUG no endereo de memria CS:0100 (use o comando a 100). Quais registradores
so usados como operandos e qual ser o resultado da instruo MUL? 

Listagem de Cdigo 3.13: Exemplo de cdigo em assembly MIPS


MOV AX, 4
INC AX
MOV BX, 2143
DEC BX
MUL BL
DIV BX

R Verifique que o flag CY ser marcado com 1. A instruo MUL marca este flag sempre que a
parte alta do resultado for maior que zero.

Exerccio 3.8 Monte e execute o programa abaixo. Responda:


Para a instruo MOV AX, 0F00, qual valor ser armazenado em AH?
A instruo mov [si], bx est executando um load ou um store?
Qual endereo de memria est sendo afetado pela instruo anterior? Verifique se a memria
neste endereo foi modificada pelo programa (utilize o comando d)
Baseado na execuo do programa, a arquitetura 8086 utiliza little-endian ou big-endian?


Listagem de Cdigo 3.14: Exemplo de cdigo em assembly MIPS


mov ax , 0 f00
mov si , ax
mov bx , fefc
mov [ si ] , bx
nop

R O Source Index (SI) um registrador de 16 bits. SI usado para os modos de endere-


amento indexado e indireto por registrador, assim como fonte de dados em instrues
especiais para manipulao de strings.

Exerccio 3.9 Execute o programa abaixo. Utilize o comando d para verificar oque foi armazenado
na memria pelas instrues mov. 

Listagem de Cdigo 3.15: Exemplo de cdigo em assembly MIPS


mov ax , 0 f00
mov si , ax
mov bx , fefc
mov [ si ] , bx
mov [ si + 2 ] , bx
mov [ si + 4 ] , bx
nop
3.2 Linguagem de montagem 45

Exerccio 3.10 Monte o programa abaixo. Note que a instruo mov [si], 5 no ser montada
e gera um erro. modifique a instruo para mov word ptr [si], 5. Verifique que neste caso o
montador no acusar um erro. Execute o programa e verifique oque ele faz e suas diferenas em
relao ao programa anterior. Por que necessrio utilizar o modificador word ptr neste caso (Dica:
lembre-se que a instruo MOV preparada para trabalhar com Bytes ou palavras.)? 

Listagem de Cdigo 3.16: Exemplo de cdigo em assembly MIPS


mov ax , 0 f00
mov si , ax
mov bx , fefc
mov [ si ], 5
nop

3.2.1 Organizao da memria nos processadores 8086/8088


Para que o processador de 16 bits pudesse enderear 220 Bytes em memria, os projetistas da Intel
implementaram um esquema de memria chamado de endereamento segmentado.

R Endereamento segmentado no tem relao com a segmentao, pois segmentao um


mecanismo para implementar memria virtual e o 8088 no tem a opo de memria virtual.
A memria virtual s apareceu mais tarde nos processadores x86, com o processador 386.

Um endereo segmentado consiste em dois componentes de 16 bits: o segmento e o deslocamento


(offset). Quando um segmento e um deslocamento so combinados, um endereo efetivo criado (nmeros
de 16 bits, incluindo os segmentos e endereos, tm escalas de 0..65535 em decimal, ou 0..FFFF em
hexadecimal).
O segmento e o deslocamento so descritos em nmeros hexadecimais de 4 dgitos separados por dois
pontos. Para representar o segmento 510 e o deslocamento 710 , utiliza-se o seguinte formato: 0005 : 0007.
O endereo efetivo em memria calculado deslocando o nmero do segmento 4 posies esquerda
(multiplicao por 24 ) e somando ao nmero do deslocamento. Assim, o endereo acima produz o valor
00050+0007 = 00057 de endereo efetivo. Tal forma de endereamento permite acessar mais do que
64K da memria (se usssemos endereos fsicos, e ns usssemos palavras de 16 bits para armazenar
endereos, ns poderamos somente referenciar endereos no intervalo [0..65535]). Apesar disso, os
endereos segmentados so mais difceis de usa que endereos fsicos e para armazenar um endereo so
necessrios 32 bits, apesar do endereo ser de 20 bits.

3.2.2 Organizao da memria pelo software bsico do DOS


Como o PC da IBM foi introduzido em 1981, muitas das decises de projeto estavam de acordo com
as limitaes tecnolgicas da poca em relao ao software e ao hardware. Os projetistas do PC e do DOS
decidiram dividir o espao de endereo de 1 Megabyte em dezesseis segmentos 64K, com as seguintes
definies (Figura 3.2).
O primeiro segmento, comeando em 0000:0000, contem o cdigo do sistema operacional e dados.
O primeiro 1KByte de memria dedicado para uma tabela do vetor da interrupo. As partes do sistema
operacional, tais como COMMAND.COM, IO.SYS ou IBMBIOS.SYS, e MSDOS.SYS ou IBMDOS.SYS
podem residir neste segmento ou em outra parte na memria. Informao de estado dos dispositivos,
como teclado, armazenada neste segmento. Toda a memria deixada sobre o primeiro segmento, alm a
todos os segmentos restantes at o limite 640K, pode ser usada como para o uso dos programas (isto ,
para armazenar a parte de dados e de cdigo de um programa).
O segmento A000 reservado para o uso no modo grficos da placa de vdeo do computador. Mudar
os ndices da memria neste segmento pode mudar a imagem indicada na tela (outros adaptadores dos
grficos, tais como o CGA e o EGA mais velhos, usam tambm esta rea. O segmento B000 usado como
a memria para a modalidade (non-graphical) do texto. O segmento C000 pode armazenar atualizaes
para a BIOS. Se um cartucho for introduzido no PC, o segmento D000 e/ou o E000 so substitudo com
os ndices do cartucho. O hex do segmento F000 armazena o BIOS da ROM.
46 Famlia de processadores x86

Listagem de Cdigo 3.17: Exemplo de cdigo em assembly MIPS


0 x00000000 0 x000003FF R e a l Mode I n t e r r u p t V e c t o r T a b l e
0 x00000400 0 x000004FF BIOS D a t a Area
0 x00000500 0 x00007BFF Unused
0 x00007C00 0 x00007DFF Our B o o t l o a d e r
0 x00007E00 0 x0009FFFF Unused
0 x000A0000 0 x000BFFFF Video RAM (VRAM) Memory
0 x000B0000 0 x000B7777 Monochrome Video Memory
0 x000B8000 0 x000BFFFF C o l o r Video Memory
0 x000C0000 0 x000C7FFF Video ROM BIOS
0 x000C8000 0 x000EFFFF BIOS Shadow Area
0 x000F0000 0 x000FFFFF System BIOS

Figura 3.2: Organizao da memria em sistemas x86

Os primeiros PCs foram vendidos com 16K ou o 64K da RAM, e os cassetes foram consideradas
uma alternativa razovel, barata aos discos flexveis. Os discos flexveis podiam armazenar somente
160K. Em relao ao monitor, poderia ser utilizado um monitor de texto apenas ou MDPA (adaptador
monocromtico da exposio e da impressora) ou os grficos CGA de 4 cores (adaptador dos grficos de
cor) como os cartes vdeo, e se voc fosse disposto usar as telas de 40 colunas, voc poderia conectar ao
PC um aparelho de televiso, pois 4,77 MHz x 3 = frequncia dos monitores de televiso da poca).

R A Intel decidiu usar o que chamado de formato little endian para armazenar valores
de mais de um Byte, em vez do formato big endian, que muitos outros fabricantes do
processador empregam. A razo que dada geralmente para o formato little endian
que este formato facilita adicionar ou incrementar um nmero de vrios Bytes: se houver
um excesso, voc incremento prximo endereo (por um Bytes), e adiciona ento um ao
Bytes nesse endereo.

Para a criao e armazenamento de programas criados no Debug, deve-se seguir as seguintes etapas:
1. Obter o tamanho do programa subtraindo o endereo final do endereo inicial, naturalmente que
no sistema hexadecimal;
2. Dar um nome ao programa;
3. Colocar o tamanho do programa no registrador CX;
4. Mandar o debug gravar o programa em disco.
Usando como exemplo o seguinte programa, segue um exemplo de como realizar os passos acima
descritos:

Listagem de Cdigo 3.18: Exemplo de cdigo em assembly MIPS


0C1B : 0 1 0 0 mov ax , 0 0 0 2
0C1B : 0 1 0 3 mov bx , 0 0 0 4
0C1B : 0 1 0 6 add ax , bx
0C1B : 0 1 0 8 int 20
0C1B : 0 1 0A

Para obter o tamanho de um programa, o comando h usado, j que ele nos mostra a adio e subtrao
de dois nmeros em hexadecimal. Para obter o tamanho do programa em questo, damos como parmetro
o valor do endereo final do nosso programa (10A), e o endereo inicial (100). O primeiro resultado
mostra a soma dos endereos, o segundo, a subtrao:

Listagem de Cdigo 3.19: Exemplo de cdigo em assembly MIPS


h 10 a 100
020 a 000 a
3.2 Linguagem de montagem 47

O comando n permite nomear o programa:

Listagem de Cdigo 3.20: Exemplo de cdigo em assembly MIPS


n t e s t . c o m

O comando rcx permite-nos mudar o contedo do registrador CX para o valor obtido como tamanho do
arquivo com o comando h, neste caso 000A.

Listagem de Cdigo 3.21: Exemplo de cdigo em assembly MIPS


r c x
CX 0000
: 0 0 0A

Finalmente, o comando w grava nosso programa no disco, indicando quantos bytes gravou.

Listagem de Cdigo 3.22: Exemplo de cdigo em assembly MIPS


w
W r i t i n g 000A b y t e s

Para j salvar um arquivo quando carreg-lo, 2 passos so necessrios:


1. Dar o nome do arquivo a ser carregado;
2. Carreg-lo usando o comando l (load).
Para obter o resultado correto destes passos, necessrio que o programa acima j esteja criado. Dentro
do Debug, escrevemos o seguinte:

Listagem de Cdigo 3.23: Exemplo de cdigo em assembly MIPS


n t e s t . c o m
l
u 100 109
0C3D: 0 1 0 0 B80200 MOV AX, 0 0 0 2
0C3D: 0 1 0 3 BB0400 MOV BX, 0 0 0 4
0C3D: 0 1 0 6 01D8 ADD AX, BX
0C3D: 0 1 0 8 CD20 INT 20

O ltimo comando u usado para verificar se o programa foi carregado na memria. O que ele faz
desmontar o cdigo e mostr-lo em assembly. Os parmetros indicam ao Debug os endereos inicial
e final a serem desmontados. O Debug sempre carrega os programas na memria no endereo 100h,
conforme j foi comentado.

Exerccio 3.11 Verifique a data da BIOS do sistema. Essa data est armazenada no endereo
de memria FFFF5h. De maneira semelhante, verifique o fabricante da interface de vdeo do seu
computador; 

Exerccio 3.12 Determine um endereo, na forma segmento mais deslocamento, que represente o
endereo efetivo de memria 2F; 

Exerccio 3.13 Escreva um programa em assembly que imprima um caracter em tela, utilizando
um servio do DOS. Salve este programa em disco com o nome letra.com. 

R O sistema operacional DOS no implementava mecanismos de segurana. O programador


poderia utilizar os dispositivos de entrada e sada sem empregar os servios do sistema
(descritos na INT 21). Isso pode ser verificado com o seguinte cdigo:
48 Famlia de processadores x86

Listagem de Cdigo 3.24: Exemplo de cdigo em assembly MIPS


mov ax , b800
mov ds , ax
mov ah , 41
mov di , 0
mov [ d i ] , ah
add di , 2
mov [ d i ] , ah
int 20

que escreve um caracter no buffer de vdeo do sistema. Note que b800 o endereo
do segmento do buffer e a posio b800:0 armazena o cdigo do caracter que ser
mostrado na posio 0,0 do display. Na posio b8000:2, armazenado o cdigo do
segundo caracter a ser mostrado e assim por diante. Os atributos do primeiro caracter (cor,
intensidade) so armazenados na posio b800:1. A tela tem o tamanho de 25x80 linhas,
com 2 Bytes por caracter, sendo que o buffer tem tamanho total igual a 25x80x2 = 4000
Bytes. Na prtica o buffer tem 4096 Bytes = 1000H. Execute o programa acima (antes
interessante empregar o comando cls para limpar a tela.

Exerccio 3.14 Escreva um programa em Assembly que escreva uma mensagem, por exemplo o
seu nome, em tela, utilizando diretamente o buffer de vdeo. 

3.3 Instrues de transferncia de controle


As instrues que realizam a transferncia incondicional para um endereo destino em um segmento
de cdigo so: JMP, CALL, RET, INT e IRET. O endereo destino pode estar no mesmo segmento de
cdigo (transferncia near - prxima) ou em um segmento de cdigos diferente (transferncia far -
distante).
O desvio pode ser feito dentro ou fora do atual segmento de cdigo. No caso de desvios dentro do
prprio segmento, denominados desvios intra-segmento, apenas o registrador IP afetado pela instruo,
sendo alterado para o valor endereo-alvo. Quando a distncia entre o valor atual e o endereo-alvo, para
onde se d o desvio incondicional est entre 128 a +127 bytes, pode-se especificar um desvio-curto
(JMP SHORT), tambm chamado desvio incondicional relativo curto, com a vantagem de o deslocamento
para o desvio ser expresso por um nico byte, contendo um valor sinalizado que, ao ser somado ao valor
de IP fornecer o endereo-alvo. Se a distncia relativa para onde se dar o desvio for maior que +127 ou
128, ento o endereo relativo gerado ser um valor sinalizado de 16 bits, o que possibilita desvios por
todo o segmento corrente.

Listagem de Cdigo 3.25: Exemplo de cdigo em assembly MIPS


label1 :

a t u a l : JMP l a b e l 1

As instrues de controle condicional so desvios (jumps) que transferem a execuo do programa


caso o estado de um flag seja o mesmo que o especificado pela instruo. A mais comum a instruo
J(condio) - Desvio curto se condio for satisfeita, que desvia o fluxo do processamento para o
operando-alvo, se uma condio testada for encontrada. Os principais desvios condicionais no sinalizados
esto relacionados na Tabela 3.3.
A arquitetura x86 disponibiliza um conjunto de instrues para tratamento de bits. Uma operao
comum em bits a operao de deslocamento, que move os bits dos dados em uma direo, tanto da
esquerda para a direita, quando da direita para a esquerda. Instrues que realizam deslocamento so
chamadas de shift. As operaes de deslocamento copiam o valor deslocado para o registrador de flags
CF, ou carry flag.
3.3 Instrues de transferncia de controle 49

Mnemnico Estado dos flags Descrio


JA/JNBE (CF ou ZF)=0 Acima/No abaixo ou igual
JAE/JNB CF=0 Acima ou igual/No abaixo
JB/JNAE CF=1 Abaixo/No acima ou igual
JBE/JNA (CF ou ZF)=1 Abaixo ou igual/No acima
JC CF=1 Carry
JE/JZ ZF=1 Igual/Zero
JNC CF=0 No carry
JNE/JNZ ZF=0 No igual/No zero
JNP/JPO PF=0 Sem paridade/Paridade mpar

Tabela 3.3: Desvios condicionais

Listagem de Cdigo 3.26: Exemplo de cdigo em assembly MIPS


Original 1 1 1 0 1 0 1 0
Deslocado a esquerda 1 1 0 1 0 1 0 0
Deslocado a d i r e i t a 0 1 1 1 0 1 0 1

Em assembly, as instrues SHR e SHL realizam o deslocamento de bits. Essas instrues permitem
especificar a quantidade de bits que sero deslocados atravs do operando:

Listagem de Cdigo 3.27: Exemplo de cdigo em assembly MIPS


mov ax , 4
s h l ax , 1

Nesse caso, o contedo do registrador ax ser deslocado esquerda em uma posio.


Operaes de muliplicao e diviso so os usos mais comuns de operaes de deslocamento. Por
exemplo, para dobrar o valor binrio 10112 , pode-se realizar o deslocamento esquerda, tornando o
nmero igual a 101102 . Atravs de deslocamentos direita, pode-se efetuar operaes de diviso. As
operaes de SHL e SHR so bsicas e muito mais rpidas que instrues MUL e DIV.
Tais operaes de deslocamento no podem ser empregadas para nmeros inteiros com sinal. Con-
sidere, por exemplo, o valor de 2 bytes igual a FFFF16 , que corresponde ao valor -1. Tal nmero,
deslocado direita, ser igual a +32, 76710 .
Para realizar o deslocamento de nmero, visando manter o valor e o tratamento correto do sinal, so
empregadas as instrues SAL e SAR, que representam o deslocamento esquerda e o deslocamento
direita.
Operaes de rotacionamento de bits so similares s operaes de deslocamento, com a exceo de
que o bit que seria perdido em um deslocamento inserido na cadeia de bits que representa do dado, na
posio inversa:

Listagem de Cdigo 3.28: Exemplo de cdigo em assembly MIPS


Original 1 1 1 0 1 0 1 0
Rotacionado a esquerda 1 1 0 1 0 1 0 1
Rotacionado a d i r e i t a 0 1 1 1 0 1 0 1

Em assembly, as instrues que realizam o rotacionamento so ROL e ROR(no cdigo abaixo, o ; equivale
a um comentrio):

Listagem de Cdigo 3.29: Exemplo de cdigo em assembly MIPS


mov ax , C123
rol ax , 1 ; ax = 8247 , CF = 1
rol ax , 1 ; ax = 048F , CF = 1
rol ax , 1 ; ax = 091E , CF = 0
ror ax , 2 ; ax = 8247 , CF = 1
ror ax , 1 ; ax = C123 , CF = 1
50 Famlia de processadores x86

As instrues RCL e RCR rotacionam os bits do dado e tambm a informaao existente no registrador de
flags CF.

Listagem de Cdigo 3.30: Exemplo de cdigo em assembly MIPS


mov ax , C123
clc ; limpa o r e g i s t r a d o r de c a r r y ( CF = 0 )
rcl ax , 1 ; ax = 8 2 4 6 , CF = 1
rcl ax , 1 ; ax = 048D, CF = 1
rcl ax , 1 ; ax = 091B , CF = 0
rcr ax , 2 ; ax = 8 2 4 6 , CF = 1
rcr ax , 1 ; ax = C123 , CF = 0

Existem 4 operaes lgicas mais comuns em assembly: AND, OR, XOR e NOT. Essas instrues
convertem uma sequncia de bits atravs da tabela verdade de cada operao.

Listagem de Cdigo 3.31: Exemplo de cdigo em assembly MIPS


mov ax , 0C123H
and ax , 82F6H ; ax = 8022H
mov ax , 0C123H
xor ax , 0E831H ; ax = 2912H
mov ax , 0C123H
not ax ; ax = 3EDCH

Listagem de Cdigo 3.32: Exemplo de cdigo em assembly MIPS


mov ax , 0C123H
or ax , 8 ; l i g a b i t 3 , C12BH
and ax , 0FFDFH ; d e s l i g a b i t 5 , C10BH
xor ax , 8000H ; i n v e r t e b i t 3 1 , 410BH
or ax , 0F00H ; l i g a n i b b l e , 4F0BH
and ax , 0FFF0H ; d e s l i g a n i b b l e , 4F00H
xor ax , 0F00FH ; i n v e r t e n i b b l e s , BF0FH
xor ax , 0FFFFH ; 1 n s complement , 40F0H

Exerccio 3.15 Utilizando o programa abaixo, verifique como o valor do registrador armazenado
em memria. Empregue os comandos t e d para executar o programa e para verificar o contedo da
memria, respectivamente: 

Listagem de Cdigo 3.33: Exemplo de cdigo em assembly MIPS


C : \ > debug
a 100
0 7 9 5 : 0 1 0 0 mov ax , 0204
0 7 9 5 : 0 1 0 3 mov [ 1 0 8 ] , ax
0 7 9 5 : 0 1 0 6 nop
0795:0107

Exerccio 3.16 Verifique oque o programa abaixo produz: 

Listagem de Cdigo 3.34: Exemplo de cdigo em assembly MIPS


07A7 : 0 1 0 0 B402 MOV AH, 0 2
3.4 Arquitetura x86 de 32 bits 51

07A7 : 0 1 0 2 B200 MOV DL, 0 0


07A7 : 0 1 0 4 CD21 INT 21
07A7 : 0 1 0 6 FEC2 INC DL
07A7 : 0 1 0 8 80FAFF CMP DL, FF
07A7 : 0 1 0B 75 F7 JNZ 0104
07A7 : 0 1 0D CD20 INT 20

Exerccio 3.17 Crie um programa que mostre em tela o alfabeto, de a a z. 

Exerccio 3.18 Crie um programa que imprima em tela os algarismos de 0 a 9. 

Exerccio 3.19 Atravs do programa abaixo, verifique como a representao de inteiros na


memria principal: 

Listagem de Cdigo 3.35: Exemplo de cdigo em assembly MIPS


a 100
0795:0100 mov ax , 2
0795:0103 mov bx , 4
0795:0106 mov cx , 127
0795:0109 mov [ 1 2 0 ] , ax
0 7 9 5 : 0 1 0C mov [ 1 2 4 ] , bx
0795:0110 mov [ 1 2 8 ] , cx
0795:0114 nop
0795:0115

Exerccio 3.20 Sabendo que a funo 01 do servio DOS 21h permite ler um caracter do teclado,
devolvendo o seu cdigo no registrador AL, escreva um programa que leia as teclas digitadas no teclado
at que seja digitada a tecla 0. 

R A arquitetura x86 implementa a instruo LOOP, que pode ser empregada para controle de
laos de repetio. Essa instruo tem a sintaxe LOOP label e realiza a seguinte sequncia
de operaes: a) decrementa o registrador CX; b)verifica se o contedo de CX igual a 0.
Se sim, executa um desvio para o rtulo label. Note que antes de empregar a instruo
LOOP o programador necessita definir o tamanho do lao de repetio escrevendo para o
valor de CX. Por exemplo, a instruo MOV CX, FF definir que o lao de repetio ser
executado 255 vezes.

Exerccio 3.21 Reescreva o programa que imprime a tabela ASCII em tela empregando a instruo
LOOP. 

3.4 Arquitetura x86 de 32 bits


A Figura 3.3 mostra os registradores principais para a arquitetura IA-32. Essa arquitetura trabalha
com palavras de 32 bits e estende os registradores de 16 bits (da arquitetura do 8088) para registradores
de 32 bits. Por exemplo, o registrador AX estendido para o registrador EAX.
52 Famlia de processadores x86

Figura 3.3: Registradores IA-32

3.5 Montagem do programas em Assembly no Linux


O quadro a seguir mostra os comando para a montagem e linkedio de programas no Linux, para um
programa chamado de program:

Listagem de Cdigo 3.36: Exemplo de cdigo em assembly MIPS


nasm f e l f o p r o g r a m . o p r o g r a m . a s m
l d o p r o g r a m p r o g r a m . o

Note que o comando -f especifica o formato do arquivo executvel, que neste caso ser o elf, padro do
sistema Linux.
Quando so usadas bibliotecas externas (p.e. stdio, stdlib), a linkedio feita da seguinte forma:

Listagem de Cdigo 3.37: Exemplo de cdigo em assembly MIPS


l d dynamicl i n k e r / l i b / l d l i n u x . s o . 2 l c o p r o g r a m p r o g r a m . o

O quadro a seguir mostra um exemplo de programa em assembly para o Linux. Note que esto sendo
usados registradores de 32 bits.

Listagem de Cdigo 3.38: Exemplo de cdigo em assembly MIPS

section .data
hello : db H e l l o w o r l d ! , 1 0 ; Hello world ! p l u s
; a linefeed character
helloLen : equ $h e l l o ; s i z e of Hello world !

section .text
global _start

_start :
mov eax , 4
mov ebx , 1
mov ecx , h e l l o
mov edx , h e l l o L e n
3.5 Montagem do programas em Assembly no Linux 53

i n t 80 h

mov eax , 1
mov ebx , 0
i n t 80 h

R Se o compilador e linker gcc for usado diretamente, basta trocar o rtulo _start: por
main: e montador e linkeditar o programa com a seguinte linha:

Listagem de Cdigo 3.39: Exemplo de cdigo em assembly MIPS


g c c o p r o g r a m p r o g r a m . o

Nesse caso, o compilador gcc considera que o entrada do programa sempre o smbolo
main.

Exerccio 3.22 Qual o registrador utilizado pelo kernel do Linux para selecionar a funo de
escrita de string em tela? 

Exerccio 3.23 Ao contrrio do DOS, que trabalha com o servio 21h, qual o nmero de servio
do Linux? 

Exerccio 3.24 Para que serve a diretiva $, encontrada na seo de dados do programa? 

Esse arquivo, se salvo com o nome helloWorld.asm, pode ser montado e linkeditado da seguinte
forma:

Listagem de Cdigo 3.40: Exemplo de cdigo em assembly MIPS


nasm f e l f o h e l l o W o r l d . o h e l l o W o r l d . a s m
l d o h e l l o W o r d h e l l o W o r l d . o

Empregando o comando nm, pode-se obter a lista de smbolos do programa:

Listagem de Cdigo 3.41: Exemplo de cdigo em assembly MIPS


nm h e l l o W o r l d . o

A sada deste comando :

Listagem de Cdigo 3.42: Exemplo de cdigo em assembly MIPS


00000000 d h e l l o
0000000 d a h e l l o L e n
00000000 T _ s t a r t

Exerccio 3.25 Oque significam as informaes obtidas? (dica: use o comando man nm) para
consultar a pgina de manual do comando nm. 

Listagem de Cdigo 3.43: Exemplo de cdigo em assembly MIPS


A : Global a b s o l u t e symbol.
a : Local a b s o l u t e symbol.
B : Global bss symbol.
54 Famlia de processadores x86

b : Local bss symbol.


D : Global data symbol.
d : Local d a t a symbol.
f : S o u r c e f i l e name s y m b o l .
L : G l o b a l t h r e a d l o c a l symbol ( TLS ) .
l : S t a t i c t h r e a d l o c a l symbol ( TLS ) .
T : Global t e x t symbol.
t : Local t e x t symbol.
U : Undefined symbol.

R Por que o programa no inicia no endereo 0x0? H pelo menos duas razes para isso:
o endereo 0x0 o famoso ponteiro NULL, que no traduzido pelo esquema de
memria virtual do sistema operacional Linux;
o contedo real do endereo 0x0 o vetor de excees (tambm chamado vetor de
interrupes), que no acessvel em modo de execuo no privilegiado. Mais
detalhes podem ser vistos na Figura 3.4, que ilustra o mapa de memria de um
sistema Linux em 32 bits.

A seguir, tem se o resultado da execuo do comando:

Listagem de Cdigo 3.44: Exemplo de cdigo em assembly MIPS


objdump d h e l l o W o r l d

Pode-se verificar o cdigo em assembly (nesse caso o GAS, padro em sistemas UNIX) e os cdigos
em linguagem de mquina para as instrues:

Listagem de Cdigo 3.45: Exemplo de cdigo em assembly MIPS

helloWorld : f i l e f o r m a t e l f 3 2 i 3 8 6

Disassembly of s e c t i o n . t e x t :

08048080 < _ s t a r t > :


8048080: b8 04 00 00 00 mov $0x4 ,% eax
8048085: bb 01 00 00 00 mov $0x1 ,% ebx
804808 a : b9 a4 90 04 08 mov $0x80490a4 ,% e c x
804808 f : ba 0 d 00 00 00 mov $0xd ,% edx
8048094: cd 80 int $0x80
8048096: b8 01 00 00 00 mov $0x1 ,% eax
804809 b : bb 00 00 00 00 mov $0x0 ,% ebx
80480 a0 : cd 80 int $0x80

Exerccio 3.26 Quais so as principais diferenas da sintaxe do GAS em relao ao NASM? 

Exerccio 3.27 Qual a diferena entre (data segment) e o segmento .bss? 

Exerccio 3.28 Verifique a sada do comando:

Listagem de Cdigo 3.46: Exemplo de cdigo em assembly MIPS


objdump M i n t e l d h e l l o W o r l d
3.6 Procedimentos na arquitetura Intel de 32 bits 55

Figura 3.4: Mapa de memria do sistema operacional Linux

3.6 Procedimentos na arquitetura Intel de 32 bits


Procedimentos so invocados atravs da instruo call, seguida de um rtulo. Por exemplo, call
R1 desvia a execuo para o rtulo R1. O endereo de retorno no trmino do procedimento armazenado
na pilha. O retorno para o caller realizado atravs da instruo ret, que desvia a execuo para o
endereo de memria armazenado no topo da pilha.
Existem trs formas de passar parmetros para procedimentos: registradores, variveis globais e
atravs da pilha. Registradores e variveis globais no so adequados se for necessrio a passagem de um
nmero varivel de parmetros ou quando necessrio que o procedimento seja invocado por ele mesmo,
em chamadas recursivas. Na arquitetura de 32 bits, a passagem de parmetros pela pilha utilizada,
tanto em programas escritos em Assembly como linguagens de alto nvel, como C, Fortran e Pascal. A
conveno de software bsico, chamada de _cdecl, consiste na utilizao apenas da pilha para passagem
de parmetros. A conveno chamada de _fastcall adotada em processadores Intel de 64 bits, na qual
registradores so dedicados a passagem de argumentos, assim como na arquitetura MIPS.
Como exemplo, suponha que um procedimento chamado Imul2 calcula a multiplicao entre dois
inteiros que foram inseridos na pilha e retorna o resultado em EAX:

Listagem de Cdigo 3.47: Exemplo de cdigo em assembly MIPS


push VarA ; u l t i m o a r g u m e n t o ( e m p i l h a d o p r i m e i r o )
push VarB ; p r i m e i r o a r g u m e n t o
c a l l Imul2
add ESP , 8

A conveno assume que o procedimento no afeta a pilha, de forma que ao fim de sua execuo, o
ponteiro da pilha ESP referencia a mesma posio antes da chamada. Isso explica a operao add ESP,8,
que necessria para restaurar o valor inicial do ESP, pois cada uma das variveis tm 16 bits de tamanho.
Esse mtodo chamado como restaurao da pilha pelo cdigo que invocou a chamada (stack restored
by the caller) e utilizado pela maioria dos compiladores C/C++. A conveno adotada na linguagem
C/C++ empilhar os parmetros na ordem inversa em que aparecem na declarao da funo (da direita
para a esquerda). Essa conveno chamada CDECL.
O cdigo do procedimento pode ser escrito como:
56 Famlia de processadores x86

Listagem de Cdigo 3.48: Exemplo de cdigo em assembly MIPS


Imul2 :
push ebp
mov ebp , e s p
mov eax , [ ebp + 1 2 ]
Imul eax , [ ebp + 8 ]
pop ebp
ret

O primeiro parmetro est na posio ESP+8 (lembre-se que no topo da pilha est o endereo de retorno).
A longo da execuo da funo/procedimento o valor de ESP pode variar. Por isso, utiliza-se um outro
registrador, EBP, para referenciar a base da pilha durante toda a execuo da funo/procedimento (Na
arquitetura MIPS o registrador $fp era empregado para o mesmo fim). A poro da pilha referente a cada
funo/procedimento chamada de registro de ativao.

R O registrador ebp registra uma fotografia da pilha no momento que o procedimento entre
em execuo

A Figura 3.5 mostra o contedo da pilha para esse exemplo.

Figura 3.5: Exemplo de registros de ativao

Assim, ebp referencia sempre a base do registro de ativao corrente. Na medida que os proce-
dimentos so invocados, a pilha de execuo cresce. Alm dos endereos de retorno, comum cada
procedimento usar a pilha para armazenar variveis locais. A figura 3.6 ilustra os registros de ativao
para uma chamada encadeada de procedimentos.
Seguindo tais convenes, pode-se unir o cdigo escrito em Assembly com cdigo escrito na lingua-
gem C. Tal ligao comum no desenvolvimento de software bsico, como por exemplo o software de
um sistema operacional.
3.6 Procedimentos na arquitetura Intel de 32 bits 57

Figura 3.6: Exemplo de registros de ativao


58 Famlia de processadores x86

3.6.1 Trabalhando com os argumentos


O programa a seguir mostra como implementar procedimentos que recebem uma argumentos cujo
tamanho no fixo. O programa exemplo executa a soma de uma quantidade determinada de nmeros,
que reconhecida no procedimento como o primeiro parmetro, ou seja, o ltimo valor empilhado. O
programa caller realiza a chamada para uma soma de 3 nmeros.

R A conveno de software bsico indica que os registradores EBX, EDI e ESI devem ser
salvos pelo callee. Os registradores EAX, ECX e EDX devem ser salvos, se necessrio, pelo
caller.
Caso o procedimento necessite de variveis locais, elas devem ser alocadas em pilha, aps
o salvamento e alterao do ebp. Por exemplo, o cdigo a seguir reserva dois inteiros (32
bits cada) como variveis locais:

Listagem de Cdigo 3.49: Exemplo de cdigo em assembly MIPS


push ebp
mov ebp , e s p
sub esp , 8

Listagem de Cdigo 3.50: Exemplo de cdigo em assembly MIPS


push 35 ; u l t i m o a r g u m e n t o
push 63
push 23 ; p r i m e i r o a r g u m e n t o
push 3 ; numero de a r g u m e n t o s
call somaArgumentos
add esp , 16

mov eax , 1
mov ebx , 0
i n t 80 h

somaArgumentos :
push ebp
mov ebp , esp
push e s i
mov ecx , [ ebp + 8 ]
xor eax , eax
lea esi , [ ebp + 1 2 ]
L1 : add eax , [ esi ]
add e s i , 4
l o o p L1
pop e s i
pop ebp
ret

3.6.2 Ligao de cdigo em 32 bits na linguagem C


A seguir esto listados os cdigos fonte para a ligao do procedimento somaArgumentos com
cdigo na linguagem C:

Listagem de Cdigo 3.51: Exemplo de cdigo em assembly MIPS


/ / soma.c
e x t e r n i n t somaArgumentos ( i n t n , ... );
3.6 Procedimentos na arquitetura Intel de 32 bits 59

i n t main ( ) {
i n t soma ;
soma = somaArgumentos ( 5 , 1 , 7 , 9 , 1 , 1 ) ;
p r i n t f ( "%d \ n " , soma ) ;
}

Listagem de Cdigo 3.52: Exemplo de cdigo em assembly MIPS


; somaArgumentos.asm
g l o b a l somaArgumentos

somaArgumentos :
push ebp
mov ebp , esp
push e s i
mov ecx , [ ebp + 8 ]
xor eax , eax
lea esi , [ ebp + 1 2 ]
L1 : add eax , [ esi ]
add e s i , 4
l o o p L1
pop e s i
pop ebp
ret

Nome o uso da palavra reservada da linguagem C extern para indicar que o smbolo somaArgumentos
externo ao programa e declarado em outro arquivo fonte. Note tambm a palavra reservada do NASM
global, indicando que o procedimento somaArgumentos um smbolo global. Para montar, compilar
os programas acima, pode-se empregar a seguinte sequencia de comandos:

Listagem de Cdigo 3.53: Exemplo de cdigo em assembly MIPS


nasm f e l f o s o m a A r g u m e n t o s . o s omaArg umento s.asm
g c c o soma s o m a . c s o m a A r g u m e n t o s . o

O comando objdump executado para o arquivo somaArgumentos.o revela:

Listagem de Cdigo 3.54: Exemplo de cdigo em assembly MIPS


0000000 c t L1
00000000 T somaArgumentos

que o nome do procedimento um smbolo global (letra T maiscula). Para verificar o cdigo gerado
pelo compilador para o programa na linguagem C, pode-se empregar os dois comandos:

Listagem de Cdigo 3.55: Exemplo de cdigo em assembly MIPS


g c c c s o m a . c
objdump d s o m a . o

que produzem o seguinte resultado:

Listagem de Cdigo 3.56: Exemplo de cdigo em assembly MIPS


00000000 <main > :
0: 55 push %ebp
1: 89 e5 mov %esp ,%ebp
3: 83 e c 08 sub $0x8 ,% e s p
6: 83 e4 f 0 and $ 0 x f f f f f f f 0 ,% e s p
60 Famlia de processadores x86

9: b8 00 00 00 00 mov $0x0 ,% eax


e: 83 c0 0f add $0xf ,% eax
11: 83 c0 0f add $0xf ,% eax
14: c1 e8 04 shr $0x4 ,% eax
17: c1 e0 04 shl $0x4 ,% eax
1a : 29 c4 sub %eax ,% e s p
1c : 83 ec 08 sub $0x8 ,% e s p
1f : 6a 01 push $0x1
21: 6a 01 push $0x1
23: 6a 09 push $0x9
25: 6a 07 push $0x7
27: 6a 01 push $0x1
29: 6a 05 push $0x5
2b : e8 fc ff ff ff call 2 c <main +0 x2c >
30: 83 c4 20 add $0x20 ,% e s p
33: 89 45 fc mov %eax , 0 x f f f f f f f c (%ebp )
36: 83 ec 08 sub $0x8 ,% e s p
39: ff 75 fc pushl 0 x f f f f f f f c (%ebp )
3c : 68 00 00 00 00 push $0x0
41: e8 fc ff ff ff call 42 <main +0 x42 >
46: 83 c4 10 add $0x10 ,% e s p
49: c9 leave
4a : c3 ret

Note o empilhamento dos argumentos antes da chamada do procedimento (call 2c <main+0x2c>).


Note tambm a linha add $0x20,%esp, que ajusta a pilha aps a chamada de procedimento. Nesse caso,
o procedimento tem 6 parmetros (6 4 = 24), mas o compilador empilha em mltiplos de 0x10, por
isso o valor 0x20 sendo decrementado do esp. Assim, os endereos para tratamento de argumentos na
pilha so alinhados em 16 Bytes. A instruo sub $0x8,%esp empregada tambm para realizar o
alinhamento (6 4 = 24 + 8 = 32).

Exerccio 3.29 Modifique o programa anterior para:

Listagem de Cdigo 3.57: Exemplo de cdigo em assembly MIPS


/ / soma.c
e x t e r n i n t somaArgumentos ( i n t n , ... );

i n t main ( ) {
i n t soma ;
soma = somaArgumentos ( 3 , 1 , 7 , 9 ) ;
p r i n t f ( "%d \ n " , soma ) ;
}

e verifique a sada dos comandos:

Listagem de Cdigo 3.58: Exemplo de cdigo em assembly MIPS


g c c c s o m a . c
objdump M i n t e l d s o m a . o

De quanto o ajuste na pilha aps a execuo da chamada pelo caller? 

Rotinas como printf e puts so constantemente empregadas em programas na linguagem C e


podem ser invocadas por programas em Assembly atravs da linkedio do programa com as bibliotecas
padro do sistema. Considere o seguinte exemplo:
3.6 Procedimentos na arquitetura Intel de 32 bits 61

Listagem de Cdigo 3.59: Exemplo de cdigo em assembly MIPS


1 # include
2 i n t main ( )
3 {
4 i n t a =5 ;
5 p r i n t f ( " a=%d , e a x=%d \ n " , a , a + 2 ) ;
6 return 0;
7 }

Tem o seu cdigo equivalente em Assembly:

Listagem de Cdigo 3.60: Exemplo de cdigo em assembly MIPS


1 extern printf
2
3 section .data
4
5 a : dd 5
6 fmt : db " a=%d , e a x=%d " , 1 0 , 0
7
8
9 section .text
10
11 g l o b a l main ; p o n t o de e n t r a d a
12 main :
13 push ebp
14 mov ebp , e s p
15 mov eax , [ a ]
16 add eax , 2
17 push eax
18 push dword [ a ]
19 push dword f m t
20 call printf
21 add esp , 12
22
23 mov esp , ebp
24 pop ebp
25
26 mov eax , 1
27 mov ebx , 0
28 int 80 h

O comando nm para o arquivo objeto criado a partir deste fonte retorna:

Listagem de Cdigo 3.61: Exemplo de cdigo em assembly MIPS


00000000 d a
00000027 t _exit
00000004 d fmt
00000000 T main
U printf
00000000 t _start

Note que o smbolo printf no tem um endereo de memria associado, pois ser funo do linker e
aps do loader resolver o endereo e ligar com a biblioteca compartilhada glibc.
Os parmetros para a rotina so passados via pilha, por meio da instruo push, que devem ser
empilhados pelo caller na ordem inversa. A rotina printf invocada com a instruo call, que
basicamente salva na pilha o endereo de retorno aps a execuo da rotina e executa um desvio para o
62 Famlia de processadores x86

endereo do rtulo (a rotina chamada deve utilizar a instruo ret, que retorna o controle de execuo
ao caller). Nesse caso, o rtulo um smbolo externo, que o montador (nasm) ignora devido a diretiva
extern. Note que o caller restaura a pilha com a instruo add esp,12. Essa a conveno, chamada
de caller clean-up, que adotada pela linguagem C.
O exemplo abaixo considera um programa na linguagem C, que executa uma chamada a rotina
imprimeVetor. Note a utilizao da diretiva extern para informar ao compilador C que a rotina
imprimeVetor externa ao cdigo fonte.

Listagem de Cdigo 3.62: Exemplo de cdigo em assembly MIPS


e x t e r n v o i d i m p r i m e V e t o r ( i n t v , i n t n ) ;

i n t main ( ) {

int a [6]= {1 ,2 ,3 ,4 ,5 ,6} ;

imprimeVetor ( a , 6) ;

Este programa pode ser compilado com o uso do gcc, que ir gerar um arquivo binrio teste.o:

Listagem de Cdigo 3.63: Exemplo de cdigo em assembly MIPS


g c c c t e s t e . c

A listagem do comando objdump -d para o cdigo binrio gerado segue:

Listagem de Cdigo 3.64: Exemplo de cdigo em assembly MIPS


1 00000000 <main > :
2 0: 55 push %ebp
3 1: 89 e5 mov %esp ,%ebp
4 3: 57 push %e d i
5 4: 56 push %e s i
6 5: 83 e c 20 sub $0x20 ,% e s p
7 8: 83 e4 f 0 and $ 0 x f f f f f f f 0 ,% e s p
8 b: b8 00 00 00 00 mov $0x0 ,% eax
9 10: 83 c0 0 f add $0xf ,% eax
10 13: 83 c0 0 f add $0xf ,% eax
11 16: c1 e8 04 shr $0x4 ,% eax
12 19: c1 e0 04 shl $0x4 ,% eax
13 1c : 29 c4 sub %eax ,% e s p
14 1e : 8 d 7 d d8 lea 0 x f f f f f f d 8 (%ebp ) ,% e d i
15 21: be 00 00 00 00 mov $0x0 ,% e s i
16 26: fc cld
17 27: b8 06 00 00 00 mov $0x6 ,% eax
18 2c : 89 c1 mov %eax ,% e c x
19 2e : f 3 a5 r e p z movsl %ds :(% e s i ) ,% e s :(% e d i )
20 30: 83 e c 08 sub $0x8 ,% e s p
21 33: 6 a 06 push $0x6
22 35: 8 d 45 d8 lea 0 x f f f f f f d 8 (%ebp ) ,% eax
23 38: 50 push %eax
24 39: e8 f c f f ff ff call 3 a <main +0 x3a >
25 3e : 83 c4 10 add $0x10 ,% e s p
26 41: 8 d 65 f 8 lea 0 x f f f f f f f 8 (%ebp ) ,% e s p
27 44: 5e pop %e s i
28 45: 5f pop %e d i
29 46: 5d pop %ebp
3.6 Procedimentos na arquitetura Intel de 32 bits 63

30 47: c3 ret

Note as instrues push $0x6 e push %eax previamente executadas a rotina que realiza a chamada a
rotina imprimeVetor (call 3a <main+0x3a>).

R A instruo lea (), usada na linha lea 0xffffffd8(%ebp),%eax, permite calcular/mon-


tar um endereo de memria, sem realizar acesso memria. Nesse caso, esta instruo
foi usada para que o endereo base do vetor fosse calculado a partir do registrador ebp.
Isso deve-se ao fato do vetor a estar declarado dentro do ponto de entrada main(). Caso o
vetor estivesse sido declarado externamente a rotina main(), na seo de dados estticos,
a instruo push $0x0 seria empregada (Considerando que o vetor fosse a nica varivel
esttica do programa).

Exerccio 3.30 Verifique voce mesmo a diferena na sada do comando objdump -d, no caso do
vetor estar declarado externamente a rotina main() do programa em C:

Listagem de Cdigo 3.65: Exemplo de cdigo em assembly MIPS


e x t e r n v o i d i m p r i m e V e t o r ( i n t v , i n t n ) ;
int a [6]= {1 ,2 ,3 ,4 ,5 ,6} ;
i n t main ( ) {
imprimeVetor ( a , 6) ;
}

A rotina imprimeVetor est implementada em linguagem Assembly:

Listagem de Cdigo 3.66: Exemplo de cdigo em assembly MIPS


extern printf ; t h e C f u n c t i o n , t o be c a l l e d

SECTION . d a t a ; Data s e c t i o n , i n i t i a l i z e d v a r i a b l e s
m a s c a r a : db "%d "
SECTION . t e x t ; Code s e c t i o n .

g l o b a l imprimeVetor

imprimeVetor :

push ebp ; s e t up s t a c k f r a m e
mov ebp , e s p

mov e s i , 0
mov ecx , [ ebp + 1 2 ] ; q u a n t i d a d e de e l e m e n t o s a i m p r i m i r
mov ebx , [ ebp + 8 ] ; e n d e r e c o b a s e do v e t o r

l1 :
mov eax , [ ebx + e s i 4 ]
push ebx ; s a l v a r e g i s t r a d o r
push e c x ; s a l v a r e g i s t r a d o r

push eax
push dword m a s c a r a
call printf
add esp , 8

pop e c x ; r e s t a u r a r e g i s t r a d o r
64 Famlia de processadores x86

pop ebx ; r e s t a u r a r e g i s t r a d o r

inc e s i
loop l1
leave
ret

Note que os parmetros para a rotina so passados via pilha. A linha mov ecx, [ebp + 12] respons-
vel por recuperar da pilha o segundo parmetro do procedimento, que representa o nmero de elementos
do vetor. A linha mov ebx, [ebp+8] responsvel por recuperar da pilha o endereo do vetor. Nesse
exemplo, o registrador esi empregado como ndice para acesso ao vetor.

R A arquitetura x86 disponibiliza os registradores esi e edi, que servem para ser usados
como ndices em operaes de load/store. Esses registradores podem ser empregados
em conjunto com a instruo movsb para realizar cpias entre posies de memria. Nesse
caso, o registrador esi o ponteiro para a regio de memria de origem e edi a referncia
para o destino:

Listagem de Cdigo 3.67: Exemplo de cdigo em assembly MIPS


mov esi , fonte
mov edi , d e s t i n o
mov ecx , q t d e B y t e s
cld
rep movsb

A instruo cld neste exemplo limpa o flag de direo e permitem que instrues de cpia
de strings em memria, como o caso da instruo movsb, incremente os valores dos
registradores esi e edi automaticamente. Caso contrrio, com o flag de direo (DF)
igual a 1, os valores dos registradores seriam decrementados. O prefixo rep permite que a
instruo movsb seja executada ecx vezes (a instruo mov ecx, qtdeBytes armazena
o tamanho da sequncia a ser copiada em ecx).

Ao final do procedimento, a instruo leave equivalente a pop ebp seguido de mov esp, ebp. A
instruo ret restaura o endereo de retorno e realiza um desvio incondicional para este endereo. A
prxima seo detalha a utilizao de procedimentos e instrues call e ret.
Note que como a arquitetura IA-32 tem menos registradores de propsito geral, tal arquitetura no
pode reservar registradores especficos para isso conforme existe na arquitetura MIPS (a arquitetura MIPS
reserva os registradores $a0-$a3 para este propsito). A quantidade menor de registradores da arquitetura
IA-32 implica em uma maior utilizao da pilha na passagem de parmetros e no para salvamento de
valores de registradores.

3.6.3 Verificando em tempo de execuo as chamadas de sistema


O comando strace inicia a execuo do programa passado como parmetro e mostra em tela uma
listagem de todas as chamadas de sistema invocadas pelo programa: Assim, o comando:

Listagem de Cdigo 3.68: Exemplo de cdigo em assembly MIPS


s t r a c e . / imprimeMsg O l a t e s t e 5

produz como resposta:

Listagem de Cdigo 3.69: Exemplo de cdigo em assembly MIPS


e x e c v e ( " . / imprimeMsg " , [ " imprimeMsg " , " O l a t e s t e " , " 5 " ] . . .
w r i t e ( 1 , " O l a t e " , 5 O l a t e )= 5
write (1 , " \ n" , 1
)= 1
_exit (0)= ?
3.6 Procedimentos na arquitetura Intel de 32 bits 65

3.6.4 Interao com o sistema operacional: obtendo os argumentos da linha de comando


A pilha tem uma funo importante em sistemas Linux: a comunicao do sistema operacional com o
programa em execuo. Atravs da pilha, os argumentos so passados ao programa para o processamento.
Considere a execuo do programa abaixo imprimeMsg que recebe como parmetro a string Ola:

Listagem de Cdigo 3.70: Exemplo de cdigo em assembly MIPS


imprimeMsg Ola 5

Nesse caso a, configurao da pilha a seguinte:

Listagem de Cdigo 3.71: Exemplo de cdigo em assembly MIPS


( ESP ) 3 ; q u a n t i d a d e de a r g u m e n t o s
( ESP+ 4 ) imprimeMsg ; nome do programa
( ESP+ 8 ) Ola ; p r i m e i r o argumento ( endereco )
( ESP+ 12 ) 5 ; segundo argumento ( endereco )

Note que a configurao da pilha para o programa principal similar a conveno de chamada de
procedimentos, com a a exceo que o endereo de retorno no est no topo da pilha e que na conveno
C/C++ o nmero de argumentos no passado pela pilha.
O programa imprimeMsg est listado a seguir:

Listagem de Cdigo 3.72: Exemplo de cdigo em assembly MIPS


section .data
l i n e B r e a k db 10
section .text
global _start

_start :
mov ebp , e s p
mov eax , 4
mov ebx , 1
mov ecx , [ ebp + 8 ]
mov edx , 3
int 80 h ; Call the kernel

mov eax , 4
mov ebx , 1
mov ecx , l i n e B r e a k
mov edx , 1
int 80 h

mov eax , 1
mov ebx , 0
int 80 h ; Exit

Exerccio 3.31 Modifique o programa anterior para que o mesmo imprima em tela todos os
parmetros recebidos pelo programa, e no apenas o primeiro argumento. Salve este programa como
imprimeMsg2.asm. 

R Para imprimir os argumentos, representados por strings que podem ter tamanhos diferentes,
interessante empregar a funo strlen para calcular o tamanho da string:

Listagem de Cdigo 3.73: Exemplo de cdigo em assembly MIPS


66 Famlia de processadores x86

global strlen
; i n t s t r l e n ( c o n s t char s t r i n g ) ;
strlen :
push edi
sub ecx , e c x
mov edi , [ esp +8]
not ecx
sub al , a l
cld
repne scasb
not ecx
pop edi
lea eax , [ ecx 1]
ret

Essa rotina retorna em eax o tamanho da string recebida como parmetro pela pilha.
O fragmento de cdigo que utiliza o procedimento, calculando o tamanho da string
referenciada pelo registrador ecx e usar o tamanho para imprimir a string da memria na
posio [ebp+8]:

Listagem de Cdigo 3.74: Exemplo de cdigo em assembly MIPS

push e c x
call strlen
mov edx , eax
mov eax , 4
mov ebx , 1
mov ecx , [ ebp + 8 ]
i n t 80 h ; Call the kernel

Exerccio 3.32 Utilize o desmontador de programas em Assembly do NASM para verificar o cdigo
em Assembly gerado a partir da desmontagem dos programas binrios. 

3.6.5 Um pouco mais sobre o alinhamento


Considerando que a pilha tem a seguinte configurao no incio da execuo do programa _main (o
endereo da pilha apenas um exemplo):

Listagem de Cdigo 3.75: Exemplo de cdigo em assembly MIPS


| conteudo previo |
| da p i l h a |
++ < 0 x b f f f 1 2 3 0

Aps empilhar ebp, subtrair 8 do esp para reservar espao para duas variveis locais:

Listagem de Cdigo 3.76: Exemplo de cdigo em assembly MIPS


| conteudo previo |
| da p i l h a |
++ < 0 x b f f f 1 2 3 0
| %ebp |
++ < 0 x b f f f 1 2 2 c
: espaco :
: reservado :
++ < 0 x b f f f 1 2 2 4
3.6 Procedimentos na arquitetura Intel de 32 bits 67

Agora, a instruo andl marca com zero os ltimos 4 bits do endereo contido no esp, topo da pilha:

Listagem de Cdigo 3.77: Exemplo de cdigo em assembly MIPS


| conteudo previo |
| da p i l h a |
++ < 0 x b f f f 1 2 3 0
| %ebp |
++ < 0 x b f f f 1 2 2 c
: espaco :
: reservado :
+ + < 0 x b f f f 1 2 2 4
: espaco e x t r a :
++ < 0 x b f f f 1 2 2 0

Isso se deve ao fato que algumas instrues da arquitetura x86, chamadas de SIMD e de SSE, podem
executar operaes em paralelo, empregando mltiplas palavras em memria, mas necessitam que essas
palavras estejam alocadas em blocos que iniciam em endereos mltiplos de 16 Bytes. O espao extra
no utilizado pelo programa.

3.6.6 Utilizao de macros


Note no exemplo anterior a repetio no uso da syscall write. Atravs do uso de macro, frag-
mentos de cdigo frequentemente usados podem ser definidos como macros, inclusive com parme-
tros.

Exerccio 3.33 Quais so as vantagens e desvantagens de macros em relao aos procedimentos?




Um exemplo do uso de macros para facilitar o acesso syscalls mostrado a seguir . As macros so
definidas nas linhas 16 e 27. Um exemplo do uso no programa principal pode ser visto na linha 42.

Listagem de Cdigo 3.78: Exemplo de cdigo em assembly MIPS


1 section .data
2 p r o m p t _ s t r db E n t e r y o u r name :
3 STR_SIZE equ $ p r o m p t _ s t r
4
5 greet_str db Hello
6
7
8 GSTR_SIZE equ $ greet_str
9
10
11 section .bss
12
13 ; R e s e r v e 32 b y t e s o f memory
14 b u f f r e s b 32
15
16 ; A macro w i t h two p a r a m e t e r s
17 ; Implements the write system c a l l
18 %macro w r i t e 2
19 mov eax , 4
20 mov ebx , 1
21 mov ecx , %1
22 mov edx , %2
23 int 80 h
24 %endmacro
25
68 Famlia de processadores x86

26
27 ; Implements the read system c a l l
28 %macro r e a d 2
29 mov eax , 3
30 mov ebx , 0
31 mov ecx , %1
32 mov edx , %2
33 int 80 h
34 %endmacro
35
36
37 section .text
38
39 global _start
40
41 _start :
42 w r i t e p r o m p t _ s t r , STR_SIZE
43 r e a d b u f f , 32
44
45 ; Read r e t u r n s t h e l e n g t h i n e a x
46 push eax
47
48 ; Print the hello t e x t
49 w r i t e g r e e t _ s t r , GSTR_SIZE
50
51 pop edx
52
53 ; e d x = l e n g t h r e t u r n e d by r e a d
54 w r i t e b u f f , edx
55
56 _exit :
57 mov eax , 1
58 mov ebx , 0
59 int 80 h

3.7 Chamada a rotinas externas


3.8 Arquitetura de 64 bits
A arquitetura x86 de 64 bits estende o tamanho de palavra para 64 bits:

Listagem de Cdigo 3.79: Exemplo de cdigo em assembly MIPS


ah / a l 8 bits
ax 16 b i t s
eax 32 b i t s
rax 64 b i t s

e adiciona 8 registradores adicionais, r8-r15, que pode ser referenciados das seguintes formas:

Listagem de Cdigo 3.80: Exemplo de cdigo em assembly MIPS


rXb 8 bits
rXw 16 b i t s
rXd 32 b i t s
rX 64 b i t s
3.8 Arquitetura de 64 bits 69

sendo que X um valor de 8 a 15. Os registradores so: %rax, %rbx, %rcx, %rdx, %rsi, %rdi,
%rbp, %rsp, %r8-%r15, %rip, %eflags, %cs, %ss, %ds, %es, %fs, %gs. As instrues, em
sua maioria, devem empregar o sufixo q, que indica que o operando uma quad-word (sintaxe do
GAS):

Listagem de Cdigo 3.81: Exemplo de cdigo em assembly MIPS


movq $0x4 , %r a x

R O ponteiro de instrues (%rip) referencia a prxima instruo a ser executada. No pode


ser acessado (escrito) diretamente pelo programador, mas usado com frequncia pelo
montador para o endereamento de operandos.
70 Famlia de processadores x86

Considere o seguinte programa na linguagem C:

Listagem de Cdigo 3.82: Exemplo de cdigo em assembly MIPS


e x t e r n v o i d i m p r i m e V e t o r ( i n t v , i n t n ) ;
int a [6]= {1 ,2 ,3 ,4 ,5 ,6} ;

i n t main ( ) {

imprimeVetor ( a , 6) ;

e o resultado do comando objdump:

Listagem de Cdigo 3.83: Exemplo de cdigo em assembly MIPS


0: 55 push %r b p
1: 48 89 e5 mov %r s p ,% r b p
4: 48 83 ec 20 sub $0x20 ,% r s p
8: c7 45 e0 01 00 00 00 movl $0x1 , 0 x20(% r b p )
f: c7 45 e4 02 00 00 00 movl $0x2 , 0 x1c (% r b p )
16: c7 45 e8 03 00 00 00 movl $0x3 , 0 x18(% r b p )
1d : c7 45 ec 04 00 00 00 movl $0x4 , 0 x14(% r b p )
24: c7 45 f0 05 00 00 00 movl $0x5 , 0 x10(% r b p )
2b : c7 45 f4 06 00 00 00 movl $0x6 , 0 xc(% r b p )
32: 48 8d 45 e0 lea 0x20(% r b p ) ,% r a x
36: be 06 00 00 00 mov $0x6 ,% e s i
3b : 48 89 c7 mov %r a x ,% r d i
3e : e8 00 00 00 00 callq 43 <main +0 x43 >
43: c9 leaveq
44: c3 retq

O seguinte fragmento:

Listagem de Cdigo 3.84: Exemplo de cdigo em assembly MIPS


0: 55 push %r b p
1: 48 89 e5 mov %r s p ,% r b p

o prembulo padro para uma funo na linguagem C. A instruo pushq %rbp salva o ponteiro na
pilha de forma que ele poder ser restaurado ao final (instruo leaveq. A instruo movq %rsp, %rbp
copia o ponteiro de pilha para o registrador rbp, criando assim um frame de ativao do procedimento. O
vetor a[6] armazenado na pilha, pois foi declarado internamente rotina main(). A instruo:

Listagem de Cdigo 3.85: Exemplo de cdigo em assembly MIPS


4: 48 83 e c 20 sub $0x20 ,% r s p

Aloca espao na pilha para o vetor. Os endereos para vetores so alinhados em 16 Bytes, isso explica o
fato do vetor ter 6 elementos ( 6 4 = 24) e o montador alocar 0x20 posies (32 Bytes). Isso significa
que, na prtica, os vetores em memria tem tamanhos mltiplos de 16 Bytes, independente do tamanho
declarado pelo programador.

Exerccio 3.34 Qual tamanho em memria de um vetor de 12 elementos inteiros? 


3.8 Arquitetura de 64 bits 71

Exerccio 3.35 Modifique o cdigo conforme abaixo e verifique a alocao dos vetores na pilha:

Listagem de Cdigo 3.86: Exemplo de cdigo em assembly MIPS


i n t main ( ) {

int a [9]= {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9} ;


int b [2] ;

imprimeVetor ( a , 5 ) ;

Note que cada inteiro, assim como na arquitetura de 32 bits, ocupa 4Bytes em memria (o fragmento
a seguir indica as linhas de cdigo que armazenam os valores 4 e 5 do vetor:

Listagem de Cdigo 3.87: Exemplo de cdigo em assembly MIPS


1d : c7 45 e c 04 00 00 00 movl $0x4 , 0 x14(% r b p )
24: c7 45 f 0 05 00 00 00 movl $0x5 , 0 x10(% r b p )

A instruo movl indica que o tamanho do operando igual a 32 bits.


As seguintes linhas:

Listagem de Cdigo 3.88: Exemplo de cdigo em assembly MIPS


32: 48 8 d 45 e0 lea 0x20(% r b p ) ,% r a x
36: be 06 00 00 00 mov $0x6 ,% e s i
3b : 48 89 c7 mov %r a x ,% r d i

Carregam o endereo do vetor no registrador rax e empregam os registradores esi e rdi para passagem
de argumentos. Note que a pilha no empregada para passagem de argumentos. A seguinte linha executa
a chamada funo:

Listagem de Cdigo 3.89: Exemplo de cdigo em assembly MIPS


3e : e8 00 00 00 00 callq 43 <main +0 x43 >

As instrues leavq libera o frame de ativao da rotina main() e a instruo retq executa o retorno.
A Tabela 3.4 indica as convenes em 64 bits.
A Tabela 3.5 apresenta com detalhes como o uso dos registradores.

Exerccio 3.36 Verifique a sada (extenso .s) do comando:

Listagem de Cdigo 3.90: Exemplo de cdigo em assembly MIPS


g c c S f v e r b o s e asm p r o g r a m . c

O comando precisa ser modificado de acordo com o nome de seu programa na linguagem C (nesse
caso, ele se chama program.c). 
72 Famlia de processadores x86

Tabela 3.4: Registradores da arquitetura x86 de 64 bits


Registrador Utilizao Preservado em chamadas?
rax 1st return register, number of vector registers used No
rbx callee-saved register; base pointer Yes
rcx pass 4th integer argument to functions No
rdx pass 3rd argument fo functions, 2nd return register No
rsp stack pointer Yes
rbp callee-saved register, frame pointer Yes
rsi used to pass 2nd argument to functions No
rdi used to pass 1st argument to functions No
r8 used to pass 5th argunent to functions No
r9 used to pass 6th argument to functions No
r10 temp register, used for passing a functions static chain ptr No
r11 temp register No
r12 callee-saved register Yes
r13 callee-saved register Yes
r14 callee-saved register Yes
r15 callee-saved register Yes

Tabela 3.5: Registradores da arquitetura x86 de 64 bits


64-bit register Lower 32 bits Lower 16 bits Lower 8 bits
rax eax ax al
rbx ebx bx bl
rcx ecx cx cl
rdx edx dx dl
rsi esi si sil
rdi edi di dil
rbp ebp bp bpi
rsp esp sp spi
r8 r8d r8w r8b
4 Concluso

O estudo sobre a organizao interna dos processadores e sobre arquitetura de conjunto de instrues
de vital importncia para o desenvolvimento de software confivel e que apresente desempenho
computacional aceitvel. Mesmos programadores que trabalham com linguagens de alto nvel, como C ou
Java, devem estruturar os seus programas de forma que eles possam ser executados mais eficientemente,
em relao ao uso dos recursos, em um computador real.
A programao em linguagem Assembly e em software bsico, assunto principal abordado neste
texto, apenas uma parte da rea de estudo sobre organizao e arquitetura de computadores. Outros
assuntos muito relevantes, no abordados aqui, so o subsistema de memria, processamento super
escalar, pipelining e processamento paralelo. Pelo estudo sobre linguagem de montagem e software
bsico, pretende-se motivar o leitor a investigar e estudar os demais tpicos da rea, bem como os tpicos
relacionados a sistemas operacionais e compiladores.
Referncias Bibliogrficas

[1] David Harris and Sarah Harris. Digital Design and Computer Architecture, Second Edition. Morgan
Kaufmann Publishers Inc., San Francisco, CA, USA, 2nd edition, 2012.
[2] John L. Hennessey and David A. Patterson. Computer Organization and Design: The Hardware/-
Software Interface; 2nd edition. Morgan Kaufmann, 1994.
[3] John L. Hennessy and David A. Patterson. Computer Architecture : A Quantitative Approach; second
edition. Morgan Kaufmann, 1996.
[4] Norman Matloff. Below C level: an introduction to computer systems. Technical report, University
of California, Davis.
[5] Linda Null and Julia Lobur. The Essentials of Computer Organization And Architecture. Jones and
Bartlett Publishers, Inc., USA, 2006.
[6] David A. Patterson and John L. Hennessy. Computer Organization and Design, Fifth Edition: The
Hardware/Software Interface. Morgan Kaufmann Publishers Inc., San Francisco, CA, USA, 5th
edition, 2013.

S-ar putea să vă placă și