Você está na página 1de 53

Aula 13 – Assembly 2 – Para novatos

Anderson L. S. Moreira
anderson.moreira@recife.ifpe.edu.br
http://dase.ifpe.edu.br/~alsm

Anderson Moreira Arquitetura de Computadores 1


O que fazer com essa apresentação

Anderson Moreira Arquitetura de Computadores 2


Escrevendo um simples programa

 Começando com o básico, o aluno se familiariza com


a linguagem;

 Assembly, precisa de dedicação e esforço de lógica;

 Não compare Assembly com outras linguagens de


programação, como C e Java (essa então nem tente
associar!!!)

Anderson Moreira Arquitetura de Computadores 3


Introdução

Um programa contém instruções que serão usadas pelo


processador do computador;

As instruções são chamadas de código do programa;

O processador executa as instruções de código, uma por uma - é


por isso que o programa é chamado de executável;

Quando o programa for carregado, o SO dá ao processador o


endereço a partir do código onde a execução deve começar;

Daquele ponto em diante, cabe ao programa para desviar a


execução para o local correto em seu código.

Anderson Moreira Arquitetura de Computadores 4


Introdução

O que o código realmente faz?


• Uma coisa que faz é mover números de e para os
registradores dentro do processador;
• Existem sete destes para uso geral;
• Cada registro tem 32 bits de dados;
• Chamado um dword (literalmente uma palavra
dupla). Cada bit é ligado ou desligado (um ou
zero) a qualquer momento;
• Este é um número binário. Em 32 bits, se
todos os bits estejam acionados, o número é
4294967295D

Anderson Moreira Arquitetura de Computadores 5


Introdução

Existem também várias instruções aritméticas que


podem ser realizadas pelo processador (ULA);

Outra coisa que o código faz é passar os números


dos registradores da memória e da memória para
os registradores, ou colocar números na memória
stack (pilha).

Anderson Moreira Arquitetura de Computadores 6


Introdução

A pilha é como um prato quente. Coloca um dword na


pilha usando a instrução PUSH e remove o último dword
colocado na pilha usando uma instrução POP;

A memória RAM (memória de acesso aleatório) é a de


referência na pilha, dentro do computador;

A pilha é reservado pelo sistema quando o programa


carrega. Dependendo de suas instruções de dados,
outra memória é reservada pelo sistema quando o
programa carrega. Esta memória é chamada de dados
de memória, terá de ser solicitado pelo programa em
tempo de execução.

Anderson Moreira Arquitetura de Computadores 7


E no sistema Windows?

No SO Windows uma das coisas mais importantes que as


instruções de código fazem é chamar uma função de janela,
ou seja, para desviar a execução para essa função;

As funções do Windows são chamadas APIs (Application


Programmer's Interface). A maioria das instruções de código
seja utilizado para se preparar para essas chamadas e lidar
com o resultado das chamadas;

São estas as chamadas para APIs que darão aos programas a


funcionalidade Janelas, desta forma oferece acesso a uma
vasta gama de processos que resultam em interação com o
usuário;

Anderson Moreira Arquitetura de Computadores 8


O processo de Construção (build)

GoAsm - assembler. Este programa tem a sua fonte de script e


converte-o em um arquivo objeto. Tradicionalmente, a extensão
seria . Asm. A fonte de script contém as linhas de código-fonte que
contém o código e as instruções de dados que foram gravados para
o programa. O arquivo objeto, pode ser lido pelo linker e que é
utilizado para criar o executável final.
Gorc - compilador. Este programa tem o seu script de recursos e
converte-lo em um arquivo .res. O script de recursos é outro arquivo
de texto simples, mas que contém instruções para estabelecer os
controles do Windows - menus, diálogos, ícones, bitmaps e
stringtables. Tradicionalmente, teria a extensão .rc. O arquivo res
está codificado, e é lido pelo linker.
GoLink - vinculador. Este programa tem os arquivos de um ou mais
objetos e um res e cria o executável final.
GoBug - depurador. Com esta ferramenta, o programa executar
cada instrução por vez e ver como cada instrução afeta os
registradores e as áreas de memória.

Anderson Moreira Arquitetura de Computadores 9


O processo de construção pode ser resumido

.asm .obj

.exe

.rc .res

Anderson Moreira Arquitetura de Computadores 10


Criando um programa em branco

Anderson Moreira Arquitetura de Computadores 11


Qual a funcionalidade disso?

A funcionalidade é criar um programa que carrega, executa e


termina sem fazer nada;

Isto é para demonstrar o processo de construção e para


explicar mais algumas coisas.

Anderson Moreira Arquitetura de Computadores 12


Passo 1

Chame o RadASM

Crie um novo projeto (Arquivo → Projeto Novo)


Será executado o assistente de criação;

Escolha conforme figura:


Assemblador → GoASM
Tipo de projeto → Console
Nome do projeto → nada

Clique no botão PROXIMO

Anderson Moreira Arquitetura de Computadores 13


Passo 2

o Escolha na tela seguinte o tipo NONE;


o Clique no botão PROXIMO;
o Em criação de Arquivos, deixe apenas as opções ASM e BAK
habilitadas;
o Na próxima tela clique no botão FINAL.

Anderson Moreira Arquitetura de Computadores 14


Passo 3

 Clique na aba de Projetos, escolha a pasta Assembly e duplo clique


no arquivo “nada.asm”

 Note que o RadASM já ajuda a organizar o seu trabalho, deixando


cada um dos arquivos em uma pasta diferente.

Anderson Moreira Arquitetura de Computadores 15


Passo 4

 Digite o seguinte código

 Este é o programa.
 .code diz ao assembler que o que se segue são as instruções de
código;
 start: é uma etiqueta de código (label). Ele também informa o
vinculador que este é o lugar onde a execução do programa deve
começar;
 ret é uma instrução do processador mnemônica, que informa
ao processador para retornar para o chamador do código (que
neste caso vai ser o próprio Windows.

Anderson Moreira Arquitetura de Computadores 16


Passo 5

 Escolha o menu Montar  Assemble


 Vai aparecer algumas mensagens como a seguir:
GoAsm.Exe Version 0.56.7 - Copyright Jeremy Gordon 2001/9 - JG@JGnet.co.uk
Output file: nada.obj

Make finished.
Total compile time 16 ms

 Depois escolha o mesmo menu Montar  Link

C:\RadAsm\GoAsm\BIN\GoLink.EXE /console "nada.obj"



GoLink.Exe Version 0.26.10 - Copyright Jeremy Gordon 2002/9 - JG@JGnet.co.uk
Output file: nada.exe
Format: win32 size: 1,024 bytes

Make finished.
Total compile time 10577 ms

 Observe que a própria console mostra o comando executado, que


pode ser feita diretamente pelo CMD do Windows.

Anderson Moreira Arquitetura de Computadores 17


Passo 6

 Após esse processo vamos executar nosso programa. Pode ser pelo
menu Montar e após escolher Run, ou escolher Ferramentas  Goto
Dos (essa segunda opção é mais apropriada para a situação);
 Então digite nada, na linha de comando. O que irá acontecer?

Anderson Moreira Arquitetura de Computadores 18


Conclusão

 Note que na verdade não acontece o que o nome diz “nada”;

 O prompt do DOS irá apenas mover para baixo uma linha;

 Mas o Windows estava muito feliz com este programa -


parabéns você fez o seu primeiro programa Assembler -
Windows!

Anderson Moreira Arquitetura de Computadores 19


Criando um programa Ola Mundo

Anderson Moreira Arquitetura de Computadores 20


Passo 1

 Os passos iniciais são semelhantes ao programa anterior;


 A diferença é que o nome do projeto será tads;
 Digite o seguinte código no arquivo tads.asm:

Anderson Moreira Arquitetura de Computadores 21


Passo 2

 A diferença é que na execução do Link (vinculador), execute a opção


Goto Dos e execute:

C:\RadAsm\GoAsm\BIN\GoLink.EXE /console tads.obj kernel32.dll

 Aqui, tem incluído a opção kernel32.dll na linha de comando do


GoLink;

 Isto diz ao vinculador GoLink ,olhar para o arquivo kernel32.dll do


sistema Windows quando liga o arquivo para qualquer incógnitas,
neste caso, o Windows APIs GetStdHandle e WriteFile e que são
necessárias para a execução do programa.

Anderson Moreira Arquitetura de Computadores 22


Dissecando o programa

 Vamos por cada parte do programa:

Anderson Moreira Arquitetura de Computadores 23


Parte 1

.data
PALAVRA dd 0

 “.data" diz ao assembler que uma instrução de dados ou instruções


seguem. Também pode digitar DATA SECTION;

 “PALAVRA" é um rótulo de dados que é um nome que indica um


lugar especial nos dados.

 “dd" cria um dword (4 bytes) de dados (literalmente, "declare


dword").

 "0" inicializa o dword para um valor, neste caso, zero.

Anderson Moreira Arquitetura de Computadores 24


Parte 2

.code
start:
push -11
CALL GetStdHandle

 “.code” e “start” que visto antes. Sendo que posso digitar CODE
SECTION;
 “push” coloca um valor na pilha. O valor neste caso é -11 (expresso
como um número decimal ordinário). Isso é empurrado para a pilha
pronta para enviar para a chamada API como um parâmetro.
 "CALL" transfere a execução de um processo, neste caso, a API do
Windows é GetStdHandle. Esta API tem um parâmetro e retorna um
identificador no registrador EAX para se adequarem. Aqui ele trata
com o valor -11 que é o identificador de saída padrão para o
console. O console é a interface com o usuário, que neste caso será
a janela de MS-DOS (também conhecido como "comando" ou
prompt.

Anderson Moreira Arquitetura de Computadores 25


Parte 3

push 0,addr PALAVRA


push 11,'ola mundo'
push eax
CALL WriteFile

 Aqui o SO empurra os parâmetros prontos para a chamada à API do


Windows WriteFile;
 Esta API escreve para o identificador passado para ela no último
parâmetro (ainda detidas no registrador EAX);
 Ela escreve a string que é de 11 caracteres. Também passa o
endereço de PALAVRA que era o dado DWORD feita anteriormente;
 Isso é necessário porque WriteFile irá reportar em dword quantos
caracteres ele realmente escreve.

Anderson Moreira Arquitetura de Computadores 26


Parte 4

mov eax,0
ret

 Aqui passa o valor 0 no registrador EAX (para indicar um retorno


bem-sucedido) e, em seguida, use RET para retornar ao sistema
(fechando o programa);
 Libera memória.

Anderson Moreira Arquitetura de Computadores 27


Conhecendo o seu programa

O que compõe um programa em assembler

Anderson Moreira Arquitetura de Computadores 28


O que é um programa sem recursos?

Arquivo .asm

Arquivo .exe
ou .dll

Arquivo .obj

Anderson Moreira Arquitetura de Computadores 29


O que é um programa com recursos?

Arquivo .asm

Arquivo .obj Arquivo .exe


ou .dll

Arquivo .rc

Arquivo .res

Anderson Moreira Arquitetura de Computadores 30


Recursos

 Os recursos (resources) são mantidos separadamente para


facilitar a programação;

 São principalmente o conteúdo de menus e janelas, mas


também coisas como bitmaps, cursores e ícones;

 Normalmente, um programa do tipo console não inclui


recursos, uma vez que não faz uso de recursos gráficos do
SO;

 Um programa que usa o Windows GUI (Graphics User


Interface) provavelmente irá utilizar os recursos (mas não
precisa).

Anderson Moreira Arquitetura de Computadores 31


Arquivo .asm

 Este é um arquivo que pode ser criado e editado usando um


editor de texto comum, como vim ou context;

 Se usar o Notepad ou Wordpad deve certificar de salvar o


arquivo em um formato que não acrescenta qualquer controle
ou a formatação de caracteres, diferente da habitual;

 Isso é válido porque as ferramentas de desenvolvimento só


olha para o texto. Se não usar uma extensão para o arquivo, o
editor pode dar um nome “. Txt”;

Anderson Moreira Arquitetura de Computadores 32


Arquivo .asm

 É tradicional entre os programadores para dar a sua fonte scripts


uma extensão que corresponde a língua em que o código-fonte é
escrito;
 Por exemplo, você pode ter um montador arquivo chamado
“meuprog.asm". Da mesma forma que normalmente irá encontrar
o código-fonte escritos na "linguagem C", com a extensão “. c”
ou “. cpp” para C++, “.pas” para pascal e assim por diante. No
entanto, não há mágica em essas extensões. O Assembler aceita
arquivos de qualquer extensão.
 O arquivo .asm contém as instruções para o processador de palavras
e números. Estes são executados pelo processador quando o
programa é executado. Portanto, que o asm, contém o código-fonte
ou o “script de fonte”;
 Quando está pronto para fazer o programa, o GoASM converte
arquivos .asm para os arquivos .obj.

Anderson Moreira Arquitetura de Computadores 33


Arquivo .obj

 Este é um arquivo feito pelo Assembler de um arquivo .asm;


 O Assembler tem as instruções no arquivo ASM. Que estão em
palavras e números e os converte em formato de objeto COFF
que é um formato que o vinculador espera;
 O Assembler concatena todo o seu código e as instruções de
dados em código-fonte e coloca-os em código e seções de
dados no arquivo .obj;
 A seção de código contém as instruções do processador real
(opcodes) que o processador executa quando o programa é
executado.

Anderson Moreira Arquitetura de Computadores 34


Arquivo .obj

 A seção de dados contém informações que serão mantidos na


memória enquanto o programa é executado;
 Não pode realmente executar um arquivo .obj como um
programa, porque não está no formato do programa final
esperado pelo SO (o formato PE);
 Passa o arquivo .obj para o vinculador, quando está pronto
para fazer o programa;
 Às vezes o arquivo .obj é chamado um arquivo “binário” ou
“bin”. Isso ocorre porque o arquivo agora contem apenas
números;
 Mas se olhar para dentro de um arquivo .obj verá as
seqüências de caracteres que estavam no script de origem.

Anderson Moreira Arquitetura de Computadores 35


Arquivo .rc

 Este é um outro arquivo de texto que faz usando um editor


de texto;
 Este arquivo fornecer as instruções em palavras e números,
que o SO usa para fazer os recursos (principalmente menus,
diálogos e stringtables) em seu programa quando ele é
executado;
 Também pode usar o arquivo .rc para nomear os arquivos que
devem ser carregados no .res quando o compilador de
recursos é executado (como, por exemplo, os ícones bitmaps
e cursores);
 O arquivo .rc pode ser descrito como contendo material de
origem;
 Para criar esse arquivo se utiliza o compilador de recursos
GoRC.

Anderson Moreira Arquitetura de Computadores 36


Arquivo .res

 Este é um arquivo feito pelo compilador de recursos a partir


de um arquivo .RC;
 O recurso formado pelo compilador e as instruções do
arquivo .rc que estão em palavras e números e os converte
em uma forma pronta para a inserção na seção de recursos
de um arquivo .exe;
 Passa o .res do vinculador (linker) quando está pronto para
fazer o programa.

Anderson Moreira Arquitetura de Computadores 37


Arquivo .exe

 Este é o arquivo executável final que pode ser executado como um


programa Windows;
 É no formato Portable Executable (PE);
 O arquivo é feito pelo vinculador (linker), que tem um ou mais
arquivos .obj e um .res e combina-os em um arquivo .exe;
 O formato de arquivo PE exige também um cabeçalho com
informações sobre o arquivo;
 O Linker fornece essa informação. Para tornar os programas
Windows, precisará usar um vinculador capaz de fazer os arquivos
PE, por exemplo GoLink.

Anderson Moreira Arquitetura de Computadores 38


Arquivo .dll

 Este arquivo contém os dados e outras funções que o .exe


pode usar quando estiver em funcionamento;
 Na maioria das vezes não vai precisar usar um arquivo .dll em
tudo. No entanto, é útil se você tem muitas funções que
necessitam ser chamadas por mais de um .exe;
 Em vez de duplicar o código nos dois .exe pode tê-lo apenas
uma vez em um arquivo .dll;
 O Windows usa extensivamente para fornecer acesso às APIs
para aplicações do SO. O linux utiliza em geral arquivos .lib;
 Dê uma olhada na pasta do sistema \Windows no seu
computador - isto é onde o Windows Dlls são normalmente
mantidas, ou no diretório /lib no Linux.

Anderson Moreira Arquitetura de Computadores 39


Sintaxe para utilização de .dll

GoLink @comando

 Em que a parte designada por comando pode ser:

/debug coff
Myprog.obj
Myprog.res
Kernel32.dll

 As linhas informa o linker a procurar no arquivo kernel32.dll pela


API para identificar chamadas feitas no programa;
 Esta é uma parte necessária do processo de vinculação. É bem
possível que o programa faz chamadas para APIs que estão em Dlls
do sistema.

Anderson Moreira Arquitetura de Computadores 40


Por que um código em nível tão básico?

Anderson Moreira Arquitetura de Computadores 41


Porque?

 Existem várias razões, entre elas:

 Código enxuto: Codificando em baixo nível, reduz o código para


o mínimo exigido;

 Velocidade: Menor tamanho de código significa que os


programas carregam mais rápido e executam mais rápido;

 Controle: Desenvolvedor está no controle do código, não o


compilador. Isto significa que sabe exatamente o que o
processador está fazendo enquanto se move através de seu
código. Isto torna mais fácil para acertar as coisas e para
encontrar erros;

 Satisfação: Você mesmo está escrevendo o programa. Não está


sendo escrito em parte pelo compilador.

Anderson Moreira Arquitetura de Computadores 42


Os componentes de um código ASM

 Basicamente os códigos podem ser definidos nas seguintes


categorias:
 Instruções de Registradores;
 Instruções de Pilha;
 Instruções de Execução;
 Instruções de Memória;
 Instruções de Sinais;
 Declarações de Memória;
 Instruções do Sistema Operacional.

Anderson Moreira Arquitetura de Computadores 43


Instruções de Registradores

 Isto é onde o Desenvolvedor diz ao processador para mover dados


ou executar cálculos utilizando os seus próprios registros de 32
bits;
 Existem 6 registros para uso geral, chamado EAX, EBX, ECX, EDX, ESI
e EDI (não são novidades!). Exemplos dessas instruções são:

MOV ESI,EBX ;move conteúdo do registrador EBX para ESI


ADD EAX,EDI ;adiciona o conteúdo do registrador EDI para EAX
BT ECX,0 ;testa o bit 0 do registrador ECX
CMP EDX,450 ;compara conteúdo de EDX com 450
DIV ECX ;divide EDX:EAX (long integer) por ECX
MUL ECX ;multiplica EAX por ECX resultado em EDX:EAX (long
;integer)
SHL EDX,4 ;shift EDX bits para esquerda em 4 bits (multiplica por
;16)
TEST EAX,8 ;testa o bit 3 do registrador EAX

Anderson Moreira Arquitetura de Computadores 44


Instruções de Pilha

 A pilha é uma área de memória fornecido pelo SO para cada


programa em execução usar como uma área de armazenamento
temporário. Exemplos dessas instruções:

PUSH EAX ;coloca o conteúdo do registrador EAX para pilha


POP EDX ;tira a última coisa colcoada na pilha para EDX
PUSH 1000h ;coloca o valor 1000 em hexa na pilha
MOV EBP,ESP ;mantem o valor no ponteiro da pilha no registrador
;EBP
SUB ESP,30h ;movo o ponteiro da pilha para fazer uma área para
;dados locais
MOV D[EBP-20h],500h ;insere o valor 500 em hexa em uma área de dados local

Anderson Moreira Arquitetura de Computadores 45


Instruções de Execução

 Desvia o processador para executar código de um ponto a outro de


acordo com a próxima linha dentro do código-fonte. Exemplos:

CALL MAKEWINDOW ;executa o procedimento e depois retorna


CALL EAX ;executa o endereço de código de EAX e depois
;retorna
RET ;termina um procedimento retornanco para o chamador
JZ 4 ;continua a execução do label 4: se o resultado for
;zero
JC >.fin ;continua a execução de .fin se a flag carry estiver
;habiltada (set)
JMP MAKEWINDOW ;continua a execução do procedimento identificado
LOOP 2 ;decrementa ECX e pula para label 2: a menos que ECX=0

Anderson Moreira Arquitetura de Computadores 46


Instruções de Memória

 Lêem ou escrevem em áreas da memória que não seja a pilha.


Normalmente, essa memória pode estar na seção de dados
executável (.data) ou ele próprio poderia ser memória alocada pelo
SO em tempo de execução. Exemplos:

ADD EAX,[ESI] ;adiciona em EAX conteúdo de memória apontado por


;ESI
MOV EAX,[MYDATA] ;move para EAX conteúdo de memória do label MYDATA
SUB D[MYDATA+64],10h ;subtrai 10h da dword de MYDATA mais 64 bytes
CMP B[MYDATA+EDX*4],2 ;compara um byte com 2 em parte do array MYDATA
LODSB ;carrega byte da memória apontada por ESI em AL
STOSD ;carrega o conteúdo de EAX dentro da memória
;apontada por EDI

Anderson Moreira Arquitetura de Computadores 47


Instruções de Sinais (flag)

 As principais flags que iremos usar são Z (zero flag), C (carry flag), S
(flag de sinal) e D (flag de direção). A maioria das instruções altera
as flags automaticamente para dar o resultado da instrução. Existem
instruções específicas que podemos usar para mudar as flags do
processador manualmente:

STC ;inicializa a carry flag


CLC ;limpa o conteúdo carry flag
STD ;inicializa a flag de direção
CLD ;limpa a flag de direção

Anderson Moreira Arquitetura de Computadores 48


Declarações de Memória

 O SO reserva uma memória para o executável quando ele é


executado.
 As declarações são feitas para reservar memória na seção de dados
(.data) ou seção constante (.cons), se os dados devem ser
inicializados, isto é, definida como um valor.
 Se os dados não precisa ser inicializado a área de dados pode ser
reservado na seção de dados não inicializados.
 Isso não ocupa nenhum espaço do arquivo EXE. Ao invés de espaço
em memória é alocado para este tipo de dados quando inicia o
primeiro executável.
 Exemplos de como a memória é declarada:

Anderson Moreira Arquitetura de Computadores 49


Declarações de Memória

DB 4 ;declara um byte e seta com o


;valor inicial de 4
MYDATA DB 4 ;a byte com valor inicial de
;4 com label MYDATA
MYSTRUCT DD 16 DUP 0 ;16 dwords todos setados com
;zero chamado MYSTRUCT
BUFFER DB 1024 DUP ? ;1024 bytes chamado BUFFER em
;área de dados não definida

Anderson Moreira Arquitetura de Computadores 50


Instruções do SO

 Possibilita ao programadores assembler acesso a um vasta gama de


APIs (Applications Programming Interface).
 Este é o código dentro do sistema operacional. Exemplos:

PUSH 12h ;coloca o valor 12 hexa na pilha para chamar


;API
CALL GetKeyState ;fala ao Windows para buscar o estado da tecla
;do teclado em EAX
TEST EAX,80000000h ;testa se a tecla <ALT> é pressionada (bit 31
;set)
JZ >L22 ;caso não, pula para frente de L22

Anderson Moreira Arquitetura de Computadores 51


Outras informações

 Instruções para dizer ao Assembler em qual seção colocar o código


fonte.
 O Assembler marca a seção de código como seções de leitura,
executável e dados, definidos e indefinidos como leitura / gravação:

CODE SECTION ;todo código nessa seção será marcada como


;read-only e executavél (.code)
DATA SECTION ; todo código nessa seção será marcada como
;atributo de read/write mas não atributos
;de código (.code)
CONST SECTION ; todo código nessa seção será marcada como
;read

Anderson Moreira Arquitetura de Computadores 52


Dúvidas

Anderson Moreira Arquitetura de Computadores 53

Você também pode gostar