Autor Tópico: Programar em Assembly 16 bits no linux ? Como ?  (Lida 4733 vezes)

Offline thiago_

  • Usuário Ubuntu
  • *
  • Mensagens: 11
    • Ver perfil
Programar em Assembly 16 bits no linux ? Como ?
« Online: 14 de Novembro de 2006, 22:04 »
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

Offline mientefuego

  • Usuário Ubuntu
  • *
  • Mensagens: 56
    • Ver perfil
Re: Programar em Assembly 16 bits no linux ? Como ?
« Resposta #1 Online: 15 de Novembro de 2006, 10:18 »
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

Código: [Selecionar]
gcc -Wall -o programa programa.s
e depois executar

Código: [Selecionar]
./programa

Offline thiago_

  • Usuário Ubuntu
  • *
  • Mensagens: 11
    • Ver perfil
Re: Programar em Assembly 16 bits no linux ? Como ?
« Resposta #2 Online: 15 de Novembro de 2006, 16:33 »
$ gcc -Wall -o Eco2.asm  Eco.s
gcc: Eco.s: Arquivo ou diretório inexistente
gcc: sem arquivos de entrada

Offline mientefuego

  • Usuário Ubuntu
  • *
  • Mensagens: 56
    • Ver perfil
Re: Programar em Assembly 16 bits no linux ? Como ?
« Resposta #3 Online: 16 de Novembro de 2006, 09:38 »
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:

Código: [Selecionar]
cmp [eax], ebx
Código AT&T para a mesma instrução:

Código: [Selecionar]
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:

Código: [Selecionar]
gcc -Wall -o thiago teste.s
e para executar, digite:

Código: [Selecionar]
./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:

Código: [Selecionar]
gcc teste.s
O compilador gerará um arquivo chamado a.out, que você pode rodar chamando:

Código: [Selecionar]
./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.
« Última modificação: 16 de Novembro de 2006, 09:43 por mientefuego »