zoukankan      html  css  js  c++  java
  • 内联汇编使用简单介绍

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

    简单实例

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

    #include<stdio.h>
    
    int a = 10;
    int b = 20;
    int result;
    
    int main(){
        __asm__ __volatile__(
            "movl a, %eax
    	"
            "movl b, %ebx
    	"
            "imull %ebx, %eax
    	"
            "movl %eax, result
    	"
            );
        printf("the answer is %d
    ", 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
    	"
            "movl %%ecx, %%eax"
            : "=a"(result)
            : "d"(data1), "c"(data2)
            );
        printf("the answer is %d
    ", 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
    	"
            "movl %2, %0"
            : "=r"(result)
            : "r"(data1), "r"(data2)
            );
        printf("the answer is %d
    ", result);
        return 0;
    }
  • 相关阅读:
    更换Ubuntu源为国内源的操作记录
    Dockerfile构建容器镜像
    Nginx负载均衡中后端节点服务器健康检查
    Linux系统下CPU使用(load average)梳理
    android:怎么实现一个控件与另一个指定控件左对齐
    Android Studio一直 Fetching Documentation...
    px、pt、ppi、dpi、dp、sp之间的关系
    Android中如何在代码中设置View的宽和高?
    硬中断与软中断的区别!
    Java 日期时间获取和显示
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5156784.html
Copyright © 2011-2022 走看看