Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

Unidade I
Iniciando na Linguagem Assembly
Linguagem de 
Montagem
Diretor Executivo 
DAVID LIRA STEPHEN BARROS
Gerente Editorial 
ALESSANDRA VANESSA FERREIRA DOS SANTOS
Projeto Gráfico 
TIAGO DA ROCHA
Autoria 
GISELLE AZEVEDO PINTO
AUTORIA
Giselle Azevedo Pinto
Olá. Sou formada em Sistemas de Informação e pós-graduada em 
Cibersegurança e em Produção e Sistemas, mestra em Engenharia de 
Produção, com experiência técnico-profissional de mais de 20 anos na 
área de Tecnologia da Informação. Sou apaixonada pelo que faço e adoro 
transmitir minha experiência de vida àqueles que estão iniciando em suas 
profissões. Por isso, fui convidada pela Editora Telesapiens a integrar seu 
elenco de autores independentes. Estou muito feliz em poder ajudar você 
nesta fase de muito estudo e trabalho. Conte comigo!
ICONOGRÁFICOS
Olá. Esses ícones irão aparecer em sua trilha de aprendizagem toda vez 
que:
OBJETIVO:
para o início do 
desenvolvimento 
de uma nova 
competência;
DEFINIÇÃO:
houver necessidade 
de apresentar um 
novo conceito;
NOTA:
quando necessárias 
observações ou 
complementações 
para o seu 
conhecimento;
IMPORTANTE:
as observações 
escritas tiveram que 
ser priorizadas para 
você;
EXPLICANDO 
MELHOR: 
algo precisa ser 
melhor explicado ou 
detalhado;
VOCÊ SABIA?
curiosidades e 
indagações lúdicas 
sobre o tema em 
estudo, se forem 
necessárias;
SAIBA MAIS: 
textos, referências 
bibliográficas 
e links para 
aprofundamento do 
seu conhecimento;
REFLITA:
se houver a 
necessidade de 
chamar a atenção 
sobre algo a ser 
refletido ou discutido;
ACESSE: 
se for preciso acessar 
um ou mais sites 
para fazer download, 
assistir vídeos, ler 
textos, ouvir podcast;
RESUMINDO:
quando for preciso 
fazer um resumo 
acumulativo das 
últimas abordagens;
ATIVIDADES: 
quando alguma 
atividade de 
autoaprendizagem 
for aplicada;
TESTANDO:
quando uma 
competência for 
concluída e questões 
forem explicadas;
SUMÁRIO
A linguagem de baixo nível ..................................................................... 10
O que é linguagem de baixo nível ......................................................................................10
Conhecendo a linguagem de montagem ..................................................................... 15
A importância da linguagem de montagem ....................................20
Linguagem de montagem ....................................................................................................... 20
Representação dos dados em assembly ..........................................29
Pseudoinstruções da linguagem de montagem .....................................................29
Execução do primeiro programa em assembly .............................. 41
Usando o DEBUG do Windows............................................................................................. 41
7
UNIDADE
01
Linguagem de Montagem
8
INTRODUÇÃO
Você sabia que a área de linguagem de montagem é uma das 
mais demandas na indústria e será responsável pela geração de muitos 
empregos nos próximos 10 anos? Isso mesmo! A linguagem de montagem 
está presente em todas as máquinas de uma empresa, independentemente 
do tipo de fabricante. Trata-se de uma linguagem universal para o ambiente 
tecnológico. Ao fazer a engenharia reversa em qualquer programa, 
teremos como resultado a linguagem de montagem como base da análise 
desse software. Uma das características da linguagem de montagem é ser 
executada o mais rápido possível, deixando o programa curto e fácil de 
depurar. Os programas pequenos são mais fáceis de depurar, o que deixa 
o hardware mais rápido e com estado de espera muito baixo. Grandes 
empresas da área de tecnologia estão juntando esforços para aperfeiçoar 
projetos para serem executados em linguagem de montagem, fazendo 
que os aplicativos tenham maior integração. Também conhecido como 
linguagem de baixo nível, o Assembly permite que pessoas que utilizam a 
linguagem de alto nível para programar consigam compreender e analisar 
os bugs de diversos programas, identificando os erros ocorridos durante 
sua execução e compreendendo quando o programa de alto nível não 
consegue ser executado em determinadas máquinas ou problemas em 
rotinas de temporização. Entendeu? Ao longo desta unidade letiva, você 
vai mergulhar neste universo!
Linguagem de Montagem
9
OBJETIVOS
Olá. Seja muito bem-vindo à Unidade 1. Nosso objetivo é auxiliar 
você no desenvolvimento das seguintes competências profissionais até o 
término desta etapa de estudos:
1. Definir os conceitos básicos de linguagem de baixo nível, 
linguagem montadora ou linguagem de montagem.
2. Discernir sobre a importância da linguagem de montagem no 
contexto histórico e atual da informática e computação.
3. Representar dados de vários tipos na linguagem de montagem.
4. Implementar um programa para identificar os procedimentos da 
linguagem de montagem.
Linguagem de Montagem
10
Linguagem de baixo nível
OBJETIVO:
Ao término deste capítulo, você será capaz de definir os 
conceitos básicos de linguagem de baixo nível, linguagem 
montadora ou linguagem de montagem. Isso será 
fundamental para o exercício de sua profissão. As pessoas 
que tentaram diferenciar a linguagem de baixo nível da 
linguagem de alto nível sem a devida instrução tiveram 
problemas na execução e compilação do código, por não 
saberem o que realmente estava acontecendo ao executá-
lo. E então? Motivado para desenvolver essa competência? 
Então, vamos lá. Avante!
O que é linguagem de baixo nível
Gerar programas para computadores vem se tornando uma 
atividade comum entre usuários menos experientes e usuários com idade 
cada vez mais baixa. A programação já pode ser introduzida na vida das 
crianças a partir do momento em que elas estão sendo alfabetizadas, 
para desenvolver jogos e pequenos projetos. 
Figura 1 – Montagem de um quebra-cabeça
Fonte: Freepik
Linguagem de Montagem
11
Isso se dá devido ao fato da linguagem de computador, ou seja, a 
linguagem de máquina, estar se aproximando cada vez mais da linguagem 
humana. No entanto, quando apareceram as primeiras gerações de 
linguagens de programação, a programação era mais complexa e exigia 
conhecimentos de hardware.
A linguagem de montagem, também conhecida como Assembly, 
foi a primeira linguagem de programação em relação à segunda geração 
de linguagens de programação. A linguagem de programação Assembly 
foi a primeira linguagem de montagem de baixo nível. 
IMPORTANTE:
O Assembly foi criado na década de 1950 e iniciou a 
segunda geração de linguagens de programação, na qual 
os computadores eram movidos a válvula. 
Nesse período, os cientistas buscavam poder de processamento 
mais rápido devido à necessidade imposta pela Segunda Guerra Mundial, 
em que países como os Estados Unidos e a Rússia estavam disputando 
a corrida espacial e ambos estavam focados no desenvolvimento de 
armamentos.
VOCÊ SABIA?
Quando foi inventado o transistor, os computadores 
conseguiram ficar mais rápidos e menores. Com essa 
invenção, houve a necessidade de elaborar uma nova 
programação. 
Linguagem de Montagem
12
Figura 2 – Transistores, microprocessadores e outros equipamentos eletrônicos
Fonte: Freepik
Esse modelo de programação tinha de ter a leitura e a escrita 
mais simples, pois naquele momento a programação era feita com 
cartões perfurados. A nova programação precisava manter o nível de 
programação bem próximo da linguagem de máquina. Foi assim que 
apareceu a linguagem de baixo nível, em que a primeira linguagem de 
montagem foi o Assembly.
IMPORTANTE:
Quando o Assembly foi projetado, os códigos escritos 
em linguagem Assembly deveriam ser traduzidos para a 
linguagem de máquina utilizando um montador assembler. 
Por essa razão, até hoje a linguagem de programação 
Assembly também é conhecida como linguagem de 
montagem ou linguagem montadora. 
Podemos classificar as linguagens como de alto nívelou baixo 
nível. A classificação ocorre de acordo com a facilidade de manuseio e 
uso ou de acordo com a proximidade da linguagem de máquina, ou seja, 
a linguagem binária usada pelo hardware do computador.
Linguagem de Montagem
13
Mesmo nos dias de hoje, as linguagens de baixo nível continuam 
sendo peça fundamental para diversas aplicações e para a segurança 
da informação. Temos diversas linguagens disponíveis hoje, cada uma 
com suas características, e a aplicação pode variar de acordo com 
a necessidade de quem está programando. Na internet, utilizamos a 
linguagem de programação HTML, sendo que quando a aplicação HTML 
precisa de um recurso mais complexo utilizamos o PHP ou o Java.
Figura 3 – Relação da linguagem de montagem em relação a outras linguagens
Linguagem de alto nível (HTML, PHP, JAVA, C)
Linguagem de montagem (Assembly)
Linguagem de máquina 
Hardware
Fonte: Elaborada pela autora (2022).
Nos últimos anos, as linguagens de programação passaram por 
um processo de evolução muito grande. Nos dias atuais, temos diversas 
linguagens de programação, como C++, PHP, HTML, Python, C♯, Pascal, 
Java e Assembly.
A linguagem de programação de baixo nível se trata de outro 
nível de programação, pois utilizamos a essência que está presente em 
todos os computadores por meio da linguagem de montagem, também 
conhecida como Assembly. 
Quando falamos de nível da linguagem de montagem, falamos de 
uma característica com significado diferenciado em relação aos níveis 
de máquina de um sistema operacional, pois a linguagem de montagem 
implantada é traduzida, e não interpretada.
VOCÊ SABIA?
Quando temos linguagens de programação que convertem 
um código escrito pelo usuário para outra linguagem, são 
classificadas como programas tradutores. 
Linguagem de Montagem
14
A linguagem em que o programa original é escrito é chamada 
de linguagem-fonte. A linguagem para a qual o programa é convertido 
é chamada de linguagem-alvo. Tanto a linguagem-fonte quanto a 
linguagem-alvo podem classificar os tipos de níveis de programação. 
Se existir um processador para executar os programas escritos em 
linguagem-fonte, então não existe a necessidade de traduzir o programa-
fonte para a linguagem-alvo. 
Todo o processo de tradução de um programa é utilizado quando 
existe um processador, como hardware ou interpretador, disponível para 
a linguagem-alvo, porém não disponível para a linguagem-fonte. Caso a 
tradução seja realizada corretamente, a execução do programa traduzido 
dará resultados idênticos aos que a execução do programa-fonte daria se 
houvesse um processador disponível para ele. Por esse motivo, podemos 
implementar um novo nível de programação em que não existe processador 
para traduzir o código. Primeiramente, o programa é traduzido para o nível-
alvo e depois é executado o programa do nível-alvo.
IMPORTANTE:
Devemos prestar atenção na diferença entre tradução de um 
programa e interpretação de um programa. No processo de 
tradução, o programa fonte, que foi escrito na linguagem-
fonte, não é executado de forma direta. No processo de 
tradução o programa-fonte é convertido para um outro 
programa equivalente, chamado de programa-objeto ou 
também chamado de programa binário executável, no qual 
a execução é feita depois que a tradução é concluída. 
Nesse processo, temos duas etapas de tradução:
– É feito um programa equivalente na linguagem-alvo, em formato 
objeto ou executável.
– É feita a execução do programa recém-gerado.
As duas etapas não acontecem no mesmo momento. A segunda 
etapa só pode ser iniciada depois da conclusão da primeira etapa. 
Entretanto, no processo de interpretação, não existe só uma etapa: a 
execução do programa-fonte original. Não é necessário criar antes um 
Linguagem de Montagem
15
programa equivalente, sendo que o programa-fonte pode ser convertido 
para uma forma intermediária (por exemplo, código de bytes Java), uma vez 
ou outra, para facilitar o processo de interpretação.
No programa-objeto, por sua vez, quando está em processo de 
execução, somente três níveis são evidenciados: microarquitetura, ISA e 
sistema operacional. 
Consequentemente, o programa-objeto do usuário no sistema 
operacional e, caso tenha, o microprograma podem ser achados na 
memória da máquina (computador) durante o processo de execução. 
Dessa forma, os vestígios do programa-fonte original somem. Sendo assim, 
a quantidade de níveis presentes no processo de execução pode ser 
diferente da quantidade de níveis presentes antes do processo de tradução. 
Conhecendo a linguagem de montagem 
Consideramos uma linguagem de montagem aquela linguagem 
em que cada declaração feita gera exatamente uma instrução em código 
de máquina. Em outras palavras, há uma equivalência de um para um, 
ou seja, para cada código de máquina, temos um código de montagem 
(STALLINGS, 2002).
Exemplo: Se no programa de linguagem de montagem há 10 linhas 
de instrução, então o código de máquina terá 10 linhas de instrução. Cada 
instrução da linguagem de montagem produz exatamente uma instrução de 
linguagem de máquina. Ou seja, se um código de linguagem de montagem 
tem n linhas de instrução, então o código da linguagem de máquina terá 
também n linhas de instrução.
Por esse motivo, os programadores fazem uso da linguagem de 
montagem em vez da linguagem de máquina que usa instruções binárias 
ou hexadecimais, pois é mais fácil de gerar o código de instrução para 
o programa. A linguagem de montagem faz uso de escrita simbólica e 
endereços simbólicos em vez de escrita binária ou escrita hexadecimal. 
Linguagem de Montagem
16
VOCÊ SABIA?
Para a maioria das pessoas, é mais fácil guardar o nome de 
uma pessoa em vez do número do CPF. 
Grande parte das pessoas conseguem memorizar as abreviaturas 
para operações como multiplicar, dividir, subtrair e somar, que são MUL, 
DIV, SUB e ADD. Todavia, poucas pessoas conseguem memorizar os 
números binários ou hexadecimais que a máquina usa. 
A pessoa que programa em linguagem de montagem precisa 
memorizar os códigos simbólicos que a linguagem de montagem utiliza 
e o assembler traduz esses códigos para código de máquina. O mesmo 
procedimento acontece com os endereços. A pessoa que programa em 
linguagem de montagem usa nomenclaturas simbólicas de endereços de 
memória e deixa para o montador assembler a tarefa de informar os dados 
numéricos.
IMPORTANTE:
Todo código gerado pelo montador assembler faz uso 
de mnemônicos, ou seja, faz uso de palavras pequenas 
como MUL, SUB e ADD para instruções de máquina, como 
multiplicar, subtrair e somar, com o objetivo de se tornar 
mais fáceis de lembrar.
O trabalho do programador de linguagem de máquina é trabalhar 
com dados numéricos quando faz referência aos endereços. Nos dias 
atuais, ninguém mais programa em linguagem de máquina, devido ao alto 
grau de complexidade, embora essa realidade fosse diferente há algumas 
décadas, antes da existência dos montadores assemblers.
As linguagens de montagem possuem outra característica além 
de referenciar cada instrução de montagem para linguagem de máquina, 
que é a característica dela ser uma linguagem de baixo nível. A pessoa 
que programa em linguagem de montagem tem acesso a recursos 
e instruções que estão na máquina-alvo. A pessoa que programa em 
Linguagem de Montagem
17
linguagem de alto nível não possui acesso a instruções e recursos que 
estão na máquina-alvo. 
Exemplo: Como exemplo, podemos citar uma máquina-alvo com 
um bit de excesso (conhecido como overflow), em que a linguagem de 
montagem pode fazer um teste nesse bit, porém um programa de alto 
nível, como PHP ou Java, não possui esse nível de acesso e permissão. 
O programa em linguagem de montagem pode executar todas 
as instruções que estão no conjunto de instruções de linguagem de 
máquina, que é a máquina-alvo. Todavia, o programa feito em linguagem 
de alto nível não consegue fazer essetipo de execução. 
Em resumo, todos os códigos que podem ser gerados em linguagem 
de máquina também podem ser gerados em linguagem de montagem, 
mas as instruções, os registradores e os outros recursos semelhantes não 
ficam presentes para serem utilizados por pessoas que programam em 
linguagem de alto nível, como JAVA ou PHP. 
Figura 4 – Linguagens de programação de alto nível
Fonte: Freepik
As linguagens para desenvolvimento de sistemas, como a 
linguagem C, costumam ser um híbrido, ou seja, possuem a estrutura de 
uma linguagem de alto nível, mas possuem acesso a recursos de máquina 
que são características de uma linguagem de montagem.
Linguagem de Montagem
18
Uma característica muito importante, que é um diferencial, é que 
um programa feito em linguagem de montagem poderá ser executado 
exclusivamente em determinado tipo de máquina, ao contrário do escrito 
na linguagem de alto nível, que pode ser executado em diversos tipos de 
equipamentos. 
Para exemplificar, vamos ver uma função de condição em linguagem 
de alto nível:
if (i == 0) 
 k=1;
Else 
 k=2;
Agora, vamos ver a mesma função de condição em linguagem de 
montagem para uma máquina:
CMP i,0 ;compare i com 0
BNE Else ;Desvie se for diferente 
Then: MOV k,1 ;Mova 1 para k
BR Next ;Desvio incondicional
Else: MOV k,2 ;Mova 2 para k 
Next:
Vamos ver outro exemplo, agora com uma estrutura condicional 
escrita em outra linguagem de alto nível e com mais instruções:
if (R1 == 0) { 
 R2 = R3;
 R4 = R5;
} else { 
 R6 = R7;
 R8 = R9;
}
Linguagem de Montagem
19
Agora, vamos ver a mesma estrutura condicional vista anteriormente, 
mas em linguagem de montagem para uma arquitetura de máquina 
específica:
 CMP R1,0
 BNE L1
 MOV R2,R3
 MOV R4,R5
 BR L2
L1: MOV R6,R7 
 MOV R8,R9 
L2: 
RESUMINDO:
E então? Gostou do que lhe mostramos? Aprendeu mesmo 
tudinho? Agora, só para termos certeza de que você 
realmente entendeu o tema de estudo deste capítulo, 
vamos resumir tudo o que vimos. Você deve ter aprendido 
que a linguagem de montagem é muito importante e 
que cada linha de instrução é executada pela linguagem 
de máquina. A linguagem de montagem veio simplificar 
a programação em linguagem de máquina, mas sem se 
distanciar dos conceitos e padrões adotados por esta. 
A linguagem de montagem consegue acessar todos os 
recursos que a linguagem de máquina acessa, no entanto, 
utilizando uma linguagem simbólica em vez de linguagem 
numérica. A linguagem de máquina utiliza código numérico 
e hexadecimal, mas a linguagem de montagem utiliza 
linguagem com símbolos, o que facilita bastante a vida 
do programador. Um recurso muito importante presente 
na linguagem de montagem é que ela acessa todos os 
recursos que a linguagem de máquina acessa, o que a 
torna muito poderosa para acessar recursos da máquina 
que outras linguagens de alto nível não conseguem. 
Linguagem de Montagem
20
A importância da linguagem de montagem
OBJETIVO:
Ao término deste capítulo, você será capaz de definir 
a importância da linguagem de montagem. Isso será 
fundamental para o exercício de sua profissão. As pessoas 
que tentaram diferenciar a linguagem de montagem da 
linguagem de alto nível sem a devida instrução tiveram 
problemas, pois não reconheceram a importância da 
linguagem de montagem para solucionar determinados 
problemas de forma mais eficiente. E então? Motivado para 
desenvolver essa competência? Então, vamos lá. Avante!
Linguagem de montagem
Vamos falar sobre a linguagem que, em essência, está presente em 
todas máquinas computacionais (notebooks, desktops, all-in-one, entre 
outros): a linguagem de montagem (ou linguagem Assembly). 
DEFINIÇÃO:
O montador é um programa que recebe como entrada um 
programa em linguagem de baixo nível, que é a linguagem 
de máquina, e gera um código-objeto como saída. O 
código-objeto é um arquivo binário. O montador enxerga 
esse arquivo como um bloco de memória, iniciando-se na 
posição relativa a 0.
Consideramos uma linguagem de montagem aquela linguagem 
em que cada declaração produz uma instrução de máquina, ou seja, 
uma instrução de montagem para uma instrução de máquina. Isto é, é 
uma relação de um para um entre instrução de montagem e instrução de 
máquina.
Quando falamos em segurança, principalmente em segurança 
da informação, pensamos em malwares e vírus que atuam em nível 
interno de comandos no sistema operacional e linguagem de máquina. 
Linguagem de Montagem
21
Ter conhecimento em linguagem de montagem, ou seja, em linguagem 
Assembly é uma grande vantagem em relação a esse risco. 
IMPORTANTE:
A linguagem de montagem é fundamental para conseguir 
decodificar e também interpretar as ações que são 
realizadas pelos programas maliciosos.
Com isso, nas atividades relacionadas à segurança da informação 
com foco em defesa de ameaças, podemos aplicar um recurso conhecido 
como “engenharia reversa”, pelo qual conseguimos transformar um código 
já compilado em código de montagem, ou seja, código Assembly.
VOCÊ SABIA?
Ao realizar o processo reverso de compilação, ou seja, de 
descompilação, podemos compreender o comportamento 
de um programa do tipo malware ou um programa do tipo 
ransomware, que tem o objetivo de executar instruções 
de baixo nível, efetuar quebra de códigos de segurança e 
executar o crackeamento de programas.
Na figura a seguir, temos um exemplo de arquivo em formato 
exe (executável) que foi decodificado no programa IDA-PRO. Podemos 
observar o código assembler como resultado desse arquivo exe.
Linguagem de Montagem
22
Figura 5 – Relação da linguagem de montagem em relação a outras linguagens
; static errno_t __cdecl memcpy_s(void *const Destination, const rsize_t 
DestinationSize, const void *const Source, const rsize_t SourceSize)
memcpy_s proc near
arg_0= qword ptr 8
arg_8= qword ptr 10h
mov [rsp+arg_0], rbx
mov [rsp+arg_8], rsi
push rdi
sub rsp, 20h
mov rbx, r9
mov rsi, r8
mov rdi, rdx
test rcx, rcx
jnz short loc_1400016AD
Fonte: Elaborada pela autora com base no programa IDA-PRO.
O processo visto na figura apresentada é conhecido como 
engenharia reversa, ou “disassembler” ou “decompilação”, ou seja, um 
arquivo que foi analisado por meio de linguagem de montagem e com 
resultado. Conseguimos refazer o código-fonte com o propósito de anular 
a execução do arquivo na máquina.
DEFINIÇÃO:
O processo de engenharia reversa consiste em refazer os 
passos iniciais da execução do programa, tomando como 
base o programa final. Em termos de comparação, é como 
se experimentássemos e analisássemos um pedaço de 
“bolo”. Após análise, conseguimos identificar as quantidades 
de farinha, açúcar, manteiga, fermento e ovo que foram 
usadas na receita, e, como resultado, podemos refazer a 
receita parindo do resultado da análise de ingredientes que 
foram usados na elaboração do produto.
Linguagem de Montagem
23
Os recursos computacionais e as linguagens de programação 
estão evoluindo bastante nos últimos anos. A constante busca por tornar 
os programas fáceis e velozes para novos aplicativos tem demandado 
grande e constante aperfeiçoamento das linguagens. Há sempre uma 
busca de interatividade com novos recursos e novos processos intuitivos, 
em que o objetivo é deixar que o tempo utilizado na programação se 
torne pequeno e as aplicações sejam desenvolvidas cada vez mais em 
tempos menores.
No entanto, conhecer e aplicar a linguagem Assembly, mesmo 
nos dias de hoje, é muito importante para os programadores executarem 
atividades relacionadas a analisar códigos maliciosos, e também para 
os programadores e pesquisadores que buscam desenvolver novas 
tecnologias.
Em tempos atuais, a linguagem Assembly é uma forte ferramenta 
usada na análise de programas de tipo malware ou outros programas 
classificados como maliciosos. Ignorar esse conhecimento pode significar 
estar nas mãosde invasores e reféns de softwares de empresas de 
segurança, que nem sempre estão tão atualizadas como os próprios 
invasores.
Atualmente, diversas empresas gigantes da área de tecnologia 
uniram esforços para desenvolver a linguagem WebAssembly, que é uma 
linguagem de montagem voltada para aplicações web com o objetivo de 
unificar aplicações e facilitar o uso de recursos da plataforma web.
IMPORTANTE:
A linguagem WebAssembly é uma nova linguagem com 
base na linguagem de montagem Assembly. A proposta 
de ter uma plataforma unificada que rode qualquer tipo 
de programa pela web fez com que grandes empresas 
de tecnologia abraçassem o projeto. A linguagem 
WebAssembly tem grandes implicações em programas 
que rodam em plataforma web, pois vai fornecer um novo 
jeito de executar na web códigos em diversas linguagens 
com velocidade nativa. Outros aplicativos que tentaram 
executar essa tarefa não tiveram bons resultados.
Linguagem de Montagem
24
VOCÊ SABIA?
A linguagem WebAssembly foi criada para complementar 
e auxiliar na execução da linguagem JavaScript. No projeto, 
com as APIs JavaScript do WebAssembly, podemos 
carregar módulos WebAssembly para um app JavaScript 
e depois compartilhar suas funcionalidades entre os 
programas. 
Esse recurso faz que você aproveite ao máximo o desempenho e 
os poderosos recursos da linguagem WebAssembly junto com outros 
recursos expressivos e flexíveis que a linguagem JavaScript proporciona 
nos mesmos aplicativos. A linguagem WebAssembly está sendo 
desenvolvida como um padrão para web e será ativada nos principais 
navegadores.
IMPORTANTE:
A linguagem WebAssembly é um novo código que será 
executado nos navegadores modernos e fornecerá novas 
características e grandes ganhos de performance. 
A linguagem WebAssembly foi projetada para ser um eficiente 
compilador para linguagens como Rust, C, C++, entre outros. Ela possui 
grandes implicações para a plataforma web, pois fornece um novo 
caminho para executar os códigos que foram escritos em diversas 
linguagens na web, em que a velocidade de processamento será próxima 
da linguagem nativa, mas com aplicações executadas na web. 
Módulos do programa WebAssembly podem ser importados em 
aplicações web ou bibliotecas como Node.js, expondo as funções da 
linguagem WebAssembly pelos códigos JavaScript. 
Os objetivos da linguagem WebAssembly são:
– Ser uma linguagem rápida, móvel e eficiente, em que o código 
poderá ser executado a velocidades próximas das nativas, sem depender 
da plataforma, fazendo melhor uso do hardware.
Linguagem de Montagem
25
– Ser de fácil compreensão e debugável, ou seja, mesmo sendo uma 
linguagem de baixo nível, o texto será compreensível para os humanos 
permitindo que o código seja editável, visualizado e debugado à mão.
– Ser segura, pois a linguagem WebAssembly é projetada para 
funcionar em ambiente seguro e controlado, e assim como outros 
programas, a linguagem manterá as mesmas regras relacionadas a 
origem e recursos de permissões para navegadores.
– Não substituir outros programas na web, pois a linguagem 
WebAssembly tem a função de trabalhar em harmonia com outras 
tecnologias web, com o objetivo de manter a compatibilidade dos 
sistemas.
Vale ressaltar que o projeto do WebAssembly também permitirá 
execuções off-line. A linguagem WebAssembly pode se encaixar na 
plataforma web por meio de uma máquina virtual (VM, junto com o 
código que executa a aplicação web, como os códigos JavaScript) e em 
APIs que podem ser invocados por um web app para controlar funções do 
navegador acionando outros recursos da máquina.
Uma máquina virtual pode carregar apenas códigos JavaScript. 
Esse recurso tem sido útil até o momento, resolvendo grande parte 
dos desafios web. Todavia, atualmente já estamos com problemas 
de performance quando precisamos usar o JavaScript para executar 
atividades mais intensas, como jogos em 3D, realidade virtual e realidade 
aumentada, edição de imagens ou vídeos, visão de computador, além de 
outros domínios que exigem performance nativa.
Atualmente, o custo para baixar e compilar aplicações desenvolvidas 
em JavaScript em arquivos muito grandes é proibido. Muitas plataformas 
de ambiente mobile e outras plataformas com recursos mais restritos 
conseguem ampliar a performance em relação ao programa.
Linguagem de Montagem
26
IMPORTANTE:
A linguagem WebAssembly foi projetada para 
complementar e atuar ao lado do JavaScript, dando aos 
desenvolvedores algumas vantagens em relação aos 
demais. 
Cumpre lembrar que o JavaScript é uma linguagem considerada 
de alto nível, muito flexível e muito usada para escrever aplicações para 
web. A linguagem JavaScript possui muitas vantagens, por exemplo, é 
uma linguagem dinâmica, não tem a necessidade de ser compilada e 
possui grande recurso com diversos e poderosos frameworks, bibliotecas 
e outras vantagens.
Já a linguagem WebAssembly é uma linguagem considerada de 
baixo nível, como o Assembly, e possui formato compacto, cuja execução 
da performance fica bem próxima da linguagem nativa.
VOCÊ SABIA?
Com a entrada da linguagem WebAssembly nos 
navegadores, recursos como a máquina virtual irá carregar 
e também executar ambos os códigos, tanto o JavaScript 
quanto o WebAssembly.
REFLITA:
Várias empresas, como Mozilla, Google, Microsoft, entre 
outras, estão por trás desse projeto e estão muito engajadas 
com um objetivo comum, que é tornar a navegação web 
mais eficiente e rápida.
Agora veremos como utilizar o WebAssembly em aplicação. Ou 
seja, assim como o conhecido arquivo .js, agora teremos arquivos do 
tipo .wasm e chamadas web. Os arquivos feitos em Assembly possuem 
extensão .asm, por esse motivo o Webassembly utiliza a extensão .wasm 
(web asm).
Linguagem de Montagem
27
Figura 6 – Comportamento do WebAssembly em relação a outras linguagens
Código JavaScript
Código 
WebAssembly
ByteCode
Código de 
Máquina
Fonte: Elaborada pela autora (2022).
A linguagem WebAssembly já está implementada nos principais 
navegadores e deve ser bem-sucedida onde tentativas anteriores 
(como Adobe Flash e Google Portable Native Client) falharam? Existem 
três razões: é um esforço conjunto, em que nenhuma empresa faz esse 
processo sozinha. Empresas responsáveis por programas como Mozilla, 
Chrome, Edge, entre outras, estão envolvidas no projeto.
E devemos também levar em consideração que a interoperabilidade 
com a plataforma web e JavaScript é muito boa. Utilizar o código 
WebAssembly junto com o JavaScript é um processo tão simples quanto 
importar um módulo.
IMPORTANTE:
O Webassembly não surgiu com o propósito de substituir 
o JavaScript e sim, de colocar novos recursos trabalhando 
junto com o JavaScript.
Na tabela a seguir, temos um exemplo de código em linguagem de 
montagem e o mesmo código em linguagem e máquina. Como podemos 
observar, é uma proporção de um para um, ou seja, para cada linguagem 
de montagem temos uma linguagem de máquina.
Linguagem de Montagem
28
Tabela 1 – Código Assembly e código de máquina em relação a outras linguagens
LINGUAGEM ASSEMBLY CÓDIGO DE MÁQUINA 
add $t1,t2,$t3 04cb: 0000 0100 1100 1011
addi $t2,$t3,60 16bc: 0001 110 1011 1100
and $t3, $t1, $t2 0299: 0000 0010 1001 1001
andi $t3,$t1,5 22c5: 0010 0010 1100 0101
beq $t1,$t2,4 3444: 011 0100 0100 0100
Fonte: Elaborada pela autora com base no programa X (2022).
Ao estudar a linguagem de baixo nível Assembly, é necessário 
compreender como os computadores funcionam, ou seja, como trabalha 
a memória e como está organizada, como trabalham os registros que a 
máquina possui, como as instruções estão disponíveis, e vários outros 
detalhes. A linguagem de programação Assembly, além de ser uma 
linguagem de montagem, também é considerada uma linguagem pura.
RESUMINDO:
E então? Gostou do que lhe mostramos? Aprendeu mesmo 
tudinho? Agora, só para termos certeza de que você realmente 
entendeu o tema de estudo deste capítulo,vamos resumir 
tudo o que vimos. Você deve ter aprendido que a linguagem 
de montagem é bastante usada quando é requisitada análise 
em documentos ou arquivos. Por meio da análise em arquivos, 
principalmente os executáveis que não têm o código-fonte para 
serem analisados, conseguimos identificar o que realmente o 
arquivo irá executar na máquina e como ele vai se comportar 
em relação ao sistema operacional. A linguagem de máquina 
consegue identificar os procedimentos que serão executados 
pelo programa antes de ser executado. Esse recurso é 
conhecido como engenharia reversa, ou disassembler. Com 
ele, obtemos todos os procedimentos que serão executados 
na máquina. Conhecer a linguagem de montagem facilita 
a identificação e a análise dos procedimentos, bem como 
reprogramar, quando necessário.
Linguagem de Montagem
29
Representação dos dados em Assembly
OBJETIVO:
Ao término deste capítulo, você será capaz de identificar os 
dados em linguagem de baixo nível, linguagem montadora 
ou linguagem de montagem. Isso será fundamental para 
o exercício de sua profissão. As pessoas que tentaram 
diferenciar a representação de linguagem de baixo nível 
da linguagem de alto nível sem a devida instrução tiveram 
problemas na execução, identificação e compilação 
do código, por não saberem o que realmente estava 
acontecendo ao executá-lo. E então? Motivado para 
desenvolver essa competência? Então, vamos lá. Avante!
Pseudoinstruções da linguagem de 
montagem 
As linguagens de montagens ou o assembler usa recursos chamados 
mnemônicos, ou seja, comandos curtos, por exemplo, ADD, SUB e MUL, 
que são instruções de máquina, como somar, subtrair e multiplicar, que 
ficam mais fáceis de memorizar. 
Figura 7 – Executando comandos em linguagem de montagem
Fonte: Pixabay
Linguagem de Montagem
30
IMPORTANTE:
A linguagem de montagem assembler permite a utilização 
de pequenos símbolos que podem ser usados em 
constantes e rótulos com o objetivo de indicar endereços 
de instrução de memória. 
Grande parte dos assemblers suporta certo número de 
pseudoinstruções. Quando temos um programa em linguagem de 
montagem que tem um assembler que envia os dados, esses dados são 
convertidos em um programa binário de acordo com a execução. A partir 
desse momento, ele pode ser executado no hardware propriamente dito.
Os simuladores são utilizados para facilitar a inicialização de novos 
programadores, quando é executado o programa binário em um simulador 
em vez do hardware. O simulador executa uma instrução de cada vez e 
apresenta detalhes em forma de imagem do que está sendo feito. 
VOCÊ SABIA?
Programas que são executados por simulador costumam 
ser mais lentos, porém, se o objetivo é aprender o programa 
em linguagem de montagem, a velocidade não é o foco. 
A seguir, usaremos um programa para detalhar um executável e 
mostrar em linguagem de montagem. O Programa IDA, conhecido como 
Disassembler, converte qualquer formato executável para linguagem de 
montagem, com o objetivo de detalhar o funcionamento do programa e 
saber detalhadamente os procedimentos e etapas que são executados 
pelo programa.
Quando temos acesso ao código-fonte do programa, podemos 
saber e analisar as etapas de funcionamento do aplicativo. Entretanto, 
nem sempre temos acesso ao código-fonte, e sim somente ao programa 
de instalação, e não sabemos exatamente o que o programa irá fazer com 
o hardware. É quando entra o programa para fazer a “engenharia reversa” 
do programa, buscando analisar todas as etapas de funcionamento.
Linguagem de Montagem
31
DEFINIÇÃO:
O IDA é um programa que consegue fazer a engenharia 
reversa. Usamos a versão free, mas o programa possui 
a versão paga, que traz muitos detalhes e informações 
importantes sobre a análise feita sobre o executável.
No exemplo adiante, usamos o arquivo notepad.exe, que é o arquivo 
bloco de notas do Windows, para ser analisado. Por ser um arquivo de 
sistema, copiamos o arquivo executável para a pasta documento para 
o IDA poder analisar. Na figura seguinte, temos algumas informações 
importantes sobre o programa que utilizamos para a “engenharia reversa”.
Figura 8 – Tela com informações do programa IDA
Fonte: Elaborada pela autora com base no programa IDA (2022).
Na próxima figura, temos a tela de execução do IDA para o arquivo 
notepad.exe.
Linguagem de Montagem
32
Figura 9 – Interface da IDA ao executar a engenharia reversa no notepad.exe 
Fonte: Elaborada pela autora com base no programa IDA (2022).
Na figura que se segue, podemos ver os dados com mais detalhes.
Figura 10 – Interface detalhada da IDA ao executar a engenharia reversa no notepad.exe 
Fonte: Elaborada pela autora com base no programa IDA (2022).
Linguagem de Montagem
33
O programa possui várias janelas com informações detalhadas 
referentes ao arquivo analisado. Na figura que se segue, podemos 
visualizar uma dessas janelas exibindo a linguagem de montagem do 
programa, em código Assembly.
A seguir, temos um pedaço do código Assembly detectado pelo 
programa. Na figura subsequente, podemos visualizar detalhadamente 
parte do código do notepad.exe em linguagem de máquina e organizado 
pelo software IDA.
Figura 11 – Interface do resultado para análise da engenharia reversa da IDA no arquivo 
notepad.exe 
Fonte: Elaborada pela autora com base no programa IDA (2022).
Logo a seguir, podemos visualizar o código inteiro.
push ebp
mov ebp, esp
add esp, 0FFFFFFA4h
push ebx
push esi
push edi
xor eax, eax
Linguagem de Montagem
34
mov [ebp+var_3C], eax
mov [ebp+var_40], eax
mov [ebp+var_5C], eax
mov [ebp+var_30], eax
mov [ebp+var_38], eax
mov [ebp+var_34], eax
mov [ebp+var_2C], eax
mov [ebp+var_28], eax
mov [ebp+var_14], eax
mov eax, offset dword_410034
call sub_4065D4
xor eax, eax
push ebp
push offset loc_411A9E
push dword ptr fs:[eax]
mov fs:[eax], esp
xor edx, edx
push ebp
push offset loc_411A5A
push dword ptr fs:[edx]
mov fs:[edx], esp
mov eax, ds:hModule
call sub_40EC30
call sub_40E784
cmp byte_412ADC, 0
jz short loc_41142C
Linguagem de Montagem
35
No site da CISA.gov, é apresentado parte de um código de uma 
engenharia reversa feito pela Agência de Cibersegurança, Infraestrutura 
e Segurança do Governo dos EUA, no software IDA, para fazer a análise 
de um arquivo malware classificado como “MAR-10292089-1.v2 – Chinese 
Remote Access Trojan: TAIDOOR”. 
Figura 12 – Interface do CISA.gov
Fonte: Cisa.Gov (2020, on-line).
No site anterior, podemos encontrar imagens e uma parte da análise 
do arquivo malware analisado em linguagem de montagem.
ACESSE:
Junto com as imagens, o site da Cisa.Gov traz um relatório 
completo sobre a análise de segurança realizada sobre o 
arquivo, que só conseguiu ser feita por conta da engenharia 
reversa e do resultado em linguagem de montagem gerada 
pelo programa. Acesse clicando aqui.
Na figura subsequente, podemos ver exemplos de comandos em 
linguagem de montagem e o modo de operação de cada comando. Os 
modos de operação apresentados são:
– Endereçamento de registrador.
– Endereçamento de segmento de dados.
– Endereçamento de segmento de pilha.
Linguagem de Montagem
https://www.cisa.gov/uscert/ncas/analysis-reports/ar20-216a
https://www.cisa.gov/uscert/ncas/analysis-reports/ar20-216a
36
– Dados imediatos.
– Endereço implícito.
Tabela 2 – Modos de endereçamento de operandos
Modo Operando Exemplos 
Endereçamento de 
registrador Registrador 
de bytes Registrador 
de palavras
Registrador de bytes 
Registrador de palavras
AH, AL, BH, BL, CH, CL, 
DH, DL AX, BX, CX, DX, 
SP, BP, SI, DI
Endereçamento de 
segmentos de dados 
Endereço direto 
Indireto de registrador 
Deslocamento de 
registrador 
Registrador com índice 
Registrador com índice 
e deslocamento
Endereço vem após 
opcode 
Endereço em 
registrador 
Endereço em 
registrador+ desloc. 
Endereço é BX + SI/DI 
BX + SI DI + 
deslocamento
 (#) 
(SI), (DI), (BX) 
#(SI), #(DI), #(BX) 
(BX)(SI), (BX)(DI) 
#(BX)(SI), #(BX)(DI)
Endereço de 
segmento de pilha 
Indireto de ponteiro de 
base 
Deslocamento de 
ponteiro de base 
Ponteiro de base com 
índice 
Desloc. de índice de 
ponteiro de base
Endereço em 
registrador Endereço 
é BP + deslocamento 
Endereço é BP + 
SI/DI BP + SI/DI + 
deslocamento
(BP) 
#(BP) 
(BP)(SI), (BP)(DI) 
#(BP)(SI), #(BP)(DI)
Dados imediatos 
Byte/palavra imediato
Dados são parte da 
instrução
#
Endereço implícito
Instrução push/pop 
Flags de load/store 
Traduzir XLAT
Instruções de cadeias 
repetidas
Instruções de E/S 
Converte byte, palavra
Endereço indireto (SP)
Registrador de flag de 
status 
AL, BX 
(SI), (DI), (CX) 
AX, AL 
AL, AX, DX
PUSH, POP, PUSHF, 
POPF 
LAHF, STC, CLC, CMC 
XLAT 
MOVS, CMPS, SCAS 
IN #, OUT # 
CBW, CWD
* O símbolo # indica um valor numérico ou rótulo
Fonte: Tanenbaum e Austin (2013, p. 550).
Linguagem de Montagem
37
A seguir, temos um exemplo de código em linguagem de baixo 
nível de montagem para montador TASM. O TASM é uma linguagem de 
baixo nível para processadores.
MODEL SMALL ;modelo de memória
.STACK ;espaço de memória para instruções do programa na pilha
.CODE ;as linhas seguintes são instruções do programa
 mov ah,01h ;move o valor 01h para o registrador ah
 mov cx,07h ;move o valor 07h para o registrador cx
 int 10h ;interrupção 10h
 mov ah,4ch ;move o valor 4ch para o registrador ah
 int 21h ;interrupção 21h
.DATA
 x db 1
END ;finaliza o código do programa
A seguir estão alguns registradores em linguagem Assembly:
– AX: é o registrador acumulador, responsável por operações 
aritméticas. O registrador AX coleta os resultados de operações 
computadas.
– BX: é o registrador-base, usado para indexar tabelas de memória. 
Embora tenha muitas finalidades, o registrador BX pode ser usado da 
mesma maneira que o registrador AX, mas o registrador BX executa uma 
função que o registrador AX não executa. Podemos inserir um endereço 
de memória no registrador BX e executar a instrução, ou seja, o registrador 
BX pode conter um ponteiro para a memória, mas o registrador AX não 
possui.
– CX: é o registrador contador, usado para contar as repetições de 
loop e movimentos repetitivos de dados. É usado especialmente para 
contar os laços, em que é decrementado em cada instrução LOOP, e os 
laços de repetição são finalizados quando CX zera, ou seja, chega a zero.
Linguagem de Montagem
38
– DX: é o registro de dados e para uso geral, é usado junto com o 
registrador AX.
Figura 13 – Os registradores AX, BX, CX e DX e suas divisões internas high e low
AX AH AL
BX BH BL
CX CH CL
DX DH DL
Fonte: Elaborada pela autora (2022).
VOCÊ SABIA?
Os registradores podem ser altos (H - high) ou baixos (L - 
low), ou seja, os registradores AX, BX, CX e DX podem ter 
byte alto (AH) ou byte baixo (AL). O mesmo vale para os 
demais registradores.
Para identificar o conceito de registradores, vamos comprar um 
código em linguagem de alto nível escrito em C e um código Assembly:
Código em linguagem de alto nível C:
unsigned int x = 5;
unsigned int y = 10;
unsigned int soma, sub;
main()
{
 x = x + 8;
 soma = x + y;
 x = x - 3 ;
 sub = x - y
}
Linguagem de Montagem
39
Agora veremos o mesmo código, mas escrito em linguagem de 
baixo nível e de montagem, a linguagem Assembly.
add x,8 ;x=x+8
mov DX,x ;DX=x
add DX,y ;DX=DX+y=x+y
mov soma,Dx ;soma=DX=x+y
sub x,3 ;x=x-3
mov DX,x ;DX=x
sub DX,y ;DX=DX-y=x-y
mov sub,DX ;sub=DX=x-y
A seguir, temos uma tabela com alguns comandos em linguagem 
e montagem.
Tabela 3 – Alguns comandos mais usados em linguagem de montagem
Mnemônico Descrição
MOV (B)
XCHG (B)
LEA
PUSH
POP
PUSHF
POPF
XLAT
Mover palavra byte
Trocar palavra
Carregar endereço efetivo
Passar para pilha 
Retirar da pilha
Passar flags para pilha
Retirar flags da pilha
Traduzir AL
ADD (B)
ADC(B)
SUB(B)
SBB(B)
Somar palavra
Somar palavra com vai-um
Subtrair palavra
Subtrair palavra com empréstimo
IMUL(B)
MUL(B)
IDIV(B)
DIV(B)
Multiplicar com sinal
Multiplicar sem sinal
Dividir com sinal
Dividir sem sinal
CBW
CWD
NEG(B)
NOT(B)
INC(B)
DEC(B)
Estender byte/palavra com sinal
Estender palavra/dupla com sinal
Negar binário
Complemento lógico
Incrementar destino
Decrementar destino
AND(B)
OR(B)
XOR(B)
AND lógico
OR lógico
EXCLUSIVE OR lógico
Linguagem de Montagem
40
Mnemônico Descrição
MOV (B)
XCHG (B)
LEA
PUSH
POP
PUSHF
POPF
XLAT
Mover palavra byte
Trocar palavra
Carregar endereço efetivo
Passar para pilha 
Retirar da pilha
Passar flags para pilha
Retirar flags da pilha
Traduzir AL
ADD (B)
ADC(B)
SUB(B)
SBB(B)
Somar palavra
Somar palavra com vai-um
Subtrair palavra
Subtrair palavra com empréstimo
IMUL(B)
MUL(B)
IDIV(B)
DIV(B)
Multiplicar com sinal
Multiplicar sem sinal
Dividir com sinal
Dividir sem sinal
CBW
CWD
NEG(B)
NOT(B)
INC(B)
DEC(B)
Estender byte/palavra com sinal
Estender palavra/dupla com sinal
Negar binário
Complemento lógico
Incrementar destino
Decrementar destino
AND(B)
OR(B)
XOR(B)
AND lógico
OR lógico
EXCLUSIVE OR lógico
Fonte: Tanenbaum e Austin (2013, p. 554).
RESUMINDO:
E então? Gostou do que lhe mostramos? Aprendeu mesmo 
tudinho? Agora, só para termos certeza de que você 
realmente entendeu o tema de estudo deste capítulo, 
vamos resumir tudo o que vimos. Você deve ter aprendido 
que a linguagem de montagem é bastante usada quando 
é requisitada a análise em documentos ou arquivos. A 
linguagem de montagem utiliza códigos mnemônicos, 
ou comandos curtos de acesso direto aos recursos da 
máquina. A nomenclatura do código utilizado para gerar 
o código de montagem é uma nomenclatura fácil de 
programar, facilitando a vida do programador, que antes 
utilizava linguagem de máquina para gerar um código de 
baixo nível. Por meio da linha de código em linguagem de 
montagem, conseguimos acessar os recursos de máquina. 
Para cada linha de comando gerada em linguagem de 
montagem, é gerado um código de máquina. A linguagem 
de montagem não exige compilador, pois o código gerado 
já é identificado pela máquina. O papel do compilador é 
transformar a linguagem de alto nível em uma linguagem 
de baixo nível.
Linguagem de Montagem
41
Execução do primeiro programa em 
Assembly
OBJETIVO:
Ao término deste capítulo, você será capaz criar um 
código simples em linguagem de montagem. Isso será 
fundamental para o exercício de sua profissão. As pessoas 
que tentaram criar um código em linguagem de montagem 
sem a devida instrução tiveram problemas na execução e 
compilação do código, por não saberem o que realmente 
estava acontecendo ao executá-lo. E então? Motivado para 
desenvolver essa competência? Então, vamos lá. Avante!
Usando o debug do Windows 
Podemos executar a linguagem de montagem de várias formas, 
dependendo do tipo de processador. Uma das formas é instalar uma 
máquina virtual no computador e instalar uma das versões anteriores do 
sistema operacional Windows XP ou Windows 2000.
ACESSE:
Para instalar uma máquina virtual, podemos usar o 
programa da empresa Oracle, o software VM VirtualBox, 
que pode ser baixado gratuitamente. Acesse clicando aqui. 
Após baixar o programa, podemos instalar o sistema operacional 
Windows XP ou 2000 para explorarmos a programação em linguagem de 
baixo nível.
VOCÊ SABIA?
As versões anteriores do Windows vinham com o recurso 
chamado debug.exe.
Linguagem de Montagem
https://www.oracle.com/br/virtualization/virtualbox.
42
Esse recurso permitia ao sistema operacional gerar códigos em 
linguagem de baixo nível. Nos sistemas atuais, esse recurso não está 
mais disponível, mas temos várias formas de implementar a linguagemde baixo nível. Iremos falar um pouco sobre a linguagem implementada 
usando os próprios recursos do Windows, o debug.exe.
Para o primeiro exemplo, iremos usar um recurso de emulador que 
será executado de uma máquina virtual. Para não ter a necessidade de 
instalar programas nesse primeiro momento, para executar um simples 
código de demonstração, iremos utilizar um emulador disponível no 
site bellard.org/jslinux, que executa um sistema operacional no próprio 
navegador. Na figura adiante, temos a imagem da tela do site.
Figura 14 – Parte da interface do site para acesso ao Windows 2000
Fonte: Elaborada pela autora (2022).
Na figura anterior, clicamos na opção Windows 2000, que estará 
rodando em um processador de 32 bits e em uma arquitetura x86. 
As versões anteriores do Windows vinham com o recurso chamado 
debug.exe. Esse recurso fica no diretório c:\Windows e, apesar de não 
ser essencial para o Windows, é uma forma de gerar um código em 
linguagem de baixo nível sem a necessidade de ter programas auxiliares. 
As versões recentes do sistema operacional Windows não possuem mais 
o recurso debug.
Iremos executar o recurso debug.exe do Windows 2000 e, 
posteriormente, utilizar outro programa com mais recursos gráficos 
para facilitar a execução dos códigos. Com o aprimoramento do sistema 
operacional Windows, alguns recursos foram excluídos, e um deles foi 
o debug.exe. O acesso facilitado à linguagem pura do computador (em 
formato de baixo nível) foi ficando cada vez mais distante do usuário final. 
VOCÊ SABIA?
Sistemas operacionais mais recentes, como Windows 10 e 
Windows 11, não possuem mais o recurso debug.exe.
Linguagem de Montagem
43
Por esse motivo, acessamos o emulador com o sistema Windows 
2000, que tem o recurso. Ao iniciar o site bellard.org/jslinux/ e clicar no 
link referente ao sistema x86 Windows 2000 com opção gráfica, podemos 
ver a janela do Windows 2000 no emulador. Usaremos aqui o programa 
DEBUG.
Na opção abaixo, clicamos na opção de “Comando Prompt” que está 
disponível em Programas > Acessórios. Ao clicar no programa “Comando 
Prompt”, abrirá uma janela como da figura subsequente.
Figura 15 – Interface do prompt do DOS, acessado pelo comando cmd
Fonte: Elaborada pela autora (2022).
Com a janela do DOS aberta, podemos iniciar a programação em 
linguagem de montagem. Para isso, usaremos o recurso debug.exe, que 
pode ser acessado pelo prompt do DOS.
Na figura apresentada, inserimos o comando debug. Em seguida 
escrevemos o comando “a”. Ao escrever o comando “a”, o debug já acionou 
o endereço de memória 0100 para inserção de código. Após executar o 
arquivo debug, o sistema operacional fica esperando por instruções. 
Vamos analisar o código que inserimos no formato a seguir:
a
mov ah,9
mov dx,109
Linguagem de Montagem
44
int 21
int 20
db “ Olá Galera ! Feito em Assembly! $”
Ao finalizar o código, a linguagem de montagem vai informando o 
endereço em que o código será executado. O primeiro código inserido 
foi “mov ah,9”, em que movemos o 9 para a parte alta do registrador AX.
Depois inserimos o comando “mov dx,109”, para mover o ponteiro 
de memória para o endereço 109. Depois inserimos o comando “int 21”, 
que executa uma interrupção e executa a operação que está em AH, ou 
seja, a instrução 9 (o valor 9 em AH informa ao sistema que tem uma frase 
para ser impressa no momento que o INT 21 for chamado) que é a exibição 
de texto, mas poderia ser outro tipo de processamento (PROGRAMAR..., 
2015). O comando “int 20” finaliza o código. Os comandos seguintes são 
para salvar o arquivo e visualizar o conteúdo da memória. 
Para conseguirmos executar nosso código enquanto escrevemos, 
basta inserir G=100, que é o endereço. Quando digitamos “-a “, a letra ( a ), 
digitada dentro do DEBUG.exe, informa para o sistema acessar a próxima 
memória que está disponível. No nosso exemplo foi 100h, pois os sistemas 
operacionais eram configurados para que programas .com começassem 
no endereço 100h. Então, o sistema operacional já assume o endereço 
100h como padrão para o sistema.
Após a última linha, que contém a mensagem principal, podemos 
observar que os dois últimos algarismos são “29”. Cada acesso irá gerar 
um código diferente. Após executar o comando -rcx, devemos informar os 
2 últimos algarismos referentes ao endereço de memória da última linha, 
que foi informado pelo sistema: 29.
Logo em seguida, escrevemos o código -n para criar um novo 
arquivo com a nomenclatura “giselle.com”. Depois, o comando -w para 
escrever no arquivo e depois comando -q para sair. Pronto! Arquivo gerado 
com sucesso. Basta executar o arquivo de extensão .com, como podemos 
ver na figura subsequente.
Linguagem de Montagem
45
Executando o comando “dir”, visualiza-se o arquivo no diretório. 
O arquivo gerado foi “GISELLE.COM”. O tamanho do arquivo é de 
simplesmente 41 bytes. Quando visualizado no Gerenciador de arquivo, o 
Windows interpretou como 1 Kilobyte, ou seja, 1.024 bytes.
O arquivo gerado é tão pequeno que o sistema operacional 
Windows 2000 não consegue interpretar o tamanho exato do arquivo. 
Ao abrir o Windows Explorer, podemos identificar o tamanho do arquivo 
pelo Gerenciador de Arquivos do Windows 2000, e o tamanho de 1 KB do 
arquivo GISELLE.com.
Na figura que se segue, podemos ter uma visão macro da janela 
do Gerenciador de Arquivos do Windows 2000, o Windows Explorer. 
Podemos visualizar as duas janelas para exibir o mesmo arquivo: uma 
janela em ambiente gráfico e outra em ambiente não gráfico do MS-DOS. 
Podemos visualizar as propriedades do arquivo em ambiente gráfico 
do Windows. Clicamos com o botão direito do mouse sobre o arquivo e 
escolhemos a opção “Properties” (propriedade). 
Vamos para outro código agora. Iremos fazer a leitura do teclado 
para dar continuidade. Agora iremos utilizar uma interrupção diferente 
de 21h. Vamos inserir a interrupção que lê o teclado, que é a interrupção 
16h, e vamos inserir também o valor 0 em AH. Em vez de simplesmente 
imprimir na tela uma mensagem, iremos ler uma tecla no teclado. 
Para iniciar, iremos atribuir os valores 9 para ah, 114 para dx e o “int 
21” para exibir uma mensagem. Logo em seguida, iremos atribuir 0 para 
AH e “INT 16”, que não exibirá nada, ficará aguardando que uma tecla seja 
pressionada.
Após qualquer tecla ser pressionada, vamos exibir uma frase.
O código inserido pode ser visto a seguir:
mov ah,9
mov dx,114
int 21
mov ah,0
Linguagem de Montagem
46
int 16
mov ah,9
mov dx, 114
int 21
int 20
db “ Olá Galera! Aqui novamente! $”
Na figura subsequente, está a imagem do código em execução.
Figura 16 – Executando Assembly no DOS
Fonte: Elaborada pela autora (2022).
Na próxima figura, podemos observar como a interface do Windows 
não consegue identificar um arquivo pequeno.
IMPORTANTE:
O arquivo gerado tem somente 49 bytes. Porém, a interface 
do Windows tem dificuldade em identificar um arquivo “tão” 
pequeno. 
O tamanho que o sistema operacional identificou foi de 1 kilobyte 
(1Kb) equivalente a 1.024 bytes, quase 25 vezes maior em relação ao 
tamanho original.
Linguagem de Montagem
47
Figura 17 – Executando Assembly no DOS e visualizando o arquivo em Windows
Fonte: Elaborada pela autora (2022).
No programa debug, podemos executar o comando “-?” para 
visualizar o recurso de ajuda do comando.
A janela exibirá alguns comandos começando pelo “a” que é assembler.
No recurso, podemos identificar que o comando “A” executa a 
linguagem de montagem Assembly, por isso digitamos “a” nos dois 
códigos inseridos.
RESUMINDO:
E então? Gostou do que lhe mostramos? Aprendeu mesmo 
tudinho? Agora, só para termos certeza de que você 
realmente entendeu o tema de estudo deste capítulo, vamos 
resumir tudo o que vimos. Você deve ter aprendido que a 
linguagem de montagem é muito importante para a área de 
tecnologia. Para programar em linguagem de montagem, 
podemos usar o recurso debugdo próprio Windows, que não 
está mais presente nas novas versões do sistema operacional. 
Comandos para acesso rápido à memória para armazenar 
informações podem ser executados em linguagem Assembly. 
Por meio da linguagem Assembly, conseguimos gerar código 
executável direto na máquina. O comando INT 21 indica que o 
código Assembly terminou, e comandos como MOV acessam 
diretamente a memória da máquina. Outros comandos, como 
o “int 16”, são capazes de ler o teclado. 
Linguagem de Montagem
48
REFERÊNCIAS
CISA.GOV. Malware Analysis Report (AR20-216A), 2020. Disponível 
em: https://www.cisa.gov/uscert/ncas/analysis-reports/ar20-216a. 
Acesso em: 07 abr. 2022.
NISAN, N.; SHOCKEN, S. The Elements of Computing Systems: 
Building a Modern Computer from First Principles. [s.l.]: MIT Press, 2021. 
PANNAIN, R.; BEHRENS, F.H.; PIVA JR, D. Organização Básica de 
Computadores e Linguagem de Montagem. São Paulo: Elsevier, 2012.
PROGRAMAR DIRETO NA MEMÓRIA. Linguagem Assembly, 2015. 
Disponível em: https://www.linguagemassembly.com.br/praticando/
programar-diretamente-na-memoria. Acesso em: 07 abr. 2022. 
STALLINGS, WILLIAM. Arquitetura e organização de 
computadores. 8. ed. São Paulo: Pearson, 2002. Disponível em: http://
www.telecom.uff.br/orgarqcomp/arq/arquitetura-e-organizacao-
computadores-8a.pdf. Acesso em: 07 abr. 2022.
TANENBAUM, A.; AUSTIN, T. Organização estruturada de 
computadores. 6. ed. São Paulo: Pearson, 2013.
Linguagem de Montagem
https://www.cisa.gov/uscert/ncas/analysis-reports/ar20-216a
http://www.telecom.uff.br/orgarqcomp/arq/arquitetura-e-organizacao-computadores-8a.pdf
http://www.telecom.uff.br/orgarqcomp/arq/arquitetura-e-organizacao-computadores-8a.pdf
http://www.telecom.uff.br/orgarqcomp/arq/arquitetura-e-organizacao-computadores-8a.pdf

Mais conteúdos dessa disciplina