[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: chamada de funcao



On Tue, Mar 26 2002 at 05:43:10pm +0000, Andre Thomas Kowaltowski wrote:
> Quando tentamos montar o arquivo executavel o gcc reclama de "undefined
> reference to 'produto_escalar'" que deveria ser a funcao chamada. Como a
> funcao em c deve chamar a funcao em linguagem de montagem? No arquivo em
> linguagem de montagem basta colocar um rotulo com o nome da "funcao"
> para identificar a funcao? (com o underscore antes ou nao...)

Bom, primeiro e' bom lembrar que, em C, sempre e' preciso declarar uma
funcao antes de usa-la; voce nao precisa *definir* a funcao (ou seja, nao
precisa escrever o codigo que implementa a funcao), mas precisa
*declara-la* (ou seja, dizer "qual e' a cara" da funcao). No caso da
funcao produto_escalar, voce precisa declara-la de acordo com o enunciado
do EP:

long int produto_escalar (unsigned short, short*, short*);

Isso diz ao compilador: essa funcao existe em algum lugar, entao deixe
tudo preparado para que ela possa ser "enxertada" no lugar certo. Depois
que voce compila os diversos arquivos do seu progrma, o ligador (linker)
encontra todas as funcoes e todas as chamadas a funcoes e faz tudo "cair
no lugar certo".

Gracas a isso voce pode implementar o seu programa em "pedacos", cada
pedaco em um arquivo diferente, e compilar cada arquivo separadamente.
Assim, se voce esta' mexendo no codigo do Mozilla e modifica um arquivo,
apenas esse arquivo precisa ser recompilado e tudo tem que ser "linkado"
novamente; isso provavelmente leva uns 2 minutos, ao inves de ~5h que e' o
tempo para compilar o mozilla inteiro.

Quanto ao arquivo em linguagem de montagem, se entendi a coisa direitinho,
a ideia e' que voce precisa dizer que existe uma "coisa" nesse arquivo
chamada produto_escalar:

.globl produto_escalar

E que essa "coisa" e' uma funcao:
	.type produto_escalar,@function

E, finalmente, definir a funcao:

produto_escalar:
	...codigo...

Essas sao as informacoes que o linker vai usar para colocar a chamada `a
sua funcao em linguagem de montagem "dentro" da funcao "main" (em C).

Ate' +
Nelson