文档介绍:GCC内联汇编基础
疯狂代码/ ĵ:http://assembler/
这篇文章阐述内联汇编使用思路方法显然阅读这篇文章您需要具备X86汇编语言和C语言基础知识
Contents
1. 介绍 3
2. 概要 3
3. GCC汇编格式 3
1) 源操作数和目操作数方向 3
2) 寄存器命名 4
3) 立即数 4
4) 操作数大小 4
5) 内存操作数 4
4. 基本形式内联汇编 4
5. 扩展形式内联汇编 5
汇编模板 6
操作数 6
Clobber List 7
Volatile…? 8
6. 深入constras 8
常用constras 8
constra修改标记 10
10
13
9. 参考文献 13
1. 介绍
[主要是版权/反馈/勘误/感谢等信息没有翻译--译者注, 本文中方括号中都是译者注]
2. 概要
内联汇编那么内联汇编到底是什么?
[我们首先先来看看内联有什么好处]
我们可以让编译器将代码插入到者代码中指出在代码中具体什么位置被执行这种就是内联内联似乎很像个宏
?确他们的间有很多相似的处
那么内联到底有什么好处呢?
内联降低了开销[不仅仅节省堆栈] 如果某些实参相同那么返回值定是相同这就可能给编译器留下了简化空间返
回值相同了就不必把内联代码插入到者代码中[直接用这个返回值替换就好了]这样可以减少代码量视区别情况而
定声明个是内联使用关键字 inline
现在我们回到内联汇编上来内联汇编就是些汇编语句写成内联它方便快速对系统编程非常有用我们主要目标是
内联基础格式和使用思路方法声明个内联汇编我们使用关键字 asm
内联汇编重要性首先体现在它操作C语言变量和输出值到C语言变量能力由于这些特性内联汇编常被用作汇编指
令和它C的间接口
3. GCC汇编格式
GCC (piler for Linux) 使用AT&T &T汇编格式来写代码如果你不熟
悉AT&T汇编语法也没有关系下面将有介绍AT&T和Intel汇编语法有很多区别的处我将给出主要区别点
1) 源操作数和目操作数方向
AT&T和Intel汇编语法相反Intel语法中第个操作数作为目操作数第 2个操作数作为源操作数相反在AT&T语法中
第个操作数是源操作数第 2个是目操作数例如:
Intel语法: "OP-code dst src"
AT&T语法: "Op-code src dst"
2) 寄存器命名
[在AT&T语法中] 寄存器名字加上%前缀例如如果要使用eax, 写作: %eax.
3) 立即数
AT&T语法中立即数以'$'符号作为前缀静态C变量前也要加上'$'前缀在Intel语法中,16进制常数加上'h'后缀但是
在AT&T中,常量前要加上'0x' 对于个16进制常数(在AT&T中)首先以$开头接着是0x,最后是常数
4) 操作数大小
在AT&T语法中操作数占内存大小决定于汇编命令操作符最后个内容操作符以'b', 'w'和'l'为后缀指明内存访问
长度是(8-bit), word(16-bit)还是long(32-bit). 而Intel语法在操作数前加上' ptr', 'word ptr'和'dword ptr'内
存操作数(这个操作数不是汇编命令操作符)来达到相同目.
因此, Intel "mov al, ptr foo" 用AT&T语法就是:"movb foo, %al"
5) 内存操作数
在Intel语法中基址寄存器用'['和']'扩起来但是在AT&T中改用'('和')' 此外在Intel语法中个间接内存寻址:
section:[base + index * scale + disp]在AT&T中则为:
section:disp(base, index, scale)
总是需要记住点就是当个常数被用作disp或者scale时就不用加'$'前缀
现在我们已经提到了AT&T和Intel语法些主要区别点我只是提到了小部分全部内容可以参考GNU汇编文档为了
更好理解这些区别请看下面例子:
Intel Code AT&T Code
mov eax,1 movl $1, %eax
mov ebx,0ffh movl $0x0ff,%ebx,
80h $0x80