Programa exemplo em Assembler para Linux

Publicado por albert guedes em 14/03/2007

[ Hits: 20.131 ]

Blog: http://www.socrates.if.usp.br/~arcguede

 


Programa exemplo em Assembler para Linux



Este é um programa em assembler para Linux que deve ser compilado com o nasm. Ele está comentado para que se possa entender um pouco como a coisa funciona.

section .data

; 'MSG1' guarda a mensagem.	
MSG1:	db "Eu vou ler e escrever o que você digitar."
             db " Você já pode digitar:"  

; 'TAM1' guarda o tamanho de 'MSG1'
TAM1:	equ $ - MSG1 		
	
section .text			; Seção do texto.

global _start			; Declaração do inicio do programa.
	
_start:				   ; Inicio do programa.

	; Primeiro argumento.	
	mov eax, 4	; Guarda o valor 4 em eax que é o número
				; de chamada do sistema para escrever no
				; output dado por ebx.
	
	; Segundo argumento.	
	mov ebx, 1	; Guarda o número do output, que neste 
			       ; caso é 1, o monitor.
	
	; Terceiro argumento.
	mov ecx, MSG1		; Aqui é armazenado em ecx a 
		  		; mensagem 'MSG1'
	
	; Quarto argumento.	
	mov edx, TAM1		; edx recebe o tamanho da mensagem 
                                          ; 'MSG1'


	; Chamada do sistema.
	int 0x80	   ; Chama o sistema para executar a função
				; que está em eax, ou seja, a função 4, 
				; imprime a mensagem que está no endereço
				; armazenado em ecx através da saída que
				; está em ebx, a saída 1, o monitor.

	; Para a utilização de mais que cinco argumentos utilizamos a 
	; pilha, ou stack, para conseguirmos mais argumentos.
	mov ecx, esp	; Armazena em ecx a primeira posição 
				; do stack esp.
	
	sub esp, 11	; Subtrai 11 da posição do 
				; stack para reservar 11 bytes nele. 

	; Primeiro argumento.	
	mov eax, 3	 ; Armazena em eax o número da chamada
				; do sistema, 3 significa leitura.
	; Segundo argumento.	
	mov edx, 10	; edx recebe o valor 10 (0ax em hex) que
				; que é o tamanho da string que vai ser 
				; lido do input.
	
	int 0x80		; Chamada do sistema.

	mov edx, eax
	
	mov eax, 4		; Pedido de escrita.
	mov ebx, 1		; Output, isto é, o monitor.
	int 0x80		; Chama o sistema para imprimir.

	mov eax, 1		; Saída do sistema.
	mov ebx, 0		; Verifica se está tudo ok.
	int 0x80		; Chamada do sistema para imprimir.

Copie e cole este programa num arquivo "<nome qualquer>.asm".

Agora, crie um makefile "Makefile" com as seguintes linhas:

<nome qualquer> : <nome qualquer>.o
   ld -s -o <nome qualquer> <nome qualquer>.o

%.o: %.asm
   nasm -E <nome qualquer>.err -f elf -l <nome qualquer>.lst -o [email protected] $<

onde '<nome qualquer>.err' é a saída de erro da compilação e '<nome qualquer>.lst' é a saída do programa em código de máquina, com o respectivo comando em linguagem 'humana', que é legal para ver como funciona a coisa.

Feito o "Makefile", dê o bendito comando "make" e você terá o seu executável de nome "<nome qualquer>".

Após a felicidade de ter conseguido fazer seu primeiro programa em assembler, você já pode espalhar para seus amigos que você é um programador de assembler profissional.

Divirtam-se. : )

Outras dicas deste autor

Como ver a saída de qualquer comando MySQL no PHP

Janelas sem borda no Fluxbox

Resolvendo problema de conexão do Skype Beta no Debian

Assista vídeos redimensionados à sua escolha com o MPlayer

Introdução à prática de informática

Leitura recomendada

Introdução e configuração básica e rápida do iptables

Comandos básicos que você precisa aprender para usar o terminal no Ubuntu

Tamanho da fonte no XTerm

Como criar atalhos na Área de Trabalho do Ubuntu

Instalando e Configurando Servidor DHCP

  

Comentários
[1] Comentário enviado por tenchi em 14/03/2007 - 10:01h

Muito legal kra, eu faço info, e daqui a alguns anos terei de aprender assembly... Sabe, arquitetura de sistemas. Muito legal mesmo. Você p acaso não teria aí uma apostila sobre essa linguagem, sei lá, pode ser pra quelquer arquitetura, RISC ou sei lá, só pra eu pegar uma base na coisa?
Obs: Seria legal se vc publicasse um artigo mais detalhado sobre a linguagem, ajudaria muita gente.

Flws.

[2] Comentário enviado por albertguedes em 14/03/2007 - 14:28h

Este programa eu publiquei porquê foi o primeiro que eu entendi realmente como funciona, por isso coloquei em dicas, senão já teria feito com o maior sorriso na boca um artigo, mas eu ainda estou aprendendo usar assembly no linux, se ninguém publicar um artigo antes (e peço que façam por favor), algum dia eu faço um, mas por enquanto, eu tenho uns links que estou lendo que talvez te ajude também

http://docs.cs.up.ac.za/programming/asm/derick_tut/
http://www.numaboa.com.br/informatica/OS/asm.php
http://www.xml.com/ldd/chapter/book/
http://asm.sourceforge.net/
http://www.numaboa.com.br/informatica/assembly/
http://heather.cs.ucdavis.edu/~matloff/50/LinuxAssembly.html
http://www.janw.dommel.be/

e claro que tem os livros

"The Art of Assembly Language" de Randall Hyde
Editora No Starch Press

que deve ser bom para depois que se aprende a programar,
e o melhor

"Linux Assembly Language Programming" de Bob Neveln
Editora Prentice Hall

Acho que isto tá bom para começar, só lamento não ter mais títulos em português, mas qualquer dúvida, pode escrever, falou ?

[3] Comentário enviado por tenchi em 14/03/2007 - 14:38h

Kra, valew pelos links, pois já estão em favoritos (e sua dica também).
Eh sempre bom aprender essas coisas baixo nível, pra entender realmente o que cada coisa das linguagens de alto-nível funcionam.
Ah, uma pergunta: Vc sabe se o Linux ainda tem alguma parte de seu código escrito em baixo nível?

[4] Comentário enviado por albertguedes em 14/03/2007 - 15:16h

Eu também, não só acho como todo mundo que mexe com programação deve aprender assembly, pois é a única linguagem que realmente expressa como o computador 'pensa'.
Quanto ao Linux, uma boa parte do kernel e muitos dos drivers são feitos em assembly, é só ir dando olhada em

/usr/src/linux/include/asm-<qualquer coisa>

claro que é assembly em C, mas é assembly.
Para este assunto, eu recomendo mais um livro

"Desenvolvimento do Kernel do Linux" de Robert Love
Editora: Ciência Moderna

Bons estudos para você e os demais.

[5] Comentário enviado por cwars em 25/07/2007 - 14:25h

?comentario= Discordo em relação a dizer que boa parte do kernel do Linux é assembly, pois se fosse ele não seria tão portavel, mas exclusivo a um único processador; contudo existem sim partes exclusivas em assembly, mas como o código fonte é muito bem oprganizado todo o assembly usado para o kernel está em uma única pasta ao qual são definidas por arquiteturas.

Mas quase que 96% do kernel do Linux é escrito em C, já os restantes 4% porcento é escrito em assembly (sendo este para 6 arquiteturas de computadores diferentes) e geralmente só para chamadas de baixo nível ao qual são usadas pelos drivers

[6] Comentário enviado por crow em 03/03/2008 - 11:23h

Hola pessoal..
Para quem quer mais numeros para usar com int
De uma olhada em system call

http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html


So compartilhar uma dica valeu passoal

[7] Comentário enviado por diogo25luiz em 22/07/2011 - 10:10h

O programa funcionou no SlackWare 12.2. Muitos agradecimentos.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts