Documente Academic
Documente Profesional
Documente Cultură
Anotaes de aula
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
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 )
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.
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.
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
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:
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:
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:
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:
j = 64;
Exerccio 2.4 Converta para MIPS o programa seguinte, considerando que os endereos
base para as variveis esto em $s0 e $s1:
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.
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.
. 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
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:
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
. 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.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
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):
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:
Exerccio 2.12 Qual intervalo de posies foram reservadas para a varivel espaco?
Quantos bytes e palavras foram reservados no total?
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.
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:
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
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:
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
Exemplos de load/store:
A Figura 2.2 detalha o processo de converso (casting) em ponto flutuante, usado no programa com a
instruo cvt.s.w $f4, $f4.
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.
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:
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).
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
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
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
. 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
. 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
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).
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
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
# $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
# 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
# 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 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
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
# 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
# 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
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.
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
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.
- O hfen no canto inferior esquerdo da tela prompt do programa. Para visualizar o contedo dos
registradores, experimente:
No exemplo acima, a instruo mov serve para mover o valor 25 para o registrador al.
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.
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.
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.
Exerccio 3.6 Qual a diferena das duas instrues de mquina abaixo? Quais so os modos de
endereamento utilizados?
44 Famlia de processadores x86
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?
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.9 Execute o programa abaixo. Utilize o comando d para verificar oque foi armazenado
na memria pelas instrues mov.
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.)?
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:
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:
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.
Finalmente, o comando w grava nosso programa no disco, indicando quantos bytes gravou.
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.
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.
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:
Em assembly, as instrues que realizam o rotacionamento so ROL e ROR(no cdigo abaixo, o ; equivale
a um comentrio):
As instrues RCL e RCR rotacionam os bits do dado e tambm a informaao existente no registrador de
flags CF.
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.
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:
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.
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:
O quadro a seguir mostra um exemplo de programa em assembly para o Linux. Note que esto sendo
usados registradores de 32 bits.
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:
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:
Exerccio 3.25 Oque significam as informaes obtidas? (dica: use o comando man nm) para
consultar a pgina de manual do comando nm.
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.
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:
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 :
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
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
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
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:
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
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 ) ;
}
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:
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:
i n t main ( ) {
i n t soma ;
soma = somaArgumentos ( 3 , 1 , 7 , 9 ) ;
p r i n t f ( "%d \ n " , soma ) ;
}
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.
i n t main ( ) {
imprimeVetor ( a , 6) ;
Este programa pode ser compilado com o uso do gcc, que ir gerar um arquivo binrio teste.o:
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>).
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:
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:
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.
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:
_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:
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]:
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.
Aps empilhar ebp, subtrair 8 do esp para reservar espao para duas variveis locais:
Agora, a instruo andl marca com zero os ltimos 4 bits do endereo contido no esp, topo da pilha:
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.
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.
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
e adiciona 8 registradores adicionais, r8-r15, que pode ser referenciados das seguintes formas:
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):
i n t main ( ) {
imprimeVetor ( a , 6) ;
O seguinte fragmento:
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:
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.35 Modifique o cdigo conforme abaixo e verifique a alocao dos vetores na pilha:
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:
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:
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.
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
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.