Programar em Assembly 16 bits no linux ? Como ?

Iniciado por thiago_, 14 de Novembro de 2006, 22:04

tópico anterior - próximo tópico

thiago_

Pessoal, afim de estudos gostaria de saber como consigo programar em Assembly no linux.

Baixei o Nasm, como faço pra testar os programas etc ?

vlws

mientefuego

compila e roda uai

como compila com o nasm eu não sei... o gcc tem um compilador de assembly 32-bit padrão AT&T

é só salvar o arquivo como .s e compilar como um programa comum em .c

gcc -Wall -o programa programa.s

e depois executar

./programa

thiago_

$ gcc -Wall -o Eco2.asm  Eco.s
gcc: Eco.s: Arquivo ou diretório inexistente
gcc: sem arquivos de entrada

mientefuego

#3
Não é assim não Thiago...

1ª coisa: vc tem que programar em Assembler padrão AT&T, não padrão Intel...

Ex.: Código Intel para comparar o valor do registrador ebx com um valor para o qual o registrador eax aponta:

cmp [eax], ebx

Código AT&T para a mesma instrução:

cmpX %ebx, (%eax)

Onde o X deve ser substituído por:

b: se você quer testar apenas os últimos 8 bits do valor;
w: se você quer testar apenas os últimos 16 bits do valor;
l: se você quer testar todos os 32 bits do valor.

A utilização errada dessas instruções finais podem ter resultados desastrosos; seu programa simplesmente pode não funcionar, invadir memória, etc.

Se o valor estiver certo, o próprio compilador ajusta a comparação aos registradores adequados. Mas é bom lembrar que essa não é uma boa prática de programação ;)

Lógico que só esse exemplo não serve para absolutamente nada; se quiser usar a ferramenta de compilação do GCC, estude mais sobre montagem padrão AT&T.

Além do mais, a linha de comando que eu lhe passei já retorna o executável; o .s seria o arquivo que contém o código.

ou seja, se você quer que o nome do seu executável seja thiago e o nome do código fonte é teste.s, o comando vai ficar assim:

gcc -Wall -o thiago teste.s

e para executar, digite:

./thiago

O -Wall serve para que todos os warnings do compilador sejam impressos no terminal; o -o serve para que se gere o arquivo executável. Nunca testei, mas acredito que se você der um:

gcc teste.s

O compilador gerará um arquivo chamado a.out, que você pode rodar chamando:

./a.out

Espero ter ajudado

[]'s

PS: Você pode ler um pouco (em inglês) sobre diferenças entre Intel e AT&T em:

http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html

E é importante lembrar que prioritariamente, esse é o AT&T 32-bit, apesar de você conseguir programar para 16-bit se desejar.