跟我一起走进内联汇编的世界

一、基本内联汇编:

内联汇编代码比较容易整合到c/c++的代码中,可以做一些对于单独使用c/c++来说笨重或者不可能完成的任务。而且它还可以访问寄存器的值、访问条件码、使用一些特殊的指令和特殊的内存地址等等。

内联汇编主要用于如下场合:
1.使用汇编语言编写特定的函数;
2.编写对速度要求非常高的代码;
3.设备驱动程序中直接访问硬件;
4.编写"Naked" Call的初始化和结束代码。

C/C++与汇编可以混合使用,在内联汇编可以使用C/C++的变量和很多其它C/C++的元素。在__asm__块中可以使用以下C/C++元素:
1.符号,包括标号、变量和函数名;
2.常量,包括符号常量和枚举型(enum)成员;
3.宏定义和预处理指示符;
4.注释,包括""和"//";
5.类型名,包括所有MASM中合法的类型
6.typedef名称, 像PTR、TYPE、特定的结构成员或枚举成员这样的通用操作符。
  在__asm__块中,可以使用C/C++或ASM的基数计数法(比如: 0x100和100H是相等的)。

二、gcc定义嵌入式汇编

asm asm-qualifiers ( AssemblerTemplate:

OutputOperands[ :

InputOperands[ :

Clobbers/Modify ] ])

解析:

asm:嵌入式汇编的关键字,但为了解决在有编译选项‘-std=gnu99’的情况下 ,asm关键字会无效的问题,实际都是使用__asm__。

用来声明一个内联汇编表达式,任何一个内联汇编表达式都是以它开头的,是必不可少的。

asm-qualifiers:限定符,当是volatile(实际用__volatile__)时,表示不要对嵌入式汇编进行优化。否则当你使用了优化选项(-O)进行编译时,GCC将会根据自己的判断决定是否将这个内联汇编表达式中的指令优化掉。

如果你不想让GCC的优化影响你的内联汇编代码,你最好在前面都加上__volatile__,而不要依赖于编译器的原则,因为即使你非常了解当前编译器的优化原则,你也无法保证这种原则将来不会发生变化。而__volatile__的含义却是恒定的。

AssemblerTemplate:汇编模板,名称虽然很奇怪,但没有输入输出参数的情况下,其内容就是普通的汇编语句。

也就是"Instruction List",它是汇编指令序列。它可以是空的。

其中()里面所有的汇编语句都属于AssemblerTemplate的内容。但是,如果需要输入输出参数时,则%0表示第一个参数,%n表示第n个参数。

比如:__asm__ __volatile__(""); 或__asm__ ("");都是完全合法的内联汇编表达式,只不过这两条语句没有什么意义。

但并非所有Instruction List为空的内联汇编表达式都是没有意义的。

比如:__asm__ ("":::"memory"); 就非常有意义。

它向GCC声明:“我对内存作了改动”,GCC在编译的时候,会将此因素考虑进去。

注意的俩点:

第一就是所有寄存器都使用%%作为前缀,第二在这个部分新增了%0~%9的占位符来表示用户填充的数据。那么占位符,占的是什么位呢,谁来填充,怎么填充?%0~%9的占位符会用输出部分和输入部分指定的寄存器或变量按照出现的顺序依次填充。如果不够填充则会出现编译错误的情况。

invalid 'asm': operand number out of range

例如下面的汇编代码:

__asm__(
        "movl %0,%%eax \n\t"
        "movl %%eax,%1"
        :"=m" (a)
        :"m" (b)
        );

        其中%0会被变量a的内存地址替换掉,%1会被变量b的内存地址替换掉。

       

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CLion 是 JetBrains 公司开发的一款集成开发环境 (IDE),主要用于 C 和 C++ 编程。在 CLion 中,内联汇编(Inline Assembler)允许开发者在编写 C 或 C++ 代码时直接嵌入汇编指令,以利用硬件级别的性能优化或者处理特定平台特有的低级操作。 以下是使用 CLion 进行内联汇编的一些关键步骤和注意事项: 1. **启用内联汇编支持**:确保你的 CLion 配置支持内联汇编。在“Build, Execution, Deployment”(构建、执行和部署)菜单中,选择“CMake”,然后在生成器的配置中启用对 inline assembly 的支持。 2. **插入汇编代码**:在需要使用内联汇编的地方,通常使用 `asm` 关键字,后跟括号括起的汇编指令。例如: ```cpp int x = 0; asm volatile ("movl %1, %0" : "=r"(x) : "r"(42)); ``` 3. **声明和管理内存**:内联汇编需要手动管理内存,使用 `%` 符号指定寄存器或内存地址。例如,`%eax` 表示 EAX 寄存器,`%edi` 表示 EDI 寄存器,`%esp` 则是栈指针。 4. **调试和检查**:由于内联汇编不被编译器完全理解和跟踪,可能需要使用汇编查看器或者断点来检查执行过程。CLion 提供了一些辅助工具,如 Disassembly view(反汇编视图)。 5. **注意兼容性和限制**:不是所有处理器架构都支持内联汇编,且不同编译器对它的处理方式可能不同。务必确保你的目标平台支持,并在编译时正确设置目标架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值