Linux slogan
Visite também: BR-Linux.org · Dicas-L · NoticiasLinux · SoftwareLivre.org · UnderLinux · BestLinux
» Screenshot
Linux: Gnome
Por rafasch



» Login
Login:
Senha:

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

Esqueci minha senha

» Wallpaper
Linux: The power is here!
Por vodooo

Dica

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

Login: albertguedes, 331544 pontos Homepage: http://www.socrates.if.usp.br/~arcguede
[ Hits: 8506 ]

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 LPI - Mudanças na certificação
   Dica Linux recomendada Reconfiguração da home do usuário ao iniciar
   Dica Linux recomendada Escolhendo a distribuição
   Dica Linux recomendada BlueProximity: Travando a tela do Linux com o bluetooth
   Dica Linux recomendada Usando o VOL a seu favor: encontrando facilmente o que precisa

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


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 - Copyleft 2002-2009 Viva o Linux.com.br

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.