内联汇编格式
asm volatile(
"Assembler code";
:outputOperands
:inputOperands
[:Clobbers])
)
Assembler code:汇编代码部分,需要使用“”包括,所有汇编代码必须用双引号括起来,如果多行汇编代码,每一条语句都要用双引号括起来,代码后面加上换行符(“\n"或”\n\t"),具体形式;
outputOperands:输出操作数列表;
inputOperands:输入操作数的列表;
Clobbers:受损坏的部分,“memory”告诉GCC内嵌汇编指令 改变了内存的值,强迫编译器在执行该汇编代码前,存储所有缓存的值,在执行完汇编代码之后重新加载该值,目的是防止编译乱序; “cc”:表示内嵌汇编代码影响状态寄存器相关的标志位。
输出列表和输入列表中的变量按顺序编号,从0开始。
操作数格式
每一个操作数,最多由四部分组成:
[name]"modifier+constraint"(C expression)
name:别名,可选;
modifier:修改符,要用双引号括起来;
constraint:限定符,要用双引号括起来;
c表达式:用小括号括起来;
限定符
操作数在这里的作用是将C语言定义的变量与汇编中使用的变量进行一 一对应,但并不是所有的汇编指令都可以接受任何类型变量,因此汇编器需要知道这些变量到底用在什么地方,传递前做一些转换。常用限定符如下表
限定符 | 含义 |
---|---|
r | 通用寄存器 |
f | 浮点寄存器 |
m | 内存地址 |
修改符
在限定符之前,可选,为空的话,表明该操作数是只读的。
修改符 | 含义 |
---|---|
= | 只写操作数,一般用于输出操作数 |
+ | 可读可写 |
& | 寄存器只能用于输出 |
修改寄存器列表
类型 | 作用 |
---|---|
r0…r15 | 告诉编译器汇编代码中修改了通用寄存器r0…r15 |
cc | 告诉编译器汇编代码会导致CPU状态位的改变 |
memory | 告诉编译器汇编代码会读取或修改内存中某个地址存放的值 |
“memory”告诉GCC内嵌汇编指令 改变了内存的值,强迫编译器在执行该汇编代码前,存储所有缓存的值,在执行完汇编代码之后重新加载该值,目的是防止编译乱序; “cc”:表示内嵌汇编代码影响状态寄存器相关的标志位。