`
Poechant
  • 浏览: 229493 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24321
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22103
社区版块
存档分类
最新评论

GCC内联汇编(1)Get started

 
阅读更多

GCC内联汇编(1)Get started

  • 作者:柳大·Poechant(钟超)
  • 邮箱:zhongchao.ustc#gmail.com(# -> @)
  • 博客:Blog.CSDN.net/Poechant
  • 日期:July 7th, 2012

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中的内容再放到fooC变量中;
  • "a"(foo)表示这段内联汇编代码开始运行时,fooC变量输入到%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

  1. http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

-

转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant

-

分享到:
评论

相关推荐

    ARM GCC 内联汇编参考手册

    ### ARM GCC 内联汇编参考手册解析 #### 关键知识点概述 本手册主要介绍了如何在C语言中使用GCC提供的内联汇编功能来编写针对ARM架构的代码。内联汇编是一种强大的技术,允许开发者在C代码中插入低级汇编指令,...

    GCC内联汇编入门[参照].pdf

    "GCC内联汇编入门" GCC内联汇编是一种强大的编程技术,可以帮助开发者在C语言中嵌入汇编代码,从而提高程序的执行效率和性能。GCC内联汇编可以分为基本内联汇编和扩展内联汇编两种形式,前者只允许使用汇编语法,后...

    GCC内联汇编入门(中文版)

    GCC内联汇编入门 GCC内联汇编是GCC编译器提供的一种功能强大的特性,它允许开发者在C语言中嵌入汇编代码,从而提高程序的执行效率和性能。本文将详细介绍GCC内联汇编的使用方法和原理。 GCC内联汇编的基本概念 ...

    cpp-ARMGCC内联汇编参考手册中文版

    **标题:“cpp-ARMGCC内联汇编参考手册中文版”** **描述:“ARM GCC 内联汇编参考手册 - 中文版”** 在嵌入式系统开发中,特别是涉及到性能敏感或者硬件直接交互的部分,内联汇编是C/C++编程的一个重要补充。ARM ...

    gcc内联汇编手册

    ### gcc内联汇编手册知识点解析 #### 一、引言与版权许可 - **版权与许可**:本文档由Sandeep S.撰写并享有版权(2003年)。文档遵循GNU通用公共许可协议发布,允许自由再分发与修改。版权许可基于GNU通用公共许可...

    GCC内联汇编, PDF 格式

    ### GCC内联汇编知识点详解 #### 一、GCC内联汇编概述 **GCC内联汇编**是一种特殊的编程技术,允许开发人员在C/C++程序中直接嵌入汇编代码片段。这种方式有助于实现高性能的系统级编程,特别是在需要精确控制硬件...

    GCC内联汇编基础.pdf

    ### GCC内联汇编基础知识点概述 #### 一、内联汇编概念及优势 - **内联汇编**:一种允许程序员在高级语言(如C/C++)中直接嵌入汇编代码的技术,通常用于优化性能关键部分或实现特定硬件功能。 - **内联函数与内联...

    gcc 内联汇编howto

    《GCC内联汇编HOWTO》是一篇详细探讨在GNU Compiler Collection (GCC) 中使用内联汇编技术的教程。内联汇编是C或C++编程中的一种高级技巧,它允许开发者在高级语言代码中嵌入汇编指令,以实现特定的性能优化或访问...

    GCC 内联汇编

    ### GCC 内联汇编详解 #### 一、AT&T与INTEL的汇编语言语法的区别 ##### 1.1 大小写 在汇编语言中,AT&T与INTEL两种格式对于指令的大小写有不同的规定。INTEL格式通常采用大写字母来书写指令,而AT&T格式则使用...

    GCC内联汇编基础[借鉴].pdf

    GCC内联汇编是C/C++编程中的一种高级技术,允许程序员在高级语言代码中直接嵌入汇编指令。这通常用于实现特定硬件优化、访问底层系统功能或解决某些低级问题,例如精确控制内存访问、中断处理等。内联汇编在软件开发...

    GCC内联汇编基础 V2 (修改版)

    ### GCC内联汇编基础详解 #### 一、引言 GCC(GNU Compiler Collection)作为一款功能强大的编译工具集合,支持多种编程语言,并且在系统级编程领域扮演着极其重要的角色。其中,GCC内联汇编是连接高级语言与低级...

    内联汇编2.rar

    1. **内联汇编的基本语法**:了解如何在C++代码中插入汇编语句,如使用`__asm`关键字(在Visual C++中)或`asm`关键字(在GCC中)。 2. **操作码和寄存器**:学习如何使用汇编指令操作处理器的寄存器,如EAX、EBX、...

    GCC的内嵌汇编语法 AT&T汇编语言语法.doc

    基本内联汇编是指在 C 语言中使用 `__asm__` 关键字来嵌入汇编语言代码。例如: ```c void my_function() { __asm__("mov $0x10, %eax"); } ``` Instruction List ---------------- Instruction List 是指在 C ...

    gcc中的内嵌汇编语言.rar

    - **原子操作**:在多线程编程中,内联汇编可以用于创建不可中断的原子操作,确保数据一致性。 - **利用处理器特性**:对于某些特定处理器的特殊功能,如SIMD(单指令多数据)指令,内嵌汇编能直接利用这些特性。 ...

    AT&T汇编语言与GCC内嵌汇编简介.pdf

    ### AT&T汇编语言与GCC内嵌汇编简介 #### AT&T与INTEL汇编语言语法的区别 AT&T汇编语言与INTEL汇编语言在语法上有显著的不同,这些差异对于初学者来说可能会造成一定的混淆。理解这两种语法之间的区别非常重要,...

    AT&T汇编语言与GCC内嵌汇编简介

    ### AT&T汇编语言与GCC内嵌汇编简介 #### 1. AT&T与INTEL的汇编语言语法的区别 AT&T汇编语言与INTEL汇编语言在语法上存在一定的差异,这些差异主要体现在以下几个方面: ##### 1.1 大小写 - **INTEL格式**:指令...

    GCC的内嵌汇编语法

    1. **__asm__关键字**:这是GCC内联汇编的声明关键字,用于告诉编译器接下来的部分是汇编代码。 2. **__volatile__关键字**:这表明内联汇编操作不应被优化掉,即使它看起来没有副作用。在某些情况下,编译器可能会...

    AT&T汇编语言与gcc内嵌汇编简介

    AT&T汇编语言与GCC内嵌汇编是计算机科学领域中重要的组成部分,它们在低级编程和系统级优化中扮演着关键角色。本文旨在深入探讨AT&T汇编语言的特性,以及如何在GCC中利用内嵌汇编技术来增强代码性能。 ### AT&T汇编...

Global site tag (gtag.js) - Google Analytics