【inline】内联汇编在不同平台下编译的注意事项

Date: 2018.10.23


1、参考

https://blog.csdn.net/zhangyifei216/article/details/49788863
https://blog.csdn.net/hongbochen1223/article/details/45102653

2、内联汇编简介

    在Linux内核代码中有一部分是使用汇编语言编写的,尤其是与特定体系结构相关的代码和一些对性能影响很大的代码都是使用汇编语言进行编写的,那么GCC为了可以在C语言中来编写汇编代码,提供了内联汇编的功能,可以在C代码中直接内嵌汇编语言,大大方便了程序设计。

3、内联汇编的编译

(1) Windows平台(VS):

  • 默认编译器(cl.exe)
    1)不支持x64下的内联汇编
    2)支持win32下的内联汇编,但是需要使用Intel格式的内联汇编,并且内联汇编基本语法格式为__asm{ }。
  • icc编译器(vs中按照Intel C++ Compiler XE编译器)
    1)支持x64下的内联汇编
    2)支持win32下的内联汇编

(2) Linux平台:

  • 默认编译器(gcc)
    1)支持32位以及64位的内联汇编,但是需要AT&T格式的内联汇编,且内联汇编基本语法格式为asm(…); 或 asm volatile(…);
  • icc编译器
    1)支持32位和64位下的内联汇编。icc编译器支持intel assemly syntax和 GNU-style inline(AT&T)语法。
4、注意事项

(1)Linux平台下GNC C编译器一般使用AT&T格式,当然也可以使用Intel格式,asm(…);
(2)Windows平台下固定前缀asm后面用花括号{} ,Linux平台下固定前缀asm后面用圆括号();
(3)固定前缀asm的具体格式与系统和平台有关;
(4)Intel汇编格式和AT&T汇编格式的区别主要在于寄存器和立即数前缀、操作数的方向、内存单元操作数的格式、间接寻址方式格式等。


THE END!

原文地址:https://www.cnblogs.com/SoaringLee/p/10532319.html