用内联汇编C替换功能

时间:2014-06-04 10:20:07

标签: c assembly clang inline-assembly

我有一个函数,其内部代码我想转换成汇编(出于各种原因):

int foo(int x, int y, int z);

我使用以下方法生成汇编代码:

clang -S -mllvm --x86-asm-syntax=intel foo.c

程序集输出:foo.s以类似:

开头
_foo:                               ## @foo
    .cfi_startproc
## BB#0:
    push    RBP
Ltmp2:
    .cfi_def_cfa_offset 16
...

我认为这是该函数的相应汇编代码。我的问题是,我应该将汇编输出的哪一部分复制到C代码中(我正在尝试使用内联汇编)以便该函数可以工作?代码应如下所示:

int foo(int x, int y, int z) {
   __asm__("..."); // <-- What goes inside?
}

由于

1 个答案:

答案 0 :(得分:1)

您必须查看该函数的反汇编并编写__asm__。例如下面的代码

int foo(int x, int y, int z) {
x = y+z; return x; }

将对以下内容进行反汇编:

int foo(int x, int y, int z) {
  push        ebp  
  mov         ebp,esp 
  sub         esp,0C0h 
  push        ebx  
  push        esi  
  push        edi  
  lea         edi,[ebp-0C0h] 
  mov         ecx,30h 
  mov         eax,0CCCCCCCCh 
  rep stos    dword ptr es:[edi] 

  x = y+z;
  mov         eax,dword ptr [y] 
  add         eax,dword ptr [z] 
  mov         dword ptr [x],eax 

  return x;
  mov         eax,dword ptr [x] 
}

所以你必须在下面添加声明x= y+z

 mov         eax,dword ptr [y] 
 add         eax,dword ptr [z] 
 mov         dword ptr [x],eax