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