汇编语言如何与高级语言混编

汇编混编的两种方式(内联汇编 和 外链汇编)

内联汇编

  • asm();这是内联汇编,编译器可以直接运行
    asm ( 汇编语句
    : 输出操作数 // 非必需
    : 输入操作数 // 非必需
    : 其他被污染的寄存器 // 非必需
    );
    • 第1行是汇编语句,如果有多句需要用\t\n来分隔
    • 第2行是输出操作数,都是“=r(var)”的形式,var可以是任意内存变量(输出结果会存到这个变量中)除了r之外,一般还有下面这些标识符:
      r 上面的寄存器的任意一个(谁闲着就用谁)
      m 内存
      i 立即数(常量,只用于输入操作数)
      g 寄存器、内存、立即数 都行(gcc你看着办)
    • 第3行是输入操作数,也是和输出操作数一样的格式。
    • 第4行是的作用可以在汇编代码一运行之前,将指定的寄存器保存起来,当汇编代码结束后再恢复。
  • 案例(这里用的是ATT语法)
汇编语言如何与高级语言混编_第1张图片
Snip20170731_25.png

我们查看一下它的汇编,并读取它的内存看下

汇编语言如何与高级语言混编_第2张图片
Snip20170731_28.png

0x5566的内存 (lldb) memory read 0x100000f2b
0x100000f2b: 48 c7 c0 66 55 00 00
0x7788的内存 (lldb) memory read 0x100000f32
0x100000f32: 48 c7 c0 88 77 00 00
48 c7 c0这是干什么呢?其实就是mov一个指令给ax,然后把5566或者7788赋值给ax

外链汇编

  • 案例
汇编语言如何与高级语言混编_第3张图片
Snip20170731_29.png
  • sum函数反汇编


    汇编语言如何与高级语言混编_第4张图片
    sum函数反汇编.png
  • sum函数详解
1.sum函数里面有2个参数,参数是放在寄存器里面(优先放%edi,%esi)
2.  0x100000f00 <+0>:  pushq  %rbp    0x100000f01 <+1>:  movq   %rsp, %rbp 这是栈的保护
3.     0x100000f04 <+4>:  movl   %edi, -0x4(%rbp)
    0x100000f07 <+7>:  movl   %esi, -0x8(%rbp)
->  0x100000f0a <+10>: movl   -0x4(%rbp), %esi
    0x100000f0d <+13>: addl   -0x8(%rbp), %esi
    0x100000f10 <+16>: movl   %esi, %eax
    0x100000f12 <+18>: popq   %rbp
这里是业务逻辑代码
业务逻辑执行首先把$edi,$esi放在红色区域,然后又把红色区域的值赋
给$esi寄存器,然后又把$esi的值加放给$esi,最后把$esi赋给$eax
4.最终返回的$eax
  • 我们用汇编替换下sum函数,外链汇编怎么编呢?
  • 案例
    • 备注下.s文件是建个(Assembly File)文件


      汇编语言如何与高级语言混编_第5张图片
      Snip20170731_34.png
  • 执行结果如下


    汇编语言如何与高级语言混编_第6张图片
    Snip20170731_35.png
  • 用汇编的好处有很多,最大的优势莫过于效率高,执行快,特别是对一些核心复用率高的代码来说,非常棒!!!!

你可能感兴趣的:(汇编语言如何与高级语言混编)