`
Ydoing
  • 浏览: 105983 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

内联汇编使用简介

 
阅读更多

用3个实例实现将变量a和变量b相乘,得到的值存在result中.

简单实例

asm表示使用内联汇编, volatile表示不对内联汇编进行优化,避免造成误删.

#include<stdio.h>

int a = 10;
int b = 20;
int result;

int main(){
    __asm__ __volatile__(
        "movl a, %eax\n\t"
        "movl b, %ebx\n\t"
        "imull %ebx, %eax\n\t"
        "movl %eax, result\n\t"
        );
    printf("the answer is %d\n", result);
    return 0;
}

在简单实例中,内联汇编只能使用C语言中的全局变量,其次寄存器和C语言中的变量不能进行交互传值.

扩展asm

为了解决以上实例中的局限性,提供了扩展的asm

__asm__("asm statements" : outputs : inputs : registers-modified);

其中outputs和inputs格式为:

"constraints" (variable)
约束 描述
“m”、”v”、”o” 内存单元
“r” 任何寄存器
“q” 寄存器eax、ebx、ecx、edx之一
“i”、”h” 直接操作数
“E”和”F” 浮点数
“g” 任意
“a”、”b”、”c”、”d” 分别表示寄存器eax、ebx、ecx和edx
“S”和”D” 寄存器esi、edi
“I” 常数(0至31)

实例

#include<stdio.h>

int main(){
    int data1 = 10;
    int data2 = 20;
    int result;

    __asm__ __volatile__(
        "imull %%ebx, %%eax\n\t"
        "movl %%ecx, %%eax"
        : "=a"(result)
        : "d"(data1), "c"(data2)
        );
    printf("the answer is %d\n", result);
    return 0;
}

在扩展asm中,引用寄存器要用”%%”. “=”表示写入操作数.在这里是指将eax寄存器的值写入到result中.

使用占位符

可以将寄存器出现的顺序从0开始编号,比如%0和%1等,这个编号称为占位符.

#include<stdio.h>

int main(){
    int data1 = 10;
    int data2 = 20;
    int result;

    __asm__ __volatile__(
        "imull %1, %2\n\t"
        "movl %2, %0"
        : "=r"(result)
        : "r"(data1), "r"(data2)
        );
    printf("the answer is %d\n", result);
    return 0;
}
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    ARM GCC 内联汇编参考手册

    - **使用内联汇编作为预处理宏**:有时可以将内联汇编代码封装在预处理宏中,以简化其使用。 - **C桩函数**:可以使用C桩函数来隔离内联汇编代码,这有助于提高代码的可维护性和可读性。 - **替换C变量的符号名**:...

    在Visual_C++中使用内联汇编

    ### 在Visual C++中使用内联汇编:深入解析与应用 #### 一、内联汇编概述 在计算机编程领域,特别是在C/C++中,内联汇编是一种特殊的编程技术,它允许开发者直接在高级语言中嵌入汇编语言代码。这种方式的主要优势...

    asm.rar_vb.net 内联汇编_内联汇编插件

    例如,如果在VB.NET中需要进行大量的浮点运算,使用内联汇编可能能显著提升性能,因为汇编可以直接操作CPU的浮点单元,而无需通过.NET Framework的抽象层。 在VB.NET中使用内联汇编通常涉及以下几个步骤: 1. 引入`...

    VC内联汇编资料 VC内联汇编资料

    在编写内联汇编时,应谨慎使用,因为它可能导致内存管理问题和安全漏洞。理解汇编的副作用和约束是避免这类问题的关键。 总结来说,VC内联汇编是一种强大的工具,它为开发者提供了直接操纵硬件的能力,但也带来了可...

    在 Visual C++ 中使用内联汇编

    在Visual C++中使用内联汇编是一种高级编程技术,它允许程序员在C/C++代码中直接嵌入汇编指令,从而实现更底层的控制和优化。以下是对该主题的详细解析,涵盖其优势、使用场景、关键字及具体用法等。 ### 一、内联...

    内联汇编2.rar

    4. VC内联汇编示例代码:这可能是一个包含了使用Visual C++(VC)编译器的内联汇编代码的文件,展示了如何在C++项目中使用内联汇编。 通过这些文件,我们可以学习到以下内联汇编的相关知识点: 1. **内联汇编的...

    易语言置入代码内联汇编源码

    "易语言置入代码内联汇编源码"指的是在易语言程序中嵌入汇编语言代码,以便在需要高效计算或者底层操作时使用。这种方式允许程序员结合易语言的高级语法和汇编语言的低级控制能力,实现更优化的程序性能。 汇编语言...

    2022年在Visual C++中使用内联汇编C语言教程.docx

    Visual C++中使用内联汇编C语言教程 在 Visual C++ 中使用内联汇编 C 语言教程可以使开发者更方便地使用汇编语言编写函数、提高代码的执行速度、访问硬件等。内联汇编主要用于以下几种场景: 1. 使用汇编语言编写...

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

    本文将详细介绍GCC内联汇编的使用方法和原理。 GCC内联汇编的基本概念 GCC内联汇编是一种基本的内联汇编形式,它允许开发者在C语言中嵌入汇编代码。基本内联汇编的语法格式如下: ```asm("assembly code"); ``` ...

    C++内联汇编示例

    本工程通过一系列示例,展示了如何在C++程序中使用内联汇编来实现函数调用、参数传递、循环以及条件判断。 首先,我们来看"Less1"这个示例。在这个例子中,开发者可能用内联汇编来演示如何手动管理函数调用的过程。...

    易语言置入代码内联汇编

    在易语言中,内联汇编的使用使得程序能够直接与机器语言交互,执行一些高级语言难以完成的操作。这使得易语言不再局限于高级语言的范畴,而是能够进行更精细、更高效的操作。 在易语言程序中置入内联汇编代码,通常...

    IBM内联汇编指导

    IBM内联汇编指导主要介绍的是如何使用IBM XLC/C++编译器在IBM z系统Linux平台上进行内联汇编编程,以提升应用程序性能。在文章中,作者Anh Tuyen Tran提供了对内联汇编基础知识的深入讲解,并指出了该技术的优势和...

    易语言学习-WonderWall内联汇编支持库(11-28).zip

    在易语言学习-WonderWall内联汇编支持库(11-28)的压缩包中,可能包含了一系列教程、示例代码、文档等资源,涵盖了从基础到进阶的内联汇编使用方法。这些资料将引导学习者逐步了解和掌握如何在易语言中插入汇编代码...

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

    GCC内联汇编可以分为基本内联汇编和扩展内联汇编两种形式,前者只允许使用汇编语法,后者则可以使用更多的特性,如输入、输出和寄存器约束等。 在学习GCC内联汇编之前,需要具备基本的x86汇编语言和C语言知识。GCC...

    在Visual C++中使用内联汇编

    在Visual C++编程环境中,内联汇编是一种技术,它允许程序员在C或C++代码中直接嵌入汇编语言指令。这种方式对于处理特定性能关键的任务、直接访问硬件或者实现...只有在这些方法无法满足需求时,才考虑使用内联汇编。

    x86平台转x64平台关于内联汇编不再支持的解决

    x86平台转x64平台关于内联汇编不再支持的解决 1. 内联汇编的概念:内联汇编是指在C/C++代码中嵌入汇编代码,以提高性能和速度。在x86平台下,可以轻松地在C/C++代码中嵌入汇编代码,使用“__asm{}”语法。 2. x86...

    vc内联汇编示例代码.zip.rar_VC 汇编_内联汇编

    vc内联汇编示例代码,介绍了VC++的一些被封装的汇编代码,有愿意深入了解VC++的人请进

    内联汇编简述

    在"在 Visual C++ 中使用内联汇编.doc"、"在 Visual C++ 中使用内联汇编.pdf"和"在 Visual C++ 中使用内联汇编.txt"这三份文档中,可能详细介绍了如何在Visual C++环境下编写和使用内联汇编代码,包括具体的语法示例...

Global site tag (gtag.js) - Google Analytics