• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

rf-pt

Assembly duvida...

8 mensagens neste tópico

Boas...

o meu primeiro topico e logo uma duvida :wallbash:, não sei que mais fazer...

estou com o ubuntu, preciso do nasm para AC, arquit. de comp. mas não ha forma de resolver o problema..

comandos executados

nasm -f elf soma.asm - > sem erros, funciona perfeito

ld -s -o soma soma.o -> depois deste obtenho este resultado

ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080

soma.o: In function `main':

soma.asm:(.text+0x13): undefined reference to `printf'

sei que não será o melhor local para postar isto, mas... pode já ter acontecido a alguem...

o que fazer preciso de ajuda...

cmp

rf-pt

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra o código. Parece que não estás a definir o teu entry point bem. Ou mudas o nome no assembly, ou passas um ponto de entrada ao linker (ld).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Talvez se usares a opção "-l" para especificar o arquivo onde está a função printf o ld já não dê erro.

ld -s -o soma soma.o -lc

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas

Obrigado pela resposta...

já melhorou, mas pouco, estou sempre a  :wallbash:

já agora então é assim:

1 - rf@rf-desktop:~/arq/exemplos$ nasm -f elf soma.asm

2 - rf@rf-desktop:~/arq/exemplos$ ld -s -o soma soma.o -lc

3 - ld: warning: cannot find entry symbol _start; defaulting to 0000000008048190

4 - rf@rf-desktop:~/arq/exemplos$ ./soma

5 - bash: ./soma: Ficheiro ou directoria inexistente

Executando estes 5 comandos obtenho ao executar o programa esta maravilha (o ponto 5 na consola)

o codigo é mesmo o que se segue:

;Soma

extern printf

section .data
num1: dd 10
num2: dd 12
res: db " =%d",10 

section .bss

section .text
global main 

main:
mov ecx,[num1]
add ecx,[num2]
push ecx
push dword res
call printf

call sair 

sair:
mov eax,1 
mov ebx,0 
int 80h 

Se alguem conseguir ajudar agradeço...

cmp

rf-pt

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Falta fazeres o que eu disse.

Tenta assim: ld -e main -s -o soma soma.o -lc

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Falta fazeres o que eu disse.

Tenta assim: ld -e main -s -o soma soma.o -lc

Boas

Muito obrigado pela resposta...

realmente os erros desapareceram, mas...

quando faço "./soma" para executar tenho este resultado

"bash: ./soma: Ficheiro ou directoria inexistente.

Sei que devo ser chato mas o que me foi dito foi que assim executava o programa...

cmp

rf-pt

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

realmente os erros desapareceram, mas...

quando faço "./soma" para executar tenho este resultado

"bash: ./soma: Ficheiro ou directoria inexistente.

Não sei o que é que está a provocar o erro. No entanto, podes começar por ver se o executável existe:

ls -l

(Correcção: ya, o ficheiro existe e é excutável... não sei porque é que dá o erro, e até já passei pela situação há tempos, portanto lê mais abaixo (depois do bug)...)

Tens um bug: a string que passas ao printf precisa de levar um 0 no final (a seguir ao 10).

E... para começares pela função main(), tens de linkar com o crt0.so, e mais uma carrada de pessoal que eu nunca me lembro do nome. Por isso, aconselho-te que peças ao velho amigo gcc engole-tudo para tratar do assunto:

gcc -o soma soma.o

Normalmente, evita chamar o ld directamente (i.e. deixa o gcc tratar do assunto), a menos que queiras fazer black magic (p.e. linkar com a tua própria biblioteca asm ou codar sem bibloteca), ou se estiveres a escrever um sistema operativo :-) ou fores um compilador.

Se achares uma tolice chamar o GNU C Compiler para linkar asm, pensa antes que GCC quer dizer "GNU Compiler Collection", e já descansas a tua alma. ;-)

Só uma notificação, eu acho um bocado disparatado programar com a biblioteca do C em asm. No entanto, as mentes bem pensantes acham isso uma GoodThing. Uma situação intermédia seria linkares com a biblioteca do C mas só chamares os wrappers das system calls (for calling syscall wrappers instead of INTs is REALLY a GoodThing). Faz como quiseres (aka como te mandarem fazer na cadeira xD).

JJ

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas. sou novo no assembly e tenho uma duvida.

o meu prof mandou um exercicio na qual tenho de mudar a cor de fundo só do texto para verde e acor das letras para azul.

ele como base deu este codigo:

org 100h

.data

    message db  "3TGEI - 2007/2010$"

.code

start:

   

    mov dx, offset message

    mov ah, 09h

    int 21h     

    mov ax, 4c00h

    int 21h

         

end start

gostaria que me ajudassem. obrigado

aguardo resposta :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora