用内联汇编C替换功能

Pet*_*ter 5 c assembly clang inline-assembly

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

int foo(int x, int y, int z);
Run Code Online (Sandbox Code Playgroud)

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

clang -S -mllvm --x86-asm-syntax=intel foo.c
Run Code Online (Sandbox Code Playgroud)

程序集输出:foo.s从以下内容开始:

_foo:                               ## @foo
    .cfi_startproc
## BB#0:
    push    RBP
Ltmp2:
    .cfi_def_cfa_offset 16
...
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Bal*_*alu 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] 
}
Run Code Online (Sandbox Code Playgroud)

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

 mov         eax,dword ptr [y] 
 add         eax,dword ptr [z] 
 mov         dword ptr [x],eax 
Run Code Online (Sandbox Code Playgroud)