Você está na página 1de 20

SDAC

Prof. Miguel Nadais

Mdulo 10 Programao de Microprocessadores

Trabalho Realizado por: Diogo Fernandes, n3; 3G

Mdulo 10 Programao de Microprocessadores

ndice

Introduo ........................................................................................................................ 3 Conceitos bsicos de programao em Assembly ........................................................... 4 Programao em Assembly .............................................................................................. 8 Programa em Assembly (Exemplos) ............................................................................... 16 Concluso........................................................................................................................ 19 Web Grafia ...................................................................................................................... 20

2 Mdulo 10 Programao de Microprocessadores

Introduo
Este trabalho foi realizado no mbito da disciplina de Sistemas Digitais e Arquitectura de Computadores, do Curso Profissional de Gesto de Equipamentos Informticos. O trabalho relativo ao Mdulo 10 Programao de Microprocessadores. Assembly uma linguagem de programao, ou seja, serve para conceber programas. Esta linguagem de programao considerada de baixo nvel, ou seja, o utilizador interage directamente com o Processador do computador, sem a necessidade de intermedirios. A linguagem Assembly no mais do que uma representao simblica da codificao binria de um computador: a linguagem mquina. Esta linguagem de programao oferece uma representao mais prxima do programador, o que simplifica a leitura e a escrita dos programas. Mas para qu usar Assembly e quando? Tipicamente, quando um programador utiliza Assembly, porque a velocidade ou a dimenso do programa que est a desenvolver so crticas. Isto acontece muitas vezes na vida real, sobretudo quando os computadores so embebidos noutras mquinas (carros, avies, unidades de controlo de produo industrial...). Os computadores deste tipo devem responder rapidamente a eventos vindos do exterior. Existe ainda outro motivo, que est relacionado com a execuo temporal dos programas: muitas vezes possvel retirar grandes benefcios da optimizao de programas. Por exemplo, alguns jogos que recorrem a elaborados motores 3D so parcialmente programados em Assembly (nas zonas de cdigo onde a optimizao mais benfica que so normalmente as zonas de cdigo mais frequentemente utilizado). Ao longo deste trabalho irei tentar explicar a linguagem Assembly, e tambm mostrar alguns exemplos de um programa em Assembly.

3 Mdulo 10 Programao de Microprocessadores

Conceitos bsicos de programao em Assembly


Assembly a linguagem de programao mais bsica disponvel para qualquer processador. Com a linguagem Assembly, um programador s trabalha com as operaes executadas directamente sobre o processador. A linguagem Assembly carece de alto nvel de conforto, tais como variveis e funes, e no porttil entre as diversas famlias de processadores. No entanto, Assembly a linguagem de programao mais poderosa disponvel no computador, e ela d aos programadores a viso necessria para escrever cdigo eficiente em linguagens de alto nvel. Aprender Assembly valorizar o tempo e o esforo de todos os programadores srios.

O Bsico
Antes de podermos explorar o processo de escrever programas de computador, temos que voltar para o bsico e saber exactamente o que um computador e como o seu funcionamento. Cada computador, no importa quo simples ou complexo, tem no seu ncleo, exactamente duas coisas: o Processador e alguma memria. Juntas, essas duas coisas so o que tornam possvel que o seu computador execute programas. No nvel mais bsico, um programa de computador nada mais do que uma compilao de nmeros armazenados na memria. Nmeros diferentes dizem para o Processador fazer diferentes coisas. O Processador l os nmeros, um de cada vez, descodifica-os e executa o que os nmeros dizem. Por exemplo, se o Processador l o nmero 64 como parte de um programa, ela ir adicionar 1 ao nmero armazenado num local especial chamado AX. Se o Processador l o nmero 146, vai trocar o nmero armazenado em AX com o nmero armazenado noutro local chamado BX. Ao combinar vrias operaes simples, como estas num programa, um programador pode fazer o computador realizar coisas incrveis. Como exemplo, aqui esto os nmeros de um simples programa de computador: 184, 0, 184, 142, 216, 198, 6, 158, 15, 36, 205, 32 Se o utilizador digitar estes nmeros na memria do computador e execut-los no MS-DOS, veria um sinal de dlar ($) colocado no canto inferior direito da tela, uma vez que o que estes nmeros dizem que o computador faa. 4 Mdulo 10 Programao de Microprocessadores

Figura Representao em cdigo mquina e linguagem Assembley

Linguagem Assembly
Embora os nmeros do programa acima faam sentido para um computador, eles no so claros para um ser humano. Quem poderia imaginar que o cdigo colocaria um cifro no ecr? Claramente, manipular nmeros directamente uma pssima maneira de escrever um programa. No tem que ser assim. H algum tempo atrs, algum veio com a ideia de que os programas de computador poderiam ser escritos com palavras, em vez de nmeros. Ento um programa especial, ao qual se d o nome de assembler, juntaria as palavras do programador e convert-las-ia em nmeros que o computador pudesse entender. Isto salvou os programadores de milhares de horas de esforo, j que no tinham mais que procurar nmeros difceis de lembrar nas costas de livros de programao, em vez disso bastava usar palavras simples. O programa acima, escrito na linguagem Assembly, fica assim: MOV AX, 47104 MOV DS, AX MOV [3998], 36 32 INT Quando o assembler l este programa exemplo, converte cada linha de cdigo numa instruo de nvel da CPU. Este programa utiliza dois tipos de instrues, MOV e INT. Nos processadores da Intel, a instruo MOV movimenta dados, enquanto a instruo INT transfere o controlo do processador para os drivers de dispositivo ou sistema operativo. O programa ainda no est completamente claro, mas muito mais fcil de entender do que era antes. A primeira instruo, MOV AX, 47104, informa ao computador para copiar o nmero 47104 no local AX. A prxima instruo, MOV DS, AX, informa o computador para copiar o nmero em AX para o local DS. A prxima instruo, MOV [3998], 36 diz ao computador para colocar o nmero 36 em 5 Mdulo 10 Programao de Microprocessadores

memria na posio 3998. Finalmente, INT 32 finaliza o programa, regressando ao sistema operativo. Antes de prosseguirmos irei explicar como funciona este programa. Dentro do Processador existe uma quantidade de locais, chamados registos, que podem armazenar um nmero. Alguns registos, como o AX, so de uso geral, e no fazem nada de especial. Outros registos, como o DS, controla a forma como o processador funciona. DS funciona como um registo de segmento, e usado para escolher qual rea de memria da CPU pode gravar. No nosso programa, vamos colocar o nmero 47104 para DS, que diz CPU para aceder memria na placa de vdeo. A prxima coisa que o programa faz colocar o nmero 36 na localizao 3998 da memria da placa de vdeo. Como o 36 o cdigo para o sinal de dlar $ e 3998 a posio de memria do canto inferior direito do ecr, um cifro aparece no ecr alguns microssegundos depois. Finalmente, o programa informa a CPU para realizar o que se chama uma interrupo. Uma interrupo usada para parar um programa e executar outro. No nosso caso, usamos a interrupo 32, que termina o nosso programa e retorna para o MS-DOS, ou qualquer outro programa que foi usado para iniciar o nosso programa.

O Assemblador
Uma ferramenta essencial quando se programa em linguagem Assembly o assemblador. O uma programa que traduz de Assembly para linguagem mquina. Os primeiros assembladores pouco mais faziam do que a traduo para cdigo mquina, mas actualmente tm muitas outras capacidades permitindo nomeadamente: Atribuir nomes simblicos a endereos de memria, variveis e grupos de Instrues; Trabalhar em diversas bases de numerao bem como converter caracteres nos seus cdigos ASCII; Efectuar clculos aritmticos simples com constantes ou nomes simblicos; Definir os endereos de memria onde o programa e os dados iro ser armazenados; Reservar reas de memria para armazenamento temporrio de informao; Configurar a gerao de cdigo mquina e o formato das listagens produzidas; Construir e utilizar bibliotecas de funes, ajudando o programador de forma modular e a reutilizar cdigo, j escrito em Assembly ou noutras linguagens.

6 Mdulo 10 Programao de Microprocessadores

Existem actualmente inmeros assembladores comerciais e de domnio pblico para a famlia 51. Para o sistema operativo Windows um dos melhores o da KEIL software, disponvel em verso de desmonstrao, mas 90% funcional.

Figura Interface do KEIL software

7 Mdulo 10 Programao de Microprocessadores

Programao em Assembly
A linguagem Assembly , pois, o nvel mais baixo em que se pode programar com alguma comodidade. A traduo da linguagem Assembly de cada microprocessador para o cdigo mquina correspondente pode ser feita mo, mediante uma tabela de converso, mas normalmente feita recorrendo a um assemblador, ferramenta que na maior parte dos casos oferecida pelo fabricante do microprocessador. Nas seces seguintes apresentam-se as vantagens e desvantagens de programar em linguagem Assembly; um bom assemblador atenua algumas das desvantagens da linguagem mas h outras que lhe so intrnsecas.

Vantagens
A principal vantagem de programar em linguagem Assembly poder optimizar o cdigo de modo a aproveitar ao mximo as caractersticas particulares do hardware onde vai ser executado, conseguindo assim melhores resultados quer em tempo de execuo quer em tamanho de cdigo gerado. Outra vantagem a existncia de assembladores para todos os microprocessadores, muitas vezes oferecidos pelos fabricantes, pelo que sempre possvel programar em Assembly, qualquer que seja o microprocessador escolhido. O mesmo no acontece com linguagens de alto nvel, onde nem sempre possvel encontrar um compilador adequado para um determinado microprocessador. Podemos ainda dizer com a facilidade de optimizao do cdigo permite aproveitar ao mximo as caractersticas particulares do hardware, onde o programa vai ser executado, conseguindo deste modo melhores resultados quer em tempo de execuo querem tamanho de cdigo gerado.

Desvantagens
A principal desvantagem de uma linguagem de baixo nvel a grande desproporo que existe entre a complexidade do seu conjunto de instrues e as tarefas que o microprocessador normalmente chamado a executar. Esta desproporo obriga o programador a decompor cada tarefa num conjunto de operaes elementares que, alm de ser um processo demorado e sujeito a erros, no ajuda a manter o cdigo estruturado.

8 Mdulo 10 Programao de Microprocessadores

Outra desvantagem a necessidade de conhecer em detalhe o modelo de programao do microprocessador, nomeadamente no que se refere aos registos de trabalho disponveis, registos privilegiados ou especiais e registo de estado. Como consequncia desta dependncia relativamente aos detalhes internos de um microprocessador, a portabilidade dos programas muito reduzida.

A tendncia actual, a favor de uma programao mista, usando principalmente linguagens de mais alto nvel (por exemplo C), e recorrendo linguagem Assembly apenas em rotinas onde a eficincia do cdigo seja o objectivo principal. Esta tendncia explica-se devida forte presso do mercado, que obriga a encurtar o tempo de desenvolvimento e a aumentar a facilidade de manuteno do cdigo, e tambm devido aos avanos na microelectrnica que permitem que a rapidez de execuo se consiga facilmente por aumento da frequncia de funcionamento.

Componentes da linguagem Assembly


Os componentes da linguagem Assembly so basicamente as instrues para o processador. Ignorando as instrues que no podem ser utilizadas pelo sistema operativo Windows, assembly condicional, macros, ponto flutuante, MMX e instrues de 64 bits, os componentes da linguagem Assembly podem ser divididos nas seguintes categorias: Instrues de Registos; Instrues de Pilha; Instrues de Execuo; Instrues de Memria; Instrues de Flag; Declaraes de Memria; Directivas para o Assembler; Comentrios; Instrues para o Sistema Operativo (Windows).

9 Mdulo 10 Programao de Microprocessadores

Instrues de Registos

Estas instrues transferem dados ou realizam clculos utilizando os registos de 32 bits da Processador. Existem seis registos de uso geral chamados de EAX, EBX, ECX, EDX, ESI e EDI. Exemplos deste tipo de instruo so:
MOV ESI,EBX ADD EAX,EDI BT ECX,0 CMP EDX,450 DIV ECX MUL ECX SHL EDX,4 TEST EAX,8 ;move o contedo do registo EBX para o registo ESI ;soma o contedo do registo EDI com o do registo EAX ;testa o bit 0 do registo ECX ;compara o contedo de EDX com 450 ;divide EDX:EAX (inteiro longo) por ECX ;multiplica EAX por ECX e pe o resultado em EDX:EAX ;desloca os bits de EDX para a esquerda em 4 bits (multiplica por 16) ;testa o bit 3 do registrador EAX

Instrues de Pilha

A pilha uma rea de memria reservada pelo sistema operativo para cada programa que estiver a ser executado como rea de arquivamento temporrio. So exemplos deste tipo de instruo:

PUSH EAX ;pe o contedo do registo EAX na pilha POP EDX ;retira o ltimo valor colocado na pilha e pe em EDX PUSH 1000h ;pe o valor hexadecimal 1000 na pilha MOV EBP,ESP ;move o valor do ponteiro da pilha para o registo EBP SUB ESP,30h ;move o ponteiro da pilha para abrir uma rea de armazenamento para dados locais MOV D[EBP-20h],500h ;insere o valor 500 hexa para a rea de dados locais

Instrues de Execuo

Estas instrues desviam o processador para que execute cdigo a partir de um ponto que no seja a prxima linha de execuo. So exemplos:
CALL MAKEWINDOW ;executa o cdigo do procedimento e depois retorna CALL EAX ;executa o cdigo a partir do endereo presente em EAX e depois retorna RET ;termina este procedimento retornando ao chamador JZ 4 ;se o resultado for zero, continua a execuo a partir do marcador 4: JC >.fim ;se a flag estiver activa, continua a execuo a partir de .fim JMP MAKEWINDOW ;continua a execuo a partir do procedimento nominado LOOP 2 ;decrementa ECX e salta para o marcador 2: a no ser que ECX=0

10 Mdulo 10 Programao de Microprocessadores

Instrues de Memria

Estas instrues lem ou escrevem em reas de memria que no sejam da pilha. Normalmente estas reas esto na seo de dados do prprio executvel ou podem ser alocadas pelo sistema operativo em tempo de execuo. So exemplos:
ADD EAX,[ESI] ;adiciona a EAX o contedo de memria cujo ponteiro de endereo est no registo ESI MOV EAX,[MEUSDADOS] ;move para EAX o contedo de memria cujo marcador MEUSDADOS SUB D[MYDATA+64],10h ;subtrai 10h do dword em MEUSDADOS mais 64 bytes CMP B[MYDATA+EDX*4],2 ;compara um byte com 2 numa parte do array MEUSDADOS LODSB ;carrega o byte na memria apontada por ESI em al STOSD ;carrega o contedo de EAX na memria apontada por EDI

Instrues de Flag

As principais flags usadas so a Z (flag zero), C (flag carry), S (flag de sinal) e D (flag de direco). A maioria das instrues alteram as flags automaticamente para dar o resultado da instruo. Existem determinadas instrues que podem ser usadas para alterar o valor das flags manualmente:
STC CLC STD CLD ;activa a flag de carry ;limpa a flag de carry ;activa a flag de direco para LODS, STOS, CMPS, SCAS, MOVS ;limpa a flag de direco

Declaraes de Memria

O sistema operativo reserva memria para o executvel quando ele executado. Declaraes so feitas para reservar memria na seo de dados ou na seo de constantes se os dados devem ser inicializados, isto , devem receber um valor. Se forem dados no inicializados, a rea de dados pode ficar reservada na seo de dados no inicializados. Isto no toma espao algum no arquivo executvel porque um espao de memria alocado para este tipo de dado quando o executvel iniciado pela primeira vez. Seguem exemplos de como a memria declarada, o que pode variar de acordo com o assembler utilizado:
DB 4 MEUDADO DB 4 MYSTRUCT DD 16 DUP 0 BUFFER DB 1024 DUP ? ;declara um ;um byte de ;16 dwords, ;1024 bytes byte e atribui-lhe o valor inicial 4 valor inicial 4 com o marcador MEUDADO todos com valor zero, chamados MYSTRUCT chamados BUFFER como dados no definidos

11 Mdulo 10 Programao de Microprocessadores

Directivas para o Assembler

So instrues que orientam onde o Assembler deve colocar o cdigo fonte que as segue. O Assembler marca a seo de cdigo como apenas para leitura e executvel; as sees de dados definidos e indefinidos como leitura/escrita. Veja alguns exemplos (que podem variar de acordo com o assembler):
CODE SECTION DATA SECTION CONST SECTION ;tudo o que ;marcada para ;tudo o que ;com atributos ;tudo o que ;com atributo de se segue deve ser colocado numa seo apenas leitura e executvel (cdigo) se segue deve ser colocado numa seo de leitura e escrita mas no de cdigo se segue deve ser colocado numa seo apenas leitura

Comentrios

Aps ponto e vrgula, o texto ignorado at prxima quebra de linha. Desta forma possvel associar descries e explicaes ao cdigo fonte, as quais sero ignoradas pelo assembler. Instrues para o sistema operativo proporcionam ao programador o acesso a uma grande variedade de funes. No caso do sistema operativo Windows, proporcionam acesso API (Applications Programming Interface). Veja os exemplos abaixo:
PUSH 12h CALL GetKeyState TEST EAX,80000000h JZ >L22 PUSH 24h PUSH ESI,EDI PUSH [hWnd] CALL MessageBoxA CMP AL,7 JNZ >L40 PUSH PUSH PUSH PUSH CALL 0 ADDR FILE_DONE ECX,EDX ESI WriteFile ;pe valor hexa 12 na pilha para a chamada API ;pede ao Windows para por o estado da tecla Alt em EAX ;testa se a tecla Alt est sendo pressionada (bit 31 ligado) ;no, saltar para L22 ;valor hexa 24 = ponto de interrogao, botes yes e no ;endereo do ttulo, endereo da mensagem ;manipulador da janela proprietria ;mostra a caixa de mensagem Windows pedindo yes/no ;checa se "no" foi clicado pelo utilizador ;no, saltar para L40

;d endereo do arquivo FILE_DONE para receber o resultado ;ECX = bytes que devem ser escritos, EDX=fonte de dados, ;ESI = manipulador do arquivo ;escrever ECX bytes de EDX para ESI ;808 = em baixo e meio preenchido, 5 = elevado ;ebx = RECT, EDX = contexto do dispositivo ;desenhar rectngulo especial com bordas na tela ;4h = fazer memria leitura/escrita, 3000h = reservar ;reservar e consignar ESI bytes de memria leitura/escrita

PUSH 808h,5h PUSH EBX,EDX CALL DrawEdge PUSH 4h,3000h,ESI,0 CALL VirtualAlloc

12 Mdulo 10 Programao de Microprocessadores

PUSH PUSH PUSH PUSH PUSH PUSH CALL

0,[hInst],0,0 208,130,30,300 80C80000h EAX 'LISTBOX' 0 CreateWindowExA

;param, manipulador do mdulo, menu e proprietrio ;altura, largura, y, x ;estilo (POPUP+CAPTION+SYSMENU) ;EAX = endereo da string terminada em zero com o ttulo ;por ponteiro para 'LISTBOX' na pilha ;estilo extended (nenhum) ;criar a janela listbox

...... ou, se preferir, usar INVOKE .. INVOKE CreateWindowExA, 0,'LISTBOX',EAX,80C80000h,300,30,130,208 \ 0,0,[hInst],0 ............. INVOKE ShowWindow, [hWnd], 1

Modelo de Programao
O modelo de programao de um microprocessador descreve os recursos disponveis para o programador: registos de trabalho, registos especiais, eventuais agrupamentos de registos, instrues e modos de endereamento disponveis, etc. Para comear a escrever pequenos programas basta conhecer os principais registos e instrues de um microprocessador. As seces seguintes apresentam o modelo de programao da famlia 51 da Intel. Registos principais da famlia i51

A arquitectura base da famlia 51 da Intel disponibiliza um nmero aprecivel de registos dos quais se destacam, numa primeira abordagem, os seguintes: Registos de trabalho R0 a R7 Registos privilegiados A (acumulador) e B Registo de estado PSW (program status word) Os registos A e B so privilegiados no sentido de que existem algumas instrues que s podem ser executadas neles, por exemplo as operaes aritmticas s podem ser efectuadas sobre o acumulador. O registo de estado (PSW) d, entre outras, indicaes sobre a paridade do valor contido no acumulador, se houve ou no transporte e/ou overflow na ltima operao aritmtica efectuada, etc.

13 Mdulo 10 Programao de Microprocessadores

Grupos de instrues da famlia i51

As instrues disponveis na famlia i51 podem dividir-se em cinco grupos consoante a sua funo: 1. Instrues de movimentao de dados 2. Instrues aritmticas 3. Instrues lgicas 4. Instrues de salto e chamada de sub-rotinas 5. Instrues booleanas As instrues de movimentao de dados permitem copiar valores: de um registo para memria, da memria para um registo, etc. As instrues aritmticas permitem efectuar as quatro operaes aritmticas elementares considerando ou no a existncia de eventuais transportes. sempre necessrio recorrer ao registo acumulador e, por vezes, tambm ao registo B. As instrues lgicas permitem efectuar operaes lgicas elementares assim como rotaes de bits para a esquerda ou para a direita. Funcionam tambm exclusivamente com o acumulador. As instrues de salto e chamada de sub-rotinas permitem alterar a ordem de execuo de um programa de forma condicional ou incondicional. As instrues booleanas permitem manipular bits individualmente. A maior parte delas obriga a utilizar um dos bits do registo de estado a flag CY (carry) que funciona para o processamento booleano como o acumulador para o processamento aritmtico e lgico. Algumas regras de sintaxe e modos de endereamento da famlia i51 A forma geral de uma instruo Assembly da famlia 51 mnemnica [operando1[,operando2[,operando3]]] ou seja, h instrues com 3, 2, 1 ou nenhum operando. De acordo com o estabelecido pelo fabricante original um operando pode ser: um nmero, representando um endereo de memria (endereamento directo), o nome de um registo (endereamento registo), 14 Mdulo 10 Programao de Microprocessadores

um valor constante, se precedido do carcter # (endereamento imediato), um apontador, se precedido do carcter @ (endereamento indirecto). Estas regras de sintaxe entendem-se melhor com a apresentao de alguns exemplos simples:
MOV R5,40h MOV R5,#40h ADD A,R5 ORL A,#10010001b LJMP 4358h ; Copia para o acumulador... MOV A,R0 MOV A,@R0 ; Copia para o registo R5 o contedo da posio de memria 64. ; Coloca no registo R5 o valor 64. ; Adiciona ao acumulador o registo R5. Resultado no acumulador. ; Faz o OR lgico do acumulador com o valor 91h. ; O resultado fica no acumulador. ; Continua a execuo do programa no endereo 4358h.

; ...o que est em R0 ; ...o contedo da posio de memria apontada por R0.

Note-se que dos registos de trabalho R0 a R7, apenas R0 e R1 podem assumir o papel de apontadores. Quando o manual de programao [1] emprega a designao genrica Rn est a referir-se aos registos R0 a R7 mas quando usa a designao Ri est a referir-se apenas aos registos R0 e R1.

15 Mdulo 10 Programao de Microprocessadores

Programa em Assembly (Exemplos)


Exemplo 1

Ose seguinte programa constitui um procedimento que copia uma string x para uma string y:
# Programa que copia uma string y para uma string x .data str1: .asciiz "origem " str2: .asciiz "copia " .text main: addi $sp, $sp, -4 # reserva uma posio no stack sw $ra, 0($sp) # guarda o endereo de retorno jal strcpy lw $ra, 0($sp) # recupera endereo de retorno addi $sp, $sp, 4 # pop do stack pointer end: jr $ra strcpy: addi $sp, $sp, -4 sw $s0, 0($sp) # guarda $s0 no stack add $s0, $0, $0 # $s0 = i = 0 la $t5, str1 # guarda endereo de str1 em $t5 la $t6, str2 # guarda endereo de str2 em $t6 L1: add $t1, $s0, $t5 # carrega em $t1 endereo de str1 que o y(i) lb $t2, 0($t1) # carrega o byte y(i) em $t2 add $t3, $s0, $t6 # carrega em $t3 endereo de str2 que o x(i) sb $t2, 0($t3) # armazena em x(i) o byte y(i) que est em $t2 addi $s0, $s0, 1 # incremento de 1 (byte seguinte) bne $t2, $0, L1 # se y(i) != 0 ento continua a copiar lw $s0, 0($sp) # seno, recupera antigo valor de $s0 addi $sp, $sp, 4 jr $ra

16 Mdulo 10 Programao de Microprocessadores

Exemplo 2

# Este procedimento calcula o factorial de um inteiro positivo # O argumento recebido em $ a 0 # O resultado (um inteiro de 32 bits) devolvido em $ v 0 # No usa nenhum registo $s0-$s7 por isso no preciso guard-los factorial : subu $sp, $sp, 4 sw $r , 4($sp) # guarda endereo de retorno no s t a c k beqz $a0, termina # testa base da recurso subu $sp, $sp, 4 # ainda no termina sw $a0, 4 ($sp) # guarda o argumento sub $a0, $a0, 1 # ser chamado com n-1 jal factorial # aps a base da recurso ser executada, estas linhas # sero executadas lw $t0, 4($sp) # argumento que guardei no stack mul $v0, $v0, $t0 # n*(n-1) lw $ra, 8($sp) # preparar o retorno addu $sp, $sp, 8 # retirei do stack dois elementos (um endereo e # um argumento) jr $ra termina: li $v0, 1 # 0! = 1 o valor de retorno lw $ra, 4($sp) # obtm endereo de retorno addu $sp, $sp, 4 # ajusta o stack pointer jr $ra # retorna

Exemplo 3

.data 0x10010000 long: . word 7 # dimenso do buffer buffer: .space 7 # buffer onde se armazenam os caracteres teclados .data 0xffff0000 cin: . space 1 # porto de controlo do teclado .data 0xffff0004 in: . space 1 # porto de leitura do teclado .text .globl main main: la $a0, buffer # carrega endereo do buffer lw $v0,long($0) # controlo da longitude do buffer addi $v0,$v0,-1 li $v1,0x0a # caracter return, muda de linha (\n) la $a1, in # carrega endereo in la $a2, cin # carrega endereo de controlo do teclado ctr: lb $t0, 0($a2) andi $t0,$t0,1 beq $t0,$0, ctr lb $s0, 0($a1) # l do porto do teclado sb $s0,0($a0) # armazena o dado no buffer addi $a0,$a0,1 # incrementa apontador do buffer

17 Mdulo 10 Programao de Microprocessadores

fim:

addi $v0,$v0,-1 # decr. tamanho restante buffer bne $v0,$0, ctr # controlo de fim de string li $s0, 0x00 sb $s0,0($a0) # armazena fim de string no buffer jr $ra # retorna ao main

Este cdigo constitui um programa que l os caracteres introduzidos a partir do teclado, sem contudo efectuar um correcto controlo da entrada de dados.

Exemplo 4

Neste exemplo, ao executar o programa, ser mostrado no ecr uma mensagem a dizer Ola Mundo. .section .rodata strOlaMundo: .string "Ola Mundo!\n" .text .globl main main: pushl %ebp pushl $strOlaMundo call printf addl $4, %esp pop %ebp xorl %eax, %eax ret

18 Mdulo 10 Programao de Microprocessadores

Concluso
A elaborao deste trabalho proporcionou um conhecimento bsico da linguagem de programao em Assembly.

19 Mdulo 10 Programao de Microprocessadores

Web Grafia
http://valeriofarias.com/introducao-a-linguagem-assembly/ http://www.portugal-a-programar.pt/topic/134-a-linguagem-assembly/ http://paginas.fe.up.pt/~jmf/mp0304/downloads/aulatp-5.pdf http://cee.uma.pt/people/faculty/pedro.campos/docs/guia-AC.pdf http://paginas.fe.up.pt/~jmf/mp0506/dwnlds/mp1-0506-print.pdf http://eden.dei.uc.pt/~filipius/arquivo/teaching/sebenta.pdf

20 Mdulo 10 Programao de Microprocessadores