Assembly, passando parâmetros !

1. Assembly, passando parâmetros !

???
gokernel

(usa Linux Mint)

Enviado em 20/09/2012 - 18:30h

Olá pessoal !!!

Estou a quase "uma semana" tentando resolver um problema similar a este programa:


#include <stdio.h>

void teste (int a, int b, int c, int d)
{
printf ("a: %d, b: %d, c: %d, d: %d\n", a, b, c, d);
}

void run (void)
{
// passa o parametro 1:
asm ("movl $100, %eax");
asm ("movl %eax, (%esp)");

// passa o parametro 2:
asm ("movl $200, %eax");
asm ("movl %eax, 4(%esp)");

// passa o parametro 3:
asm ("movl $300, %eax");
asm ("movl %eax, 8(%esp)");

// passa o parametro 4:
asm ("movl $400, %eax");
asm ("movl %eax, 12(%esp)");

// agora chama a funcao

#ifdef __WIN32__
asm ("call _teste");
#endif
#ifdef __linux__
asm ("call teste");
#endif

printf("FUNCAO TERMINADA\n");
}


int main (void)
{
run ();

// <<<<<<< aqui causa uma quabra do programa >>>>>>>

printf ("SAINDO DO PROGRAMA COM SUCESSO\n");

return 0;
}



Ao terminar a funcao run o programa quebra ...

Alguem saberia dizer o que esta faltando em assembly ???

Estava usando "PUSH" e depois de fazer a chamada da funcao entao incrementava a PILHA ... mas é complicado incrementar a PILHA principalmente quando faz uma chamada que é a principal chamada ...

OBS: este pequeno exemplo é apenas para tentar demonstrar o problema.

Desde ja grato por qualquer ajuda !





2. Re: Assembly, passando parâmetros !

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/09/2012 - 19:53h

Em C, quando você chama uma função com, por exemplo, f(x, y), o compialdor gera código que PUSH do valor de cada argumento, da direita para esquerda, gera o CALL para o endereço inicial da função, e depois que a função retorna (logo após o CALL) faz algo como "ADD sizeof y + sizeof x, %esp". Se você quer usar uma função em C de dentro do seu código Assembly, tem de lembrar de usar as conveções de chamad do C.

A "rationale" para fazer fora da função a limpeza da pilha após o seu retorno é a possibilidade oferecida pelo C de ter funções com número variável de argumentos. Linguagens sem esse recurso (por exemplo, Pascal) geram código em que a limpeza da pilha fica dentro da função.

Eu nunca usei link-edição de módulos com conveções de chamada diferentes em Linux ou em outro UNIX, mas lembro que os compiladores em C para DOS costumavam ter palavras-chaves como "pascal" ou "fortran" usadas junto ao cabeçalho de algumas funções, tanto para informar sobre funções externas com chamada não-C quanto para alterar a convenção de chamada de uma função definida num módulo em C.


3. Re: Assembly, passando parâmetros !

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/09/2012 - 19:59h

Outra possibilidade (gambiarra?) é você manipular a pilha dentro da própria função chamada. Parece que existe uma variação de RET que permite especificar um valor fixo a ser somado a ESP logo após pegar o endereço de retorno da pilha, e o retorno da função do próprio C (quando se fecham as chaves da função, por exemplo) seria desperdiçado.

Ainda mais uma possibilidade é você criar uma macro (ou função inline, se o seu compilador permitir) que encapsule a chamada à função real e a limpeza da pilha.


4. Re: Assembly, passando parâmetros !

???
gokernel

(usa Linux Mint)

Enviado em 20/09/2012 - 20:18h


Olá Paulo, grato por participar !!!

Usava este codigo depois da chamada da funcao:
----------------------------------------------
asm ("add stack_count, %esp"); // undo stack
----------------------------------------------

O problema eh que chamo uma funcao similar ao do GKT ( gtk_main ) com um parametro, e nao tem como "incrementar" a PILHA, pois essa funcao eh a principal(loop) e ainda chama outras funcoes( sem terminar a principal )...

Como é esse "rationale" ???






5. Re: Assembly, passando parâmetros !

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/09/2012 - 20:22h

"Rationale" é tão somente uma explicação racional de uma escolha. Acho que é uma palavra nativa em Inglês (pelo menos ela se vê muito na documentação do POSIX), para a qual não me ocorreu sinônimo em Português.

Com relação à tal função que você chama, não entendi o problema. Tem como você mostrar o código específico?


6. Re: Assembly, passando parâmetros !

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/09/2012 - 20:25h

Acabei de ver que o GCC tem um atributo que pode ser colocado nas funçãoes que especifica outra convenção de chamada. Tal atributo é stdcall.

Este artigo na Wikipedia talvez também lhe interesse: http://en.wikipedia.org/wiki/X86_calling_conventions.


7. Re: Assembly, passando parâmetros !

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/09/2012 - 20:45h

E há ainda outros atributos relativo à conevnção de chamada, tais como fastcall, thiscall. Só que eu fiquei com a impressão de que essas convenções talvez não funcionem em arquitetura x86_64.

Recomendo você fazer testes com a opção -S, que gera o Assembly correspondente ao código em C, e comparar as diferentes opções.


8. Re: Assembly, passando parâmetros !

???
gokernel

(usa Linux Mint)

Enviado em 20/09/2012 - 20:55h


Eu pensei que o "rationale" fosse alguma funcao em C, ahahahahah ;).

Sobre a funcao que falei, é que estou utilizando um BYTECODE+LANGUAGE_SCRIPT que utiliza assembly para passagem de parametros, e utiza um script +ou- assim:



// Isto eh um script ....

function func_help()
{
help(1); // aqui eh uma C funcao ... incrementa a PILHA ao ser chamada
}

pvoid win;

AS_app_init (0,0);

$win = window(100, 100, 400, 300, "Simples Janela");

// ao clicar neste botao chamaria a funcao ( help(); )
// O PROBLEMA: ... help() teria de "incrementar" a PILHA
//
button (100, 170, 150, 25, "Help", win, "func_help");

// <<<<<< LOOP PRINCIPAL ... PROBLEMA: nao pode incrementar a pilha ...
// MOTIVO: ... pois fica neste loop ate finalizar o programa
//
AS_app_run(0); // <<<<<<<<<< Loop Principal



Parte do codigo em C pode ser visto aqui:
http://codepad.org/LBGnSsRo




9. Re: Assembly, passando parâmetros !

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/09/2012 - 00:49h

Eu não sei se entendi bem o problema.

No código que você mostrou por último, parece-me claro que quando func_help(), que é da linguagem de script, chama help(), que é em C, o interpretador do script é que deveria se adaptar às exigências da função chamada. Em outras palavras, se a linguagem de scripts se propõe a importar funções de outra linguagem, deveria saber falar o que essa linguagem espera ouvir.

Não ficou claro, mas eu fiquei com a impressão de que é você que está implementando uma linguagem de script com bytecode. É isso, e o problema está sendo justamente fazer essa "cola"?

Em tempo: gostei do primeiro agradecimento no seu código em C. Não é sempre que se vê esse tipo de coisa no meio de Informática.


10. Re: Assembly, passando parâmetros !

???
gokernel

(usa Linux Mint)

Enviado em 21/09/2012 - 04:34h

@paulo:
"Em tempo: gostei do primeiro agradecimento no seu código em C. Não é sempre que se vê esse tipo de coisa no meio de Informática."

Curti o seu comentário ...



É tipo assim:
-------------------------------------------------
Honra, glória, ... em primeiro lugar para DEUS sempre. \o/
-------------------------------------------------

Pois ele é o provedor:
-------------------------------------------------
Daniel: capítulo 2 (20 - 21).
-------------------------------------------------



11. Re: Assembly, passando parâmetros !

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/09/2012 - 10:29h

Eu preciso colocar uns 'Soli Deo Gloria' nos meus programas, também.

De qualquer forma, e quanto ao assunto técnico?


12. Re: Assembly, passando parâmetros !

???
gokernel

(usa Linux Mint)

Enviado em 22/09/2012 - 10:15h


@paulo1205:
"De qualquer forma, e quanto ao assunto técnico? "

É o seguinte:
Por esse meu projeto ( JBC ) ser inicialmente aberto/livre então tenho a liberdade de usar "comentários" levando para o meu lado pessoal ...

Mas se tratando de trabalhor pagos a ética manda "dançar conforme a música" ... ou seja é bom se "comportar" adequadamente levando em conta o lado do cliente ...

Não convem fazer trabalho para um cliente e depois ser tachado de:
""ÔH CARA CHATO(usando comentários pessoais), SÓ PODIA SER UM CRENTE ..."" ;) ;) ;) ... isto so afastaria as pessoas ...

Não sei se respondi bem a sua pergunta.

Paz e graça !!!





01 02