Resultados 1 a 4 de 4
  1. #1

    [ASM/C][Duvida] Disassembly de uma função

    Estava fazendo programas simples em C e debugando com o Ollydbg esse código
    Código:
    unsigned int soma(unsigned int a,unsigned int b)
    {
        return a+b;
    }
    
    
    int main()
    {
        unsigned int a = 5,b = 10,c;
        c = soma(a,b);
        return 0;
    }
    Num trecho do disassembly eu reparei isso
    Código:
    76352823   8B4D 08          MOV ECX,DWORD PTR SS:[EBP+8]
    76352826   8B45 0C          MOV EAX,DWORD PTR SS:[EBP+C]
    76352829   03C1             ADD EAX,ECX
    Estou errado ou ele move pro ECX o conteudo do Ponteiro que aponta pra stack +8 (um unsigned int)
    Depois ele faz a mesma coisa com EAX só que pegando 4bytes acima(C-8 = 4)
    E depois faz o ADD com os 2 ?
    MP Com dúvidas e pedidos de ajudas serão IGNORADAS
    "Mentes fracas não pensam,corpos fracos não lutam."

    Microsoft Technology Associate: Software Development Fundamentals (C#
    )

  2. #2
    Moderador Avatar de _Guga_
    Data de Ingresso
    Apr 2006
    Localização
    Salvador - BA
    Posts
    2.118
    Código:
    mov ecx, dword ptr SS:[EBP + 8]  ;  conteúdo do parametro b
    mov eax, dword ptr SS:[EBP + C]  ;  conteúdo do parametro a
    add eax, ecx                              ; return a + b;
    pense assim, o [] equivale ao * do C ou C++ que retorna o valor da memoria apontada pelo ponteiro.

    Ps: vc n estava errado rs

    abraços


    I must not fear. Fear is the mind killer.

  3. #3
    Citação Postado originalmente por _Guga_ Ver Post
    Código:
    mov ecx, dword ptr SS:[EBP + 8]  ;  conteúdo do parametro b
    mov eax, dword ptr SS:[EBP + C]  ;  conteúdo do parametro a
    add eax, ecx                              ; return a + b;
    pense assim, o [] equivale ao * do C ou C++ que retorna o valor da memoria apontada pelo ponteiro.

    Ps: vc n estava errado rs

    abraços
    Hehe eu lembrei daquele post seu dos tipos de chamadas,no caso do _cdecl os parametros são colocados na pilha na ordem certa(no caso seria o push do a e depois o push do b) e o retorno fica no EAX.
    Achei no Wikibooks sobre X86 Disassembly um monte de coisa interessante.
    MP Com dúvidas e pedidos de ajudas serão IGNORADAS
    "Mentes fracas não pensam,corpos fracos não lutam."

    Microsoft Technology Associate: Software Development Fundamentals (C#
    )

  4. #4
    Moderador Avatar de _Guga_
    Data de Ingresso
    Apr 2006
    Localização
    Salvador - BA
    Posts
    2.118
    cuidado pra vc n encalhar em alguns undefined behaviors do C quando vc estiver brincando com parametros.

    por exemplo:

    Código:
    int FuncA() { printf(“Hello “); return 0; } int FuncB() { printf(“World”); return 0; } void FuncC( int a, int b ) { printf(“!!!!”); } int main(int, char **) { FuncC( FuncA(), FuncB() ); return 0; }


    Este código pode tando imprimir “Hello World!!!!” quanto “WorldHello !!!!”, porque a norma não diz nada quanto a ordem em que os argumentos de uma função são executados ( eu disse executados, nao empilhados rs )

    abração
    Última edição por _Guga_; 28 Feb 2012 às 15:31.


    I must not fear. Fear is the mind killer.

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •