GCC内联汇编(1)Get started
1. Intel vs. AT&T
其实并不是要说 Intel 和 AT&T PK 的故事,哈哈。因为首先要熟悉 Intel syntax 的汇编指令写法和 AT&T syntax 汇编指令的写法,所以看下表:
+------------------------------+------------------------------------+
| Intel Code | AT&T Code |
+------------------------------+------------------------------------+
| mov eax,1 | movl $1,%eax |
| mov ebx,0ffh | movl $0xff,%ebx |
| int 80h | int $0x80 |
| mov ebx, eax | movl %eax, %ebx |
| mov eax,[ecx] | movl (%ecx),%eax |
| mov eax,[ebx+3] | movl 3(%ebx),%eax |
| mov eax,[ebx+20h] | movl 0x20(%ebx),%eax |
| add eax,[ebx+ecx*2h] | addl (%ebx,%ecx,0x2),%eax |
| lea eax,[ebx+ecx] | leal (%ebx,%ecx),%eax |
| sub eax,[ebx+ecx*4h-20h] | subl -0x20(%ebx,%ecx,0x4),%eax |
+------------------------------+------------------------------------+
2. 示例
看一个用内联汇编写的例子,计算两数的和:
#include <stdio.h>
int main(void) {
int foo = 10, bar = 15;
__asm__ __volatile__ (
"addl %%ebx, %%eax"
:"=a"(foo)
:"a"(foo), "b"(bar)
:"%eax"
);
printf("foo + bar = %d\n", foo);
return 0;
}
该程序作如下解释:
-
__asm__
用于表示这是一个内联汇编代码段;
- 如果使用了
__volatile
修饰符,则这段内联汇编代码不会被编译器优化掉,但是如果只是做简单的计算,不会产生任何可能的 side effects,则最好不要加这个修饰符,这样可以使编译器帮助我们优化代码;
-
"=a"(foo)"
表示这段内联汇编代码运行结束后,输出结果放在寄存器%eax
中,然后%eax
中的内容再放到foo
C变量中;
-
"a"(foo)
表示这段内联汇编代码开始运行时,foo
C变量输入到%eax
寄存器中,多个输入值可以用上面示例中的方式表达。
- 以冒号开始的那两行,其实都是“约束”,这个是
constraint
的直译,其实你可以理解为边界条件,即输入输出条件。
- 最后一个冒号开始的行,是告诉编译器,哪些寄存器的值会在内联汇编代码的运行过程中被篡改,因此不要使用这些寄存器去保存值。这里就是
%eax
的值会被篡改的意思。
3. 寄存器缩写
+---+--------------------+
| r | Register(s) |
+---+--------------------+
| a | %eax, %ax, %al |
| b | %ebx, %bx, %bl |
| c | %ecx, %cx, %cl |
| d | %edx, %dx, %dl |
| S | %esi, %si |
| D | %edi, %di |
+---+--------------------+
Reference
- http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
-
转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant
-
分享到:
相关推荐
### ARM GCC 内联汇编参考手册解析 #### 关键知识点概述 本手册主要介绍了如何在C语言中使用GCC提供的内联汇编功能来编写针对ARM架构的代码。内联汇编是一种强大的技术,允许开发者在C代码中插入低级汇编指令,...
"GCC内联汇编入门" GCC内联汇编是一种强大的编程技术,可以帮助开发者在C语言中嵌入汇编代码,从而提高程序的执行效率和性能。GCC内联汇编可以分为基本内联汇编和扩展内联汇编两种形式,前者只允许使用汇编语法,后...
GCC内联汇编入门 GCC内联汇编是GCC编译器提供的一种功能强大的特性,它允许开发者在C语言中嵌入汇编代码,从而提高程序的执行效率和性能。本文将详细介绍GCC内联汇编的使用方法和原理。 GCC内联汇编的基本概念 ...
**标题:“cpp-ARMGCC内联汇编参考手册中文版”** **描述:“ARM GCC 内联汇编参考手册 - 中文版”** 在嵌入式系统开发中,特别是涉及到性能敏感或者硬件直接交互的部分,内联汇编是C/C++编程的一个重要补充。ARM ...
### gcc内联汇编手册知识点解析 #### 一、引言与版权许可 - **版权与许可**:本文档由Sandeep S.撰写并享有版权(2003年)。文档遵循GNU通用公共许可协议发布,允许自由再分发与修改。版权许可基于GNU通用公共许可...
### GCC内联汇编知识点详解 #### 一、GCC内联汇编概述 **GCC内联汇编**是一种特殊的编程技术,允许开发人员在C/C++程序中直接嵌入汇编代码片段。这种方式有助于实现高性能的系统级编程,特别是在需要精确控制硬件...
### GCC内联汇编基础知识点概述 #### 一、内联汇编概念及优势 - **内联汇编**:一种允许程序员在高级语言(如C/C++)中直接嵌入汇编代码的技术,通常用于优化性能关键部分或实现特定硬件功能。 - **内联函数与内联...
《GCC内联汇编HOWTO》是一篇详细探讨在GNU Compiler Collection (GCC) 中使用内联汇编技术的教程。内联汇编是C或C++编程中的一种高级技巧,它允许开发者在高级语言代码中嵌入汇编指令,以实现特定的性能优化或访问...
### GCC 内联汇编详解 #### 一、AT&T与INTEL的汇编语言语法的区别 ##### 1.1 大小写 在汇编语言中,AT&T与INTEL两种格式对于指令的大小写有不同的规定。INTEL格式通常采用大写字母来书写指令,而AT&T格式则使用...
GCC内联汇编是C/C++编程中的一种高级技术,允许程序员在高级语言代码中直接嵌入汇编指令。这通常用于实现特定硬件优化、访问底层系统功能或解决某些低级问题,例如精确控制内存访问、中断处理等。内联汇编在软件开发...
### GCC内联汇编基础详解 #### 一、引言 GCC(GNU Compiler Collection)作为一款功能强大的编译工具集合,支持多种编程语言,并且在系统级编程领域扮演着极其重要的角色。其中,GCC内联汇编是连接高级语言与低级...
1. **内联汇编的基本语法**:了解如何在C++代码中插入汇编语句,如使用`__asm`关键字(在Visual C++中)或`asm`关键字(在GCC中)。 2. **操作码和寄存器**:学习如何使用汇编指令操作处理器的寄存器,如EAX、EBX、...
基本内联汇编是指在 C 语言中使用 `__asm__` 关键字来嵌入汇编语言代码。例如: ```c void my_function() { __asm__("mov $0x10, %eax"); } ``` Instruction List ---------------- Instruction List 是指在 C ...
- **原子操作**:在多线程编程中,内联汇编可以用于创建不可中断的原子操作,确保数据一致性。 - **利用处理器特性**:对于某些特定处理器的特殊功能,如SIMD(单指令多数据)指令,内嵌汇编能直接利用这些特性。 ...
### AT&T汇编语言与GCC内嵌汇编简介 #### AT&T与INTEL汇编语言语法的区别 AT&T汇编语言与INTEL汇编语言在语法上有显著的不同,这些差异对于初学者来说可能会造成一定的混淆。理解这两种语法之间的区别非常重要,...
### AT&T汇编语言与GCC内嵌汇编简介 #### 1. AT&T与INTEL的汇编语言语法的区别 AT&T汇编语言与INTEL汇编语言在语法上存在一定的差异,这些差异主要体现在以下几个方面: ##### 1.1 大小写 - **INTEL格式**:指令...
1. **__asm__关键字**:这是GCC内联汇编的声明关键字,用于告诉编译器接下来的部分是汇编代码。 2. **__volatile__关键字**:这表明内联汇编操作不应被优化掉,即使它看起来没有副作用。在某些情况下,编译器可能会...
AT&T汇编语言与GCC内嵌汇编是计算机科学领域中重要的组成部分,它们在低级编程和系统级优化中扮演着关键角色。本文旨在深入探讨AT&T汇编语言的特性,以及如何在GCC中利用内嵌汇编技术来增强代码性能。 ### AT&T汇编...