基本写法
寄存器
在寄存器前要加%
e.g %1
操作数顺序
左边是源,右边是目的
e.g. movl %1, %2
立即数
立即数前加
e.g.movl
0x04, %1
data = 0x04
movl $data, %1
意味着将立即数04h装入寄存器1
符号常数
直接引用
e.g. value = .long 0x12a
movl value, %1
将常数0x12a装入寄存器1
引用符号地址在符号前加符号 $
e.g. movl $value也就是将value的地址装入寄存器1
操作数的长度
操作数的长度用加在指令后的符号表示,b(byte,8-bits),w(word,16-bits),l(long,32-bits)
e.g. movb %1, %2
内存引用
displacement(base, index, scale)
base, index为任意的32-bits base和index寄存器
scale可以取值1,2,4,8,如果不指定scale值,默认值为1
e.g. -4(%1)
GCC内联ASM
将汇编嵌入到GCC中
以下内容转载自百度文库
1.基本内联汇编
e.g.
基本内联汇编的格式是
当在”Instruction List”中有多条指令的时候,你可以在一对引号中列出全部指令,也可以
将一条或几条指令放在一对引号中,所有指令放在多对引号中。如果是前者,你可以将每一
条指令放在一行,如果要将多条指令放在一行,则必须用分号(;)或换行符(\n,大多数
情况下\n 后还要跟一个\t,其中\n 是为了换行,\t 是为了空出一个tab 宽度的空格)将它们
分开。
2.带有C/C++表达式的内联汇编
GCC 允许你通过C/C++表达式指定内联汇编中”Instrcuction List”中指令的输入和输出,
你甚至可以不关心到底使用哪个寄存器被使用,完全靠GCC 来安排和指定。这一点可以让
程序员避免去考虑有限的寄存器的使用,也可以提高目标代码的效率。
带有C/C++表达式的内联汇编格式为:
补充:转载自ibm
ok~好像差不多了~阅读源代码估计没有障碍了吧~(不是flag,不是flag,不是flag)