<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivo para Assembly - Bóson Treinamentos em Ciência e Tecnologia</title>
	<atom:link href="https://www.bosontreinamentos.com.br/category/assembly/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bosontreinamentos.com.br/category/assembly/</link>
	<description>Artigos e Tutoriais sobre Desenvolvimento de Software, Bancos de Dados SQL, Linux, Lógica de Programação, Inteligência Artificial, Hardware, Eletrônica, Arduino, Técnicas e Teorias de Estudo e Aprendizagem, Carreira em TI, Ciências Cognitivas, e muito mais!</description>
	<lastBuildDate>Wed, 28 Feb 2024 11:22:35 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.6</generator>
	<item>
		<title>Introdução à linguagem Assembly de programação</title>
		<link>https://www.bosontreinamentos.com.br/assembly/introducao-a-linguagem-assembly-de-programacao/</link>
					<comments>https://www.bosontreinamentos.com.br/assembly/introducao-a-linguagem-assembly-de-programacao/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Wed, 28 Feb 2024 11:22:35 +0000</pubDate>
				<category><![CDATA[Assembly]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19079</guid>

					<description><![CDATA[<p>Introdução à linguagem Assembly de programação O Assembly foi uma das primeiras linguagens de programação com a qual eu tive contato na vida, ainda no curso técnico, por volta de 1994-1995 (a outra foi a linguagem Pascal, sobre a qual falarei em outro artigo). Você talvez já tenha ouvido falar nessa linguagem, mas é possível que nunca tenha tido contato com código-fonte escrito nela, e pode estar se perguntando &#8220;para que serve o Assembly?&#8220;, ou ainda &#8220;a linguagem Assembly ainda é usada?&#8220;. Neste post respondo a essas e outras perguntas, e mostro também código escrito nessa linguagem antiga (porém ainda útil), que você pode experimentar em seu computador usando ferramentas simples e gratuitas. O que é a linguagem Assembly? A linguagem Assembly, comumente abreviada por ASM, é uma linguagem de programação de baixo nível que permite aos programadores escreverem código  em instruções de baixo nível, próximas à linguagem de máquina, em vez de usar uma linguagem de alto nível mais abstrata, como C, Python ou Rust, por exemplo. Trata-se de uma linguagem simbólica que representa as instruções em uma forma mnemônica (códigos de operação), que é mais fácil de entender para os programadores do que a representação binária das instruções. Por exemplo, [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/assembly/introducao-a-linguagem-assembly-de-programacao/">Introdução à linguagem Assembly de programação</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introdução à linguagem Assembly de programação</h2>
<p>O <strong>Assembly</strong> foi uma das primeiras linguagens de programação com a qual eu tive contato na vida, ainda no curso técnico, por volta de 1994-1995 (a outra foi a linguagem Pascal, sobre a qual falarei em outro artigo).</p>
<p>Você talvez já tenha ouvido falar nessa linguagem, mas é possível que nunca tenha tido contato com código-fonte escrito nela, e pode estar se perguntando &#8220;<em>para que serve o Assembly?</em>&#8220;, ou ainda &#8220;<em>a linguagem Assembly ainda é usada?</em>&#8220;.</p>
<p>Neste post respondo a essas e outras perguntas, e mostro também código escrito nessa linguagem antiga (porém ainda útil), que você pode experimentar em seu computador usando ferramentas simples e gratuitas.</p>
<h3>O que é a linguagem Assembly?</h3>
<p>A linguagem Assembly, comumente abreviada por ASM, é uma linguagem de programação de baixo nível que permite aos programadores escreverem código  em instruções de baixo nível, próximas à linguagem de máquina, em vez de usar uma linguagem de alto nível mais abstrata, como <a href="https://www.bosontreinamentos.com.br/category/programacao-em-linguagem-c/">C</a>, <a href="https://www.bosontreinamentos.com.br/programacao-com-python/">Python</a> ou <a href="https://www.bosontreinamentos.com.br/category/rust/">Rust</a>, por exemplo.</p>
<p>Trata-se de uma linguagem simbólica que representa as instruções em uma forma <strong><em>mnemônica </em></strong>(códigos de operação), que é mais fácil de entender para os programadores do que a representação binária das instruções. Por exemplo, em uma instrução Assembly, &#8220;<strong>ADD</strong>&#8221; pode representar a adição de dois números quaisquer.</p>
<p>Cada instrução Assembly representa uma operação específica que a CPU (Unidade Central de Processamento &#8211; Processador) deve executar, como por exemplo mover dados da memória principal para um registrador, realizar operações aritméticas ou executar desvios condicionais ou incondicionais.</p>
<p>A linguagem Assembly é específica para cada tipo de processador e arquitetura de computador, pois as instruções Assembly são diretamente executadas pelo hardware da máquina.</p>
<p>Embora a linguagem Assembly seja mais difícil de aprender e escrever do que as linguagens de programação de alto nível, ela permite um controle muito mais preciso e direto sobre o hardware do sistema, tornando-a ideal para desenvolvedores que precisam escrever software para sistemas embarcados, sistemas operacionais, drivers de dispositivos e outras aplicações que exigem acesso direto ao hardware da máquina, alta velocidade de execução e confiabilidade.</p>
<p>Porém, devido à sua complexidade e à necessidade de escrever códigos em instruções de máquina específicas, a linguagem Assembly não é tão comum quanto as linguagens de programação de alto nível, como <a href="https://www.bosontreinamentos.com.br/category/programacao-em-c/">C++</a>, <a href="https://www.bosontreinamentos.com.br/category/java/">Java</a> ou Python.</p>
<h3>Quais as aplicações do Assembly hoje em dia?</h3>
<p>Embora a linguagem Assembly seja considerada uma linguagem de programação de baixo nível e mais difícil de aprender do que as linguagens de programação de alto nível, ela ainda é amplamente usada em áreas especializadas da programação que exigem alto desempenho e controle preciso sobre o hardware. Algumas das aplicações atuais do Assembly incluem:</p>
<ul>
<li><strong>Desenvolvimento de sistemas operacionais</strong>: os sistemas operacionais são um exemplo clássico de aplicação de Assembly, pois exigem um controle preciso sobre o hardware da máquina e um alto desempenho para executar operações em tempo real.</li>
<li><strong>Programação de dispositivos embarcados</strong>: muitos <a href="http://www.bosontreinamentos.com.br/eletronica/eletronica-geral/introducao-aos-sistemas-embarcados/">dispositivos embarcados</a>, como <a href="http://www.bosontreinamentos.com.br/eletronica/eletronica-geral/introducao-aos-microcontroladores/">microcontroladores</a>, câmeras digitais, telefones celulares e dispositivos IoT, são programados em Assembly, pois exigem um controle muito preciso sobre o hardware e uma alta eficiência em termos de recursos.</li>
<li><strong>Criação de drivers de dispositivos</strong>: os drivers de dispositivos são programas que permitem que o sistema operacional se comunique com os dispositivos de hardware, como placas de som, placas de vídeo e dispositivos de rede. Esses drivers são frequentemente escritos em Assembly, pois exigem um controle muito preciso sobre o hardware e um alto desempenho.</li>
<li><strong>Processamento de imagens</strong>: as operações de processamento de imagens, como convolução, filtragem e detecção de bordas, são frequentemente executadas em Assembly para obter um desempenho máximo.</li>
<li><strong>Programação de jogos eletrônicos</strong>: muitos jogos eletrônicos ainda são programados em Assembly para obter o máximo desempenho possível, especialmente em consoles de jogos com recursos limitados.</li>
<li><strong>Criptografia</strong>: muitos algoritmos de <a href="http://www.bosontreinamentos.com.br/seguranca/introducao-a-criptografia/">criptografia</a> são implementados em Assembly para garantir a segurança dos dados e garantir o desempenho máximo.</li>
</ul>
<p>Ou seja, a linguagem Assembly é usada em áreas onde é necessário um controle muito preciso sobre o hardware da máquina e um alto desempenho, mesmo que isso signifique uma curva de aprendizado mais íngreme e um processo de desenvolvimento mais complexo.</p>
<h3>Quando a linguagem Assembly foi criada?</h3>
<p>A linguagem Assembly é uma das linguagens de programação mais antigas que ainda são usadas hoje. Ela foi criada em meados da década de 1940, juntamente com os primeiros computadores eletrônicos, como o EDSAC (<em>Electronic Delay Storage Automatic Calculator</em>) e o ARC (<em>Automatic Relay Computer</em>). Naquela época, a programação era feita diretamente em linguagem de máquina, o que era muito trabalhoso e propenso a erros.</p>
<div id="attachment_19328" style="width: 640px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-19328" class="wp-image-19328 size-full" title="Computador EDSAC em 1948." src="http://www.bosontreinamentos.com.br/wp-content/uploads/2023/04/Computador-EDSAC-1948.jpg" alt="Computador EDSAC em 1948. " width="630" height="410" srcset="https://www.bosontreinamentos.com.br/wp-content/uploads/2023/04/Computador-EDSAC-1948.jpg 630w, https://www.bosontreinamentos.com.br/wp-content/uploads/2023/04/Computador-EDSAC-1948-420x273.jpg 420w" sizes="(max-width: 630px) 100vw, 630px" /><p id="caption-attachment-19328" class="wp-caption-text">Computador EDSAC em 1948.<br />
Imagem: Wikimedia Commons. Licença <a href="https://creativecommons.org/licenses/by/2.0" target="_blank" rel="noopener">CC BY 2.0</a></p></div>
<p>A linguagem Assembly foi desenvolvida para tornar a programação mais fácil e menos sujeita a erros, permitindo que os programadores escrevessem instruções em uma linguagem mais próxima da linguagem de máquina, mas com uma sintaxe mais fácil de entender pelos humanos.</p>
<p>O primeiro código no qual uma linguagem Assembly foi usada para representar instruções de código de máquina data do ano de 1947, sendo encontrado em um trabalho de nome <a href="https://albert.ias.edu/server/api/core/bitstreams/d47626a1-c739-4445-b0d7-cc3ef692d381/content">Coding for A.R.C</a> (Codificação para o computador <em>Automatic Relay Computer</em>), de Kathleen H. V. Britten e Andrew Donald Booth.</p>
<p>Desde então, a linguagem Assembly tem sido amplamente usada em áreas que exigem controle de baixo nível sobre o hardware, como sistemas operacionais, programação de dispositivos embarcados e processamento de imagens e os outros exemplos citados anteriormente.</p>
<h3>Quais versões do Assembly existem?</h3>
<p>A linguagem Assembly não tem <em>versões</em> específicas, como outras linguagens de programação. Em vez disso, existem vários <em>conjuntos de instruções Assembly</em>, cada um projetado para um processador ou arquitetura de computador específico. Isso ocorre porque as instruções Assembly são escritas em um nível muito baixo, que é quase diretamente traduzido em instruções de máquina.</p>
<p>Dessa forma, a linguagem Assembly é altamente dependente do hardware subjacente onde as aplicações serão executadas.</p>
<p>Cada arquitetura de computador tem seu próprio conjunto de instruções Assembly que são otimizadas para funcionar com o hardware específico. Por exemplo, a arquitetura x86 é usada por muitos processadores Intel e AMD, enquanto a arquitetura ARM é usada em dispositivos móveis, smartphones e outros sistemas embarcados.</p>
<p>Ou seja, cada uma dessas arquiteturas tem seu próprio conjunto de instruções Assembly distinto.</p>
<p>Sendo assim, <em>não existem diferentes versões da linguagem Assembl</em>y, mas sim <em>diferentes conjuntos de instruções que são específicos para diferentes arquiteturas de computador</em>.</p>
<h3>Como começar a programar em Assembly?</h3>
<p>Começar a programar em Assembly pode parecer bastante complicado a princípio (e é), especialmente se não estivermos acostumados com linguagens de programação de alto nível, mas é possível aprender com bastante prática e paciência. Abaixo listo algumas dicas para quem deseja começar a aprender essa linguagem:</p>
<ul>
<li><strong>Escolha um conjunto de instruções</strong>: como mencionado anteriormente, cada arquitetura de processador tem seu próprio conjunto de instruções Assembly. Portanto, o primeiro passo é escolher o conjunto de instruções que você deseja aprender, com base no processador que você está usando (por exemplo, plataforma Intel x86_64).</li>
<li><strong>Entenda a estrutura básica do programa Assembly</strong>: um programa Assembly é composto por uma série de instruções que são executadas sequencialmente. É importante entender como as instruções são organizadas em um programa Assembly.</li>
<li><strong>Aprenda as instruções básicas</strong>: Obviamente, devemos começar com as instruções básicas, como movimento de dados, aritmética básica, operações lógicas, desvios condicionais e loops. Essas instruções são as bases do Assembly e são usadas em todos os programas Assembly.</li>
<li><strong>Use um ambiente de desenvolvimento integrado (IDE)</strong>: um ambiente de desenvolvimento integrado é um software que facilita a escrita e execução de código Assembly. Existem vários IDEs disponíveis, como o MASM da Microsoft, o NASM para sistemas Unix e o GCC para várias plataformas.</li>
<li><strong>Pratique, pratique e pratique</strong>: a melhor maneira de aprender Assembly (ou qualquer outra linguagem de programação) é praticar escrevendo <em><strong>muito</strong></em> código. Comece com programas simples e, gradualmente, escreva programas mais complexos à medida que se torna mais confortável com a linguagem.</li>
<li><strong>Recursos de aprendizagem</strong>: existem muitos recursos de aprendizagem disponíveis online, como tutoriais, livros e fóruns. Alguns recursos que posso recomendar incluem &#8220;Assembly Language Step-by-Step&#8221; de Jeff Duntemann e o site &#8220;Assembly Language Tutorials&#8221; de Ray Seyfarth &#8211; além, é claro, dos tutoriais do blog da Bóson Treinamentos em tecnologia!</li>
</ul>
<p>Lembre-se: programação em Assembly é uma habilidade que leva tempo para ser aprendida. Porém, com bastante prática e paciência, é possível se tornar proficiente nesta linguagem.</p>
<h3>Assembly ou Assembler?</h3>
<p>Frequentemente ouvimos os termos &#8220;<strong>assembly</strong>&#8221; e &#8220;<strong>assembler</strong>&#8221; em referência a esta linguagem. Mas do que se tratam essas palavras? Significam a mesma coisa?</p>
<p>Não. Na verdade, &#8220;Assembly&#8221; e &#8220;Assembler&#8221; são termos relacionados à programação de baixo nível, mas referem-se a conceitos diferentes, como explico a seguir:</p>
<p>1.<strong> Assembly</strong> é o nome da linguagem de programação de baixo nível que é mais próxima da linguagem de máquina do que a linguagem de programação de alto nível. É uma representação simbólica da linguagem de máquina de um processador específico.</p>
<p>2. Já um <strong>Assembler</strong> é um tipo de programa de computador que traduz programas escritos em linguagem Assembly para código de máquina executável, de forma análoga a um compilador.<br />
O Assembler lê o código fonte em Assembly e produz código de máquina correspondente, geralmente em formato binário ou hexadecimal.<br />
Além de converter mnemônicos e diretivas em instruções de máquina, o Assembler também resolve rótulos (como identificadores de variáveis e funções) em endereços de memória específicos.</p>
<p>Ou seja, Assembly é a linguagem de programação e Assembler é a ferramenta de software que traduz programas escritos nessa linguagem em instruções de máquina executáveis pelo processador.</p>
<h3>Exemplo de código em Assembly</h3>
<p>Vejamos um exemplo de código &#8220;simples&#8221; em Assembly x86 que realiza a soma de dois números e armazena o resultado em uma variável:</p>
<pre><strong>section .data</strong>
<strong>num1 dd 10</strong>
<strong>num2 dd 20</strong>
<strong>res dd 0

</strong><strong>section .text</strong>
<strong>global _start

</strong><strong>_start:</strong>
<span style="color: #339966;"><strong>; move os valores de num1 e num2 para os registradores eax e ebx, respectivamente</strong></span>
<strong>mov eax, [num1]</strong>
<strong>mov ebx, [num2]

</strong><span style="color: #339966;"><strong>; adiciona os valores de eax e ebx e armazena o resultado em eax</strong></span>
<strong>add eax, ebx

</strong><span style="color: #339966;"><strong>; move o valor de eax para a variável res</strong></span>
<strong>mov [res], eax

</strong><span style="color: #339966;"><strong>; sai do programa</strong></span>
<strong>mov eax, 1</strong>
<strong>xor ebx, ebx</strong>
<strong>int 0x80</strong></pre>
<h4>Explicação</h4>
<p>Esse código começa definindo três variáveis: num1, num2 e res. Estas são declaradas como palavras duplas, o que significa que cada uma é um inteiro de 32 bits (4 bytes). A variável res é inicializada como zero.</p>
<p>Na seção .text, a função principal começa com o rótulo _start. O primeiro passo é mover os valores das variáveis num1 e num2 para os registradores eax e ebx, respectivamente. Isso é feito usando a instrução mov, que copia os dados de uma posição de memória para um registrador.</p>
<p>O próximo passo é adicionar os valores de eax e ebx usando a instrução add. O resultado da adição é armazenado em eax.</p>
<p>Por fim, o valor de eax é movido para a variável res usando a instrução mov. O programa sai do loop principal e termina usando as instruções mov, xor e int.</p>
<h3>Como testar o programa sugerido</h3>
<p>Podemos usar um compilador de Assembly para montar e executar o código fornecido anteriormente. Vejamos como fazer isso usando o <a href="https://www.nasm.us/" target="_blank" rel="noopener">compilador NASM</a>* em um sistema <a href="https://www.bosontreinamentos.com.br/curso-de-linux-basico-e-certificacao-lpi-1/">Linux</a>:</p>
<p>1. Crie um arquivo de texto chamado &#8220;soma.asm&#8221; usando um editor de sua preferência (<a href="https://www.bosontreinamentos.com.br/linux/curso-do-editor-vi-para-linux/">vim</a>, <a href="https://www.bosontreinamentos.com.br/linux/aprenda-usar-o-editor-de-textos-gnu-nano-no-linux/">nano</a>, <a href="https://www.bosontreinamentos.com.br/linux/editor-gnu-emacs-instalacao-e-criacao-de-arquivos-no-linux-ubuntu-01/">emacs</a>, etc.), e cole o código Assembly mostrado anteriormente.</p>
<p>2. Instale o NASM no seu sistema, se ainda não estiver instalado. No Linux Debian ou Ubuntu, podemos instalar o NASM digitando os seguintes comandos no terminal:</p>
<pre><strong>$ sudo apt update
</strong><strong>$ sudo apt install gcc-multilib
</strong><strong>$ sudo apt install nasm</strong></pre>
<p>3. Compile o código Assembly usando o NASM. Para isso execute o seguinte comando no terminal (estadnbo no diretório onde o arquivo foi criado):</p>
<pre><strong>$ nasm -f elf32 soma.asm</strong></pre>
<p>Este comando produz um arquivo objeto chamado &#8220;<em><strong>soma.o</strong></em>&#8220;.</p>
<p>4. Precisamos ligar o arquivo objeto gerado pelo NASM com a biblioteca padrão do C usando o compilador GCC. Para isso, digite o seguinte comando no terminal:</p>
<pre><strong>$ gcc -nostdlib soma.o -m32 -o soma</strong></pre>
<p>Este comando produz um arquivo executável chamado &#8220;<strong>soma</strong>&#8220;.</p>
<p>5. Vamos executar o programa para testá-lo digitando o seguinte comando no terminal:</p>
<pre><strong>$ ./soma</strong></pre>
<p>O resultado será armazenado na variável &#8220;result&#8221; e exibido no terminal. No caso do exemplo, o resultado será 30 (que é a soma de 10 e 20).</p>
<table style="border-collapse: collapse; width: 100%;" border="1">
<tbody>
<tr>
<td style="width: 764px; border-style: solid; border-color: #050000;">
<p>O <a href="https://www.nasm.us/" target="_blank" rel="noopener"><strong>NASM</strong></a> (<em>Netwide Assembler</em>) é um compilador de Assembly de código aberto que suporta várias arquiteturas de processadores, incluindo x86 e x86-64. Ele é usado para escrever programas em linguagem Assembly que podem ser executados em sistemas operacionais variados como Windows, Linux, macOS e até mesmo DOS.</p>
<p>O NASM é uma ferramenta popular para desenvolvedores de software que precisam escrever código de baixo nível para fins de otimização ou para trabalhar com recursos de hardware específicos. Ele é amplamente utilizado em áreas como jogos, programação de sistemas e desenvolvimento de drivers de dispositivos.</p>
<p>Essa ferramenta fornece muitos recursos avançados para programação Assembly, como por exemplo suporte para macros, diretivas e expressões de pré-processador. Ele também inclui um depurador integrado que ajuda os programadores a depurar o código e entender o fluxo de execução do programa.</p>
</td>
</tr>
</tbody>
</table>
<h3>Conclusão</h3>
<p>O Assembly é uma linguagem antiga de baixo nível e, portanto, altamente específica e dependente da arquitetura do processador (CPU). Código em Assembly é muito mais difícil de ler e escrever do que código criado em linguagens de programação de alto nível, como Python, C# ou Java.</p>
<p>No entanto, a linguagem Assembly oferece controle absoluto sobre o hardware e pode ser usada em situações onde a eficiência é crítica, como na programação de drivers de dispositivo, sistemas embarcados ou no desenvolvimento de sistemas operacionais.</p>
<p>Quer saber mais sobre Assembly? confira nosso tutorial &#8220;<strong><em><a href="https://www.bosontreinamentos.com.br/assembly/ola-mundo-em-assembly-no-ubuntu-linux-com-yasm-assembler/">Olá Mundo em Assembly no Ubuntu Linux, com Yasm Assembler</a></em></strong>&#8220;.</p>
<p>&nbsp;</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/assembly/introducao-a-linguagem-assembly-de-programacao/">Introdução à linguagem Assembly de programação</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/assembly/introducao-a-linguagem-assembly-de-programacao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Olá Mundo em Assembly no Ubuntu Linux, com Yasm Assembler</title>
		<link>https://www.bosontreinamentos.com.br/assembly/ola-mundo-em-assembly-no-ubuntu-linux-com-yasm-assembler/</link>
					<comments>https://www.bosontreinamentos.com.br/assembly/ola-mundo-em-assembly-no-ubuntu-linux-com-yasm-assembler/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Fábio dos Reis]]></dc:creator>
		<pubDate>Wed, 11 Oct 2023 12:18:19 +0000</pubDate>
				<category><![CDATA[Assembly]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">http://www.bosontreinamentos.com.br/?p=19777</guid>

					<description><![CDATA[<p>Olá Mundo em Assembly x86_64 no Ubuntu Linux, com Yasm Assembler Fala pessoal! Neste tutorial vamos trabalhar um pouco com a linguagem Assembly, criando um programa bem simples para explorar suas instruções. O programa será escrito em Assembly para a arquitetura Linux x86_64, usando o assembler Yasm (The Yasm Modular Assembler Project). O programa imprime a string &#8220;Olá Bóson&#8221; (ou qualquer outra que você queira) no terminal e depois encerra o programa. Para escrever o código, abra um editor de texto de sua preferência (eu usei o editor Geany), digite o código a seguir e salve o arquivo com o nome de olaMundo.s em um diretório de sua preferência (a extensão .s é importante!) Código ;olaMundo.s section .data msg db 'Ola Bóson' nl db 0x0a tamMsg equ $-msg section .text global _start _start: mov rax, 1 mov rdi, 1 mov rsi, msg mov rdx, tamMsg syscall mov rax, 60 mov rdi, 0 syscall A seguir mostro uma explicação detalhada do código, instrução por instrução. Explicação do código O código é organizado em duas seções principais: .data e .text, as quais são definidas a seguir: Seção .data: A seção .data é usada para declarar e alocar espaço para dados, como variáveis, constantes [...]</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/assembly/ola-mundo-em-assembly-no-ubuntu-linux-com-yasm-assembler/">Olá Mundo em Assembly no Ubuntu Linux, com Yasm Assembler</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Olá Mundo em Assembly x86_64 no Ubuntu Linux, com Yasm Assembler</h2>
<p>Fala pessoal! Neste tutorial vamos trabalhar um pouco com a linguagem Assembly, criando um programa bem simples para explorar suas instruções.</p>
<p>O programa será escrito em Assembly para a arquitetura Linux x86_64, usando o assembler Yasm (<a href="https://yasm.tortall.net/" target="_blank" rel="noopener">The Yasm Modular Assembler Project</a>). O programa imprime a string &#8220;Olá Bóson&#8221; (ou qualquer outra que você queira) no terminal e depois encerra o programa.</p>
<p>Para escrever o código, abra um editor de texto de sua preferência (eu usei o <a href="https://www.geany.org/" target="_blank" rel="noopener">editor Geany</a>), digite o código a seguir e salve o arquivo com o nome de <strong>olaMundo.s</strong> em um diretório de sua preferência (a extensão .s é importante!)</p>
<h3>Código</h3>
<pre><span style="color: #339966;"><strong>;olaMundo.s</strong></span>
<strong>section .data</strong>
<strong>    msg db 'Ola Bóson'</strong>
<strong>    nl db 0x0a</strong>
<strong>    tamMsg equ $-msg

</strong><strong>section .text</strong>
<strong>global _start

</strong><strong>_start:</strong>
<strong>    mov rax, 1</strong>
<strong>    mov rdi, 1</strong>
<strong>    mov rsi, msg</strong>
<strong>    mov rdx, tamMsg</strong>
<strong>    syscall</strong>
<strong>    mov rax, 60</strong>
<strong>    mov rdi, 0</strong>
<strong>    syscall</strong></pre>
<p>A seguir mostro uma explicação detalhada do código, instrução por instrução.</p>
<h3>Explicação do código</h3>
<p>O código é organizado em duas seções principais: <strong>.data</strong> e <strong>.text</strong>, as quais são definidas a seguir:</p>
<h4><em>Seção .data:</em></h4>
<p>A seção <strong>.data</strong> é usada para declarar e alocar espaço para dados, como variáveis, constantes e buffers.<br />
Dados declarados nesta seção são geralmente usados para armazenar valores que o programa irá usar durante sua execução, como por exemplo números inteiros, strings, arrays e outros tipos de dados.</p>
<p>Em nosso exemplo temos:</p>
<ul>
<li><strong>msg db &#8216;Olá Bóson&#8217;</strong>: Define uma variável chamada <em>msg</em> que armazena a string &#8220;Olá Bóson&#8221;.</li>
<li><strong>nl db 0x0a</strong>: Define uma variável <em>nl</em> com o valor hexadecimal <em>0x0a</em>, que representa uma nova linha na tabela ASCII.</li>
<li><strong>tamMsg equ $-msg</strong>: Calcula o tamanho da string msg subtraindo o endereço inicial de msg do endereço atual ($). Isso é usado para determinar o comprimento da string durante a execução.</li>
</ul>
<h4><em>Seção .text</em></h4>
<p>Já a seção <strong>.text</strong> contém as instruções de código Assembly, ou seja, o programa real que é executado.<br />
Esta seção contém a lógica do programa, incluindo operações aritméticas, controle de fluxo (condicionais, laços de repetição) e chamadas de funções, entre outras.</p>
<p>Em nosso código de exemplo:</p>
<ul>
<li><strong>global _start</strong>: Ponto de entrada do programa é definido como _start.</li>
<li><strong>_start</strong>: Rótulo que define o ponto de entrada do programa. Indica onde a execução do programa começa.</li>
<li><strong>mov rax, 1</strong>: Grava o valor 1 em rax, que é o número do sistema para a syscall sys_write (escrever na saída padrão).</li>
<li><strong>mov rdi, 1</strong>: Grava o valor 1 no registrador rdi, indicando que a saída será no stdout (file descriptor 1), ou saída padrão.</li>
<li><strong>mov rsi, msg</strong>: Grava o endereço da string msg no registrador rsi, apontando para a mensagem a ser impressa.</li>
<li><strong>mov rdx, tamMsg</strong>: Ajusta o tamanho da mensagem em rdx, indicando quantos bytes devem ser escritos.</li>
<li><strong>syscall</strong>: Chamada de sistema para escrever a mensagem no terminal.</li>
</ul>
<p>Após escrever a mensagem, o programa usa novamente syscall para chamar sys_exit (número do sistema 60) e encerrar o programa. O código de status de saída é 0, indicando que o programa terminou sem erros.</p>
<p>A primeira linha do código, <strong>;olaMundo.s</strong>, é um comentário, e por conta disso é ignorada pelo compilador. Os comentários se iniciam com o caractere <strong>;</strong> (ponto-e-vírgula), e se estendem até o final da linha.</p>
<p>Como executar esse programa? Veremos na próxima seção.</p>
<h3>Como rodar o programa em Assembly</h3>
<p>Para executar e testar o programa escrito, abra um terminal (alternativamente, execute direto a partir do editor de textos / IDE, se estiver configurado para tal), entre no diretório que contém o código-fonte criado anteriormente, e execute os comandos a seguir:</p>
<p>1 &#8211; Gerar um arquivo binário a partir do código-fonte:</p>
<pre><strong>$ yasm -f elf64 olaMundo.s</strong></pre>
<p>Esse comando lê o arquivo &#8220;olaMundo.s&#8221; contendo o código assembly digitado e gera um arquivo objeto binário ELF de 64 bits a partir dele, usando o assembler yasm. Será gerado o arquivo <em><strong>olaMundo.o</strong></em>.</p>
<p>A opção <strong>-f elf64</strong> especifica o formato de saída desejado. Aqui, indica que o formato de saída deve ser <strong>ELF</strong> (<em>Executable and Linkable Format</em>) de 64 bits. Trata-se de um formato de arquivo comum usado em sistemas Unix e Linux para executáveis e bibliotecas compartilhadas.</p>
<p>2 &#8211; Vincular o arquivo objeto e gerar programa executável:</p>
<pre><strong>$ ld -o olaMundo olaMundo.o</strong></pre>
<p>O comando diz ao linker <strong>ld</strong> para usar o arquivo objeto olaMundo.o como entrada e gerar um arquivo executável de nome olaMundo como saída. O arquivo executável é a versão final do programa que pode ser executada no sistema operacional.</p>
<p><strong>ld</strong> é o nome do vinculador (linker), que é uma ferramenta que combina um ou mais arquivos objeto em um único arquivo executável (mais sobre esse assunto nos próximos tutoriais).</p>
<p>3 &#8211; Vamos verificar o arquivo executável criado no diretório:</p>
<pre><strong>$ ls -l</strong></pre>
<p>Deve ter sido gerado um arquivo executável de nome <em>olaMundo</em> no diretório atual.</p>
<p>4 &#8211; Finalmente, rodamos o programa:</p>
<pre><strong>$ ./olaMundo</strong></pre>
<p>Resultado:</p>
<pre><span style="color: #000000;"><strong>Olá Bóson</strong></span></pre>
<p>Excelente! Nosso primeiro programa em Assembly criado, compilado e executado com sucesso. Nos próximos artigos vamos explorar mais a linguagem de forma sistemática, para entender como funcionam suas diversas declarações, mnemônicos e estruturas lógicas, e assim criar programas mais complexos.</p>
<p>Até!</p>
<p>O post <a href="https://www.bosontreinamentos.com.br/assembly/ola-mundo-em-assembly-no-ubuntu-linux-com-yasm-assembler/">Olá Mundo em Assembly no Ubuntu Linux, com Yasm Assembler</a> apareceu primeiro em <a href="https://www.bosontreinamentos.com.br">Bóson Treinamentos em Ciência e Tecnologia</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bosontreinamentos.com.br/assembly/ola-mundo-em-assembly-no-ubuntu-linux-com-yasm-assembler/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
