Jump to content
Sign in to follow this  
rf-pt

Assembly duvida...

Recommended Posts

rf-pt

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

Share this post


Link to post
Share on other sites
Triton

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).


<3 life

Share this post


Link to post
Share on other sites
pmg

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


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
rf-pt

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

Share this post


Link to post
Share on other sites
rf-pt

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

Share this post


Link to post
Share on other sites
Jeronimus Linuxius

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

Share this post


Link to post
Share on other sites
juvenil

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:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.