什么c代码编译成`call *%eax`之类的东西?

时间:2014-01-24 03:52:31

标签: c assembly

我正在使用c和汇编,我在一些地方看过call *%eax。我想编写一个小型的c程序,可以编译成这样的东西,但我卡住了。

我正在考虑编写一些汇编代码,就像在这个问题中一样:x86 assembly instruction: call *Reg在我的案例中只使用AT& T语法来获取一个小例子。但是,这不能解决我对什么样的c代码编译的问题?

我知道这是对eax指向的地址的调用。

2 个答案:

答案 0 :(得分:3)

文档:http://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html#Local-Reg-Vars

试试这个

#include <stdio.h>

typedef void (*FuncPtr)(void);
void _Func(void){
   printf("Hello");
}

int main(int argc, char *argv[]){
   register FuncPtr func asm ("eax") = _Func;
   func();

   return 0;
}   

及其相关集会:

    .file   "functorTest.c"
    .section .rdata,"dr"
LC0:
    .ascii "Hello\0"
    .text
.globl __Func
    .def    __Func; .scl    2;  .type   32; .endef
__Func:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $LC0, (%esp)
    call    _printf
    leave
    ret
    .def    ___main;    .scl    2;  .type   32; .endef
.globl _main
    .def    _main;  .scl    2;  .type   32; .endef
_main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    call    ___main
    movl    $__Func, %eax
    call    *%eax       ; see? 
    movl    $0, %eax
    movl    %ebp, %esp
    popl    %ebp
    ret
    .def    _printf;    .scl    2;  .type   32; .endef

答案 1 :(得分:3)

只需添加另一个带有局部变量的示例。

#include <stdio.h> 
// A normal function with an int parameter 
// and void return type 
void fun(int a) 
{ 
    printf("Value of a is %d\n", a); 
} 

int main() 
{ 
    // fun_ptr is a pointer to function fun()  
    void (*fun_ptr)(int) = &fun; 

    // Invoking fun() using fun_ptr 
    (*fun_ptr)(10); 

    return 0; 
} 

程序集(有一些额外的代码,因为它是在x64计算机上的x86中编译的。如果新观众要求,我可以提供x64)

000011c7 <main>:
    11c7:       8d 4c 24 04             lea    0x4(%esp),%ecx
    11cb:       83 e4 f0                and    $0xfffffff0,%esp
    11ce:       ff 71 fc                pushl  -0x4(%ecx)
    11d1:       55                      push   %ebp
    11d2:       89 e5                   mov    %esp,%ebp
    11d4:       51                      push   %ecx
    11d5:       83 ec 14                sub    $0x14,%esp
    11d8:       e8 28 00 00 00          call   1205 <__x86.get_pc_thunk.ax>
    11dd:       05 23 2e 00 00          add    $0x2e23,%eax
    11e2:       8d 80 99 d1 ff ff       lea    -0x2e67(%eax),%eax
    11e8:       89 45 f4                mov    %eax,-0xc(%ebp)
    11eb:       83 ec 0c                sub    $0xc,%esp
    11ee:       6a 0a                   push   $0xa
    11f0:       8b 45 f4                mov    -0xc(%ebp),%eax
    11f3:       ff d0                   call   *%eax
    11f5:       83 c4 10                add    $0x10,%esp
    11f8:       b8 00 00 00 00          mov    $0x0,%eax
    11fd:       8b 4d fc                mov    -0x4(%ebp),%ecx
    1200:       c9                      leave  
    1201:       8d 61 fc                lea    -0x4(%ecx),%esp
    1204:       c3                      ret