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.htmlE é importante lembrar que prioritariamente, esse é o AT&T 32-bit, apesar de você conseguir programar para 16-bit se desejar.