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:
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.
[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.
[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
[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
[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