[学习资料] gcc 内联汇编

[复制链接]
842|4
 楼主| 中国龙芯CDX 发表于 2023-12-27 09:00 | 显示全部楼层 |阅读模式

内联汇编即在C中直接使用汇编语句进行编程,使程序可以在C程序中实现C语言不能完成的一些工作,例如,在下面几种情况中必须使用内联汇编或嵌入型汇编。

程序中使用饱和算术运算(Saturating Arithmetic)
程序需要对协处理器进行操作
在C程序中完成对程序状态寄存器的操作
格式:
  1. __asm__ __volatile__("asm code"
  2. :output
  3. :input
  4. :changed registers);

asm或__asm__开头,小括号+分号,括号内容写汇编指令。指令+\n\t 用双引号引上。

参数
「asm code」主要填写汇编代码:


  1. "mov r0, r0\n\t"
  2. "mov r1,r1\n\t"
  3. "mov r2,r2"

「output(asm->C)」用于定义输出的参数,通常只能是变量:

  1. :"constraint" (variable)
  2. "constraint"用于定义variable的存放位置:
  3. r 表示使用任何可用的寄存器
  4. m 表示使用变量的内存地址
  5. + 可读可写
  6. = 只写
  7. & 表示该输出操作数不能使用输入部分使用过的寄存器,只能用"+&"或"=&"的方式使用

「input(C->asm)」用于定义输入的参数,可以是变量也可以是立即数:

  1. :"constraint" (variable/immediate)
  2. "constraint"用于定义variable的存放位置:
  3. r 表示使用任何可用的寄存器(立即数和变量都可以)
  4. m 表示使用变量的内存地址
  5. i 表示使用立即数

Note:

1、使用__asm__和__volatile__表示编译器将不检查后面的内容,而是直接交给汇编器。
2、如果希望编译器为你优化,__volatile__可以不加
3、没有asm code也不能省略""
4、没有前面的和中间的部分,不可以相应的省略:
5、没有changed 部分,必须相应的省略:
6、最后的;不能省略,对于C语言来说这是一条语句
7、汇编代码必须放在一个字符串内,且字符串中间不能直接按回车换行,可以写成多个字符串,注意中间不能有任何符号,这样就会将两个字符串合并为一个
8、指令之间必须要换行,还可以使用\t使指令在汇编中保持整齐

自己的灌饼 发表于 2023-12-27 09:13 | 显示全部楼层
这种形式的写法是不是适用于所有的单片机的写法?
AdaMaYun 发表于 2023-12-28 17:53 | 显示全部楼层
内联汇编即在C中直接使用汇编语句进行编程
亚瑟 发表于 2023-12-29 09:48 来自手机 | 显示全部楼层
这样可以直接在重要地方汇编操作吗
jflahdink09 发表于 2023-12-29 11:41 | 显示全部楼层
这个操作还是很方便的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

339

主题

2677

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部