Bora codar em assembly É isso mesmo eu tô fazendo um vídeo em 2024 codando em assembly e eu já vi muita gente falar que assembly é coisa do passado que hoje em dia ninguém usa isso para mais nada e que não faz nem sentido estudar assembly mais mas cara eu queria dizer que se você pensa assim Eu discordo Você sabe quem usa assembly todo mundo qualquer pessoa do mundo que tem algum aparelho com o processador usa assembly Simples assim assembly é a linguagem do processador tudo bem assemble É a versão humana da linguagem na verdade
é instrução de máquina Mas é a mesma coisa e muita gente acha que assembly é uma linguagem de programação tipo sei lá JavaScript por exemplo não é cada processador cada arquitetura tem a própria linguagem de assembly e todas elas são chamadas assembly o seu JavaScript o seu Python o seu go seu PHP o seu C qualquer linguagem de programação qualquer coisa que você faça no seu computador está funcionando em assembly qualquer coisa que tenha um processador precisa de assembly para rodar simples assim então quem usa assembly em 2024 todo mundo qualquer eletrônico com processador usa
assembly e o que me inspirou a fazer Esse vídeo foi esse vídeo aqui aqui do sodin ele literalmente criou um app todo totalmente em assembly sem usar nenhuma outra linguagem nem JavaScript nada claro que nesse vídeo A gente não vai quar algo tão complexo assim mas eu quero primeiro entender o que que é assembly e depois escrever algumas funções básicas como por exemplo hello world e um loop E por que eu acho que assembly é tão importante de ser estudado é claro que você não precisa virar um guru em assembly que sabe todas as instruções
de cabeça mas é muito importante você entender como é que o hardware funciona por debaixo dos panos porque isso vai te dar uma visão de como escrever códigos mais otimizados e mais performáticos na sua linguagem de programação antes da gente começar a escrever de fato assembly tem algumas coisas que a gente precisa saber eu fiz esse super desenho aqui para demonstrar um pouco de como é que o CPU funciona por debaixo dos panos a gente tem o CPU certo o processador em si e lá no CPU a gente tem espaços de memória que são chamados
de registradores e cada um desses registradores tem um nome específico RX rbx rcx rsi rdi entre outros quando você vê um registrador com esse prefixo aqui R essa letra R isso quer dizer que ele é um registrador 64 bits e a letra R significa register mesmo e aí cada uma dessas letras aqui significa alguma coisa normalmente uma abreviação então por exemplo AX é de acumulator cx é de Counter então normalmente o cx era usado para fazer loop atualmente isso não é muito mais levado em consideração basicamente a maioria dos registradores hoje em dia são de
uso livre ainda tem alguns são de uso especial como o rsp e o rbp que é base Pointer e stack Pointer Mas no geral os registradores hoje em dia são de uso livre e aí depois a gente tem os registradores que começam com a letra e e significa extended ou seja são os registradores de 32 bits e por último a gente tem os registradores sem nenhum prefixo que são registradores de 16 bits e é importante saber que você pode fazer várias instruções em cima desses registradores você pode mover informação de um registrador pro outro você
pode salvar o valor de uma variável em um registrador você pode fazer operações binárias um com o outro você pode somar incrementar dividir E é assim que o seu código vai sendo construído bom mas chega de falar e vamos começar a escrever código em assembly a primeira coisa é que você precisa ter um assembler e um linker no seu computador e também um compilador se por acaso você tiver vem Linux é muito fácil só você fazer sudo APT Install gcc e uma coisa muito importante cada processador tem a sua própria linguagem de assembly eu aqui
tô no processador Intel x86 de 64 bits Então se o seu processador não for dessa arquitetura você não vai poder usar as mesmas instruções que eu Muito provavelmente tá mas agora que a gente tem o nosso gcc instalado vamos começar a escrever o nosso código eu primeiro Criei um arquivo asm PS mas a extensão não faz muita diferença pon s é só uma convenção e é aqui que a gente vai começar a escrever o nosso código assembly só que no nosso caso Nós não somos processadores Então a gente vai precisar usar uma versão humana da
linguagem e aí que entra o nosso assembler ele vai traduzir essa nossa versão humana da linguagem de assemble para de fato a linguagem de instrução de máquina que o computador entende e para fazer isso é muito fácil a gente vai rodar Esse comando aqui as que é o nosso assembler asm p s que é o nosso arquivo de input traço o dizendo que essa aqui vai ser a nossa saída e por convenção os arquivos de instrução de máquinas tem o sufixo ponto o então tô colocando asmo se eu rodar isso aqui vocês vão ver que
não tem erro nenhum basicamente o nosso código foi compilado mesmo mesmo sendo um arquivo vazio e a gente pode Inclusive abrir esse arquivo compilado e a gente vai ver que Tem lá bastante coisa escrita por mais que o nosso arquivo original estivesse vazio mas enfim isso aqui é só para você entender o que que essa ferramenta faz só que vamos de fato começar a escrever o nosso código como qualquer código a gente precisa de um entry Point se você já falando da linguagem C ou de GO por exemplo ou Java enfim essas linguagens elas TM
uma função Main e é essa função que é o entry Point do seu código é ali que começa a execução e eu sei que só em C realmente que a função M que é o entry Point porque em go Java tem muita coisa que roda antes a função m o Gab collector enfim Tô só simplificando aqui tá gente a a gente precisa fazer a mesma coisa aqui em assembly e para declarar isso a gente usa duas keywords especiais primeiro ponto global e a gente vai colocar o underline start pensa que esse underline start é como
se fosse a função m do seu código C E aí aqui a gente declara a nossa função M se a gente rodar o nosso assembl de novo não deu nenhum erro e agora vamos transformar de fato esse nosso arquivo de instrução de máquina em um executável para fazer isso a gente vai usar o gcc e o comando vai ficar assim gcc traço o ou seja de novo eu tô usando traço o para definir qual que vai ser a saída desse programa asm então no caso eu vou criar um arquivo chamado asm se fosse Windows seria
asm PES por exemplo E aí eu vou estipular Qual que é o nosso input nosso input vai ser o smo que o nosso assembl criou E se eu rodar Esse comando a gente tem um erro e qual que é o erro erros de assembly não são muito legíveis tá gente mas o que que tá dizendo aqui múltiplas definições de start basicamente o gcc Ele espera por padrão que você compile o seu código usando a biblioteca padrão de C A Standard de Lib só que no nosso caso a gente não vai usar Standard de Lib de
C Então a gente tem que dizer para ele não incluir essa biblioteca porque se ele tiver esperando o código C isso quer dizer que ele vai est esperando uma função Main definida no seu código C E lá que ele vai definir como entry Point então aqui a gente vai ter conflito Porque vão ter dois entry points no nosso executável para corrigir isso é relativamente simples basta a gente colocar Flag traço no standard de Lib no nosso compilador E aí ele vai compilar aquele arquivo sem usar stand de Lib de C se a gente rodar tá
lá não temos mais nenhum erro e agora a gente tem de fato um executável que a gente pode chamar se eu executar aqui olha só nossa primeira segmentation fult em assembly mano eu não sei vocês mas eu acho isso sensacional a gente tá falando diretamente com a máquina mas beleza vamos corrigir esse bug do segmentation fult fazer o nosso código rodar sem ter nenhum erro se a gente voltar lá pro código EMC como é que ele funciona normalmente a gente tem a nossa função Main e dentro dela basicamente a gente retorna um código um status
de erro então o que a gente quer fazer aqui no nosso assembly é a mesma coisa retornar um código para fazer isso a gente vai precisar começar a conversar com o sistema operacional chamando ciscs ou seja chamadas de sistema E para isso a gente vai precisar ter uma lista uma tabela Com todas essas chamadas e com manual dizendo como executá-las eu por acaso achei essa tabela aqui da própria Google e qual que é o siscol que a gente tá procurando é o Exit se a gente scrollar aqui um pouquinho a gente vai ver que lá
o número 60 ou seja o siscol de número 60 é o nosso Exit então é esse siscol que a gente tem que chamar e aqui nessa tabela ele vai dizer exatamente o que que tem que ser colocado em cada registrador para essa chamada de sistema funcionar certinho então por exemplo para chamar o Exit a gente vai ter que colocar um valor específico no registrador Rex arx e também um valor específico no rdi se a gente for lá de novo no no xit a gente vai ver aqui no RX a gente tem que colocar o valor
0 x3c isso aqui éem ex decimal em decimal ele seria 60 então basicamente aqui no arx a gente tem que dizer qual é o ID da siscal que a gente quer fazer e depois a gente tem que colocar o código de erro que a gente quer retornar Então vamos começar a fazer isso vamos aprender nossa primeira instrução em assembly chamada move de mover mesmo a primeira coisa que a gente tem que fazer é mover o valor 60 para dentro do registrador rax então para fazer isso a gente usa MOV e em assembly o primeiro argumento
é sempre o destino e os próximos são as origens então aqui no caso eu quero que o destino ou seja arex e o valor de entrada vai ser 0 x3c Lembrando que 0 x3c em ex decimal é 60 em decimal beleza e depois do nosso rdi o registrador rdi a gente tem que mover o status code que a gente quer retornar no caso Vou retornar zero mesmo e por último a gente faz uma cisc é uma instrução de máquina E aí vamos rodar o nosso assembler Opa tivemos um erro que que tá acontecendo aqui Too
Many Memory references for MOV então gente lembra o que eu falei no começo que a gente não tá de fato escrevendo assembly isso aqui é representação humana do código em assembly a gente precisa dizer isso pro nosso assembler e como é que a gente faz isso lá depois do nosso Global start a gente vai colocar aqui Intel syntax e isso é como se fosse uma Flag digamos assim dizendo pro nosso assembly ó esse código aqui tá usando a versão humana da linguagem não é instrução de máquina e aí se a gente rodar de novo o
nosso comando continuamos tendo erro mas agora o erro é diferente e o que o erro tá dizendo é que o tamanho o Size pra operação MOV a instrução moov é ambíguo ou seja ele não sabe qual que é o tamanho do registrador que tá ali por que isso porque ele tá esperando que a gente diga que Rex É de fato um registrador e para fazer isso a gente tem que colocar o sinal de por cento antes daquele nome e se a gente finalmente rodar de novo o nosso assembl funcionou não temos nenhum erro dessa vez
só que pô seria muito chato que ficar colocando essa porcentagem aqui toda hora que a gente quisesse mover algum valor para dentro do registrador né então uma forma da gente não precisar fazer isso é usando mais uma Flag lá em cima que no caso seria no prefix feito isso a gente já pode tirar aquele sinais de porcentagem ali e se rodar o assembler de novo tá lá não tivemos nenhum erro então depois a gente roda o nosso compilador por último a gente vai rodar o nosso executável e por último a gente vai usar aquele famoso
Eco para saber qual que foi o último um status code retornado naquele terminal no caso zero e só pra gente ter certeza que realmente funcionou vamos mudar esse zero para sei lá 11 por exemplo E aí de novo Vamos mudar todas as baterias do comando o assembl depois o compilador depois a gente roda executável e por último o eco E tá lá 11 gente estamos conversando diretamente com a nossa CPU Então vamos começar a fazer um pouco de Clean code Que tal primeiro eu vou colocar isso aqui numa função que a gente sabe que é
assim que a gente vai esitar o programa certo então eu posso tirar isso daqui e vou por exemplo chamar função de Exit E aí eu coloco aquele nosso código lular Só que no caso eu não quero retornar 11 eu quero retornar zero por exemplo E aí como é que eu faço para chamar essa função através do start a gente tem duas opções a gente pode usar a instrução Call ou Jump Qual que é a diferença das duas qual ela vai chamar aquela função e depois que aquela função retornar ela vai continuar executando e Jump basicamente
eu tô dizendo ó deu para mim agora o controle de fluxo tá todo para essa função não vem para cá depois vai para lá e continua rodando normal nesse nosso caso aqui não vai fazer diferença porque a gente vai sair do programa de qualquer jeito lá no Exit mas eu vou botar Jump só pela semântica mesmo então a gente vai fazer Jump pro Exit E aí de de novo vou rar todos aqueles comandos E tá lá o nosso código continua funcionando normalmente só que agora vamos fazer alguma coisa mais legal Vamos fazer um hello world
bom primeiro eu não vou construir uma string durante Run time porque seria uma dor de cabeça gigante fazer essem assembly então eu quero deixar essa string hello world salva já dentro do nosso binário e a gente pode só Direcionar para ela para fazer isso a gente cria uma section e essa section chamada data e aqui dentro eu vou declarar uma variável mesmo chamada Hello string por exemplo E aí eu tenho que dizer qual que é o tipo dessa variável no caso ela é uma string Ask terminada com o null Terminator igual Strings em C que
terminam com o zero né e depois o valor dela de fato que vai ser hello world e agora vamos criar mais uma função chamada print hello world e o que que a gente precisa fazer lá dentro de novo a gente vai ter que votar naquela tabelinha da Google dessa vez o que a gente quer fazer é chamar sisc WR nesse caso lá pro nosso RX a gente tem que colocar o valor um primeira coisa que a gente vai fazer aqui é no RX a gente vai passar o valor um depois o nosso rdi a gente
tem que dizer qual que é o file de scriptor que a gente quer mandar esse valor por padrão zero Standard em um a Standard de Alt e dois Standard de error Então a gente vai mandar pro um também então mais uma instrução a gente vai colocar lá no nosso wordi o 0x 01 também depois o nosso argumento um no nosso rsi a gente precisa colocar o ponteiro do começo da nossa string ou seja o endereço de memória daquela variável que a gente criou para fazer isso a gente vai usar outra instrução chamada Lea que significa
load effective address e a gente vai passar pro nosso rsi o endereço de memória da nossa variável que é Hello Store então basicamente Quando você vê instrução Leia e depois você tem o símbolo dentro desses colchetes isso aqui nada mais é do que um ponteiro basicamente estô Dizendo para ele sar no nosso registrador rsi o endereço de memória da nossa variável relow Store depois pro nosso segundo argumento no hardx a gente precisa dizer o tamanho dessa string no caso a gente vai botar hardcoded mesmo 13 Então vai ser move rdx 13 na verdade vamos colocar
uma New line no final vamos colocar aqui mais um caracter deixa eu colocar o new line e lá a gente vai mudar de vez de 13 vai ser 14 beleza e é isso agora os nossos argumentos já estão propriamente colocados a gente vai fazer o cisc e por último como é uma função a gente vai retornar dela e se a gente rar de novo todos aqueles nossos comandos a gente tem um erro e de novo os erros assembly não são muito legíveis mas basicamente Aqui tá dizendo que a gente não pode usar a sessão data
quando a gente tá quando um objeto Pie Basicamente aquilo tá dizendo que a gente não pode ter essa sessão aqui e p p e e significa position Independent executables e por padrão o gcc implementa isso porque é ele que permite que a gente use aslr que significa address Space layout randomization e basicamente é uma forma de prevenir ataques de memória que o que que isso faz é que as funções e as variáveis dentro do nosso binário sejam sempre em posições de memória diferentes Então se o hacker achar por acaso uma posição de memória vulnerável quando
você rodar aquele binário de novo ela não vai estar na mesma posição ele teria que procurar novamente aquela posição enfim a gente não precisa ficar entrando nos detalhes técnicos aqui mas basicamente a forma da gente resolver isso é a gente falar para gcc não criar um objeto P E aí se a gente rodar Esse comando não vai dar nenhum erro e a gente pode finalmente rodar o nosso executável e não aconteceu nada e por que que não aconteceu nada porque o eu fui burro basicamente eu não chamei a nossa função então aqui no nosso entry
Point a gente tem que chamar o print hello world né senão obviamente não vai funcionar e se a gente for dar todos aqueles comandos de novo finalmente temos lá o nosso hello world em assembly e gente eu fiz o vídeo exclusivo aqui pra turma de membros do canal mostrando como escrever um for loop em assembly se por acaso você acha esse assunto interessante e você quer apoiar aqui o canal é só você se tornar membro que esse vídeo já está disponível Beleza e você se tornando membro você me ajuda e quem sabe eu não consigo
aumentar a frequência de vídeos que eu posto aqui por causa da turma de membros Mas enfim gente escrevemos o nosso próprio código em assembly e cara você imagina a quantidade de abstração que existe Até chegar na nossa linguagem de programação que a gente usa tipo JavaScript Python ou até C mesmo muita coisa é abstraída da gente inclusive na linguagem de programação c e quando a gente escuta que uma linguagem ela é Cross platform Ou seja você pode enelar o mesmo código para diversas plataformas você imagina a dificuldade de quem fez essa linguagem ser código de
plataforma essas instruções que eu usei e essas CCS elas são específicas para Linux na plataforma Intel x86 se eu tivesse celando esse código paraa Windows ou sei lá para Mac OS como da própria Apple você imagina o trabalho que seria eu teria que escrever basicamente um código diferente para cada uma dessas arquiteturas e cada um desses sistemas Então a gente tem que ser muito grato pelas pessoas que escrevem todas essas Abstrações pra gente mas enfim gente por esse vídeo é isso eu espero que você tenha gostado se você por acaso tá interessado em ver o
for looping assembly considere se tornar membro aqui do canal que além de ter acesso a esse vídeo você vai estar me ajudando muito e também não deixa de se inscrever e deixar o like que nesse caso é totalmente de graça por esse vídeo é isso gente muito obrigado e até a próxima valeu tchau tchau