Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: Ubuntu 8.04 + Compiz
Por cleitonss
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha


Dica

Programa exemplo em Assembler para Linux
Linux user
Publicado por albert guedes em 14/03/2007

Login: albertguedes, 569919 pontos | Blog: http://www.socrates.if.usp.br/~arcguede
[ Hits: 12460 ]

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 $@ $<

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

Leitura recomendada
   Dica Linux recomendada Instalando facilmente o Firebird no Ubuntu
   Dica Linux recomendada sidux versão 2009-03 Momos - notas de lançamento (release notes)
   Dica Linux recomendada Fortune com gDesklets
   Dica Linux recomendada Configurando o teclado no Fedora 15
   Dica Linux recomendada MOD_EVASIVE - Block DDOS attacks

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


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.