首页 > 编程语言 >16 同步与互斥(二) 内联汇编

16 同步与互斥(二) 内联汇编

时间:2023-04-02 16:46:03浏览次数:52  
标签:fp 汇编 16 int sum 互斥 add 寄存器 内联

汇编参考
GCC工具链使用

1 引入

内联汇编即在C函数中使用汇编去实现某些功能。

为什么需要在C代码中引入汇编?

  • C语言在大多数的时候效率都很高,但在某些情况下直接使用汇编效率会更加高效
  • 部分功能通过C语言很难实现,这部分代码就需要使用汇编去实现(实现某些功能

在C文件中使用汇编存在两种方法

  • .s文件去实现某个功能函数,在C文件中去调用(缺点:需要另外建一个文件)
  • 在C文件中直接使用汇编代码去实现

1.1 示例

1.1.1 C语言实现add

通过C语言实现add

#include <stdio.h>

int add(int a, int b)
{
    return a + b;
}

int main(int argc, char **argv)
{
    int a = 1;
    int b = 2;
    int sum;

    sum = add(a, b);

    printf("sum:%d\n", sum);
    return 0;
}

arm-linux-objdump -D test > test.dis

00010410 <add>:
   10410:       e52db004        push    {fp}            ; (str fp, [sp, #-4]!)
   10414:       e28db000        add     fp, sp, #0
   10418:       e24dd00c        sub     sp, sp, #12
   1041c:       e50b0008        str     r0, [fp, #-8]
   10420:       e50b100c        str     r1, [fp, #-12]
   10424:       e51b2008        ldr     r2, [fp, #-8]
   10428:       e51b300c        ldr     r3, [fp, #-12]
   1042c:       e0823003        add     r3, r2, r3			//这句实现add
   10430:       e1a00003        mov     r0, r3
   10434:       e28bd000        add     sp, fp, #0
   10438:       e49db004        pop     {fp}            ; (ldr fp, [sp], #4)
   1043c:       e12fff1e        bx      lr

通过反汇编文件中add信息可以看出add函数有很多操作入栈,出栈的操作所以效率并不是极致的

2 内联汇编语法

  • asm

    一般写作__asm__,表示这是一段内联汇编

  • asm-qualifiers

    存在三个值:volatile(常用)、inline、goto

  • AssmblerTemplate

    汇编指令。用""双引号包含,用\n分开

    "mov %0, %1\n"
    
  • OutputOperands

    输出结果保存在这里

    格式:

    [ [asmSymbolicName] ] constraint (cvariablename)

    • asmSymbolicName

      可以不写

    • constraint

      表示约束

      常用值

      constraint 描述
      m memory operand,表示传入的地址,需要CPU支持的地址
      r register operand,使用这个寄存器保存
      i immediate integer operand,传入一个立即数

      数据修饰

      constraint Modifier Characters 描述
      = 内联汇编会去修改;即写
      + 即能读能写
      & earlyclobber;gcc尚未使用完全部的输入操作数时,就产生了某些输出操作

      关于earlyclobber(&)

      在内联汇编中没有指定使用的具体寄存器。这会导致某个寄存器会被反复使用,前面使用过此寄存器保存的值,会因为后面再次使用而被修改

      此时使用earlyclobber(&)则是告诉编译器对于某个操作它所使用的寄存器不能跟其他操作数共用寄存器

      示例

      "=&r"(sum)

      %0的操作不能和其他%1%2等共用寄存器

    • cvariablename

      变量名;为输出指定一个C左值

    • 示例.

      "=r" (sum)

      汇编中会将r寄存器中的值写入sum变量

  • InputOperands

    格式(基本与OutputOperands相同):

    [ [asmSymbolicName] ] constraint (cexpression)

    • cexpression

      这里是表达式

    • 示例

      "r"(a), "r"(b)

      a放入某个寄存器r,将b放入某个寄存器r;可以使用%0%1调用

  • Clobbers

    声明汇编中会修改的事件(寄存器,内存)

    Clobbers 描述
    cc 表示汇编代码会修改寄存器
    memory 表示汇编代码除开InputOperands和OutputOperands外还会操作内存

OutputOperands和InputOperands引用

:后开始依次为%0 %1 %2 ...

3 内联汇编实现add

int add(int a, int b)
{
    int sum;

    __asm__ volatile (
        "add %0, %1, %2"
        :"=&r"(sum)
        :"r"(a), "r"(b)
        :"cc"
    );

    return sum;
}

没使用&

1042c:       e0833002        add     r3, r3, r2

使用&

1042c:       e0823001        add     r3, r2, r1

标签:fp,汇编,16,int,sum,互斥,add,寄存器,内联
From: https://www.cnblogs.com/burnk/p/17280723.html

相关文章

  • 160. 相交链表
    160.相交链表给你两个单链表的头节点 headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。自定义评测:......
  • python从入门到实践第16章 下载数据1
    第一步获取csv格式文件需要python爬虫的相关知识 第二步 先打印第一行观察标签importcsvfilename='data/sitka_weather_2014.csv'withopen(filename)asf:reader=csv.reader(f)header_row=next(reader)print(header_row)['AKST','MaxTempe......
  • c++ primer chapter 16.4
    /*#include<iostream>#include<string>#include<vector>#include<list>usingnamespacestd;template<typenameI,typenameT>Ifind(Ib,Ie,constT&v){while(b!=e&&*b!=v){b++;returnb;}}i......
  • 202031607221-王彦润 实验一 软件工程准备—博客园技巧与博客首秀
    1、项目和内容简介项目内容班级博客链接2023年春软件工程本次作业要求链接实验一我的课程学习目标注册博客园和Github账号,学习使用博客园,了解Github的基本操作本次作业在哪些方面帮我实现学习目标1.初步了解博客园软件和Github的基本操作;初步了解学......
  • 202031603143-郭思彤 实验一 软件工程准备-对软件工程的初步了解
    项目内容班级博客链接20级卓越班本次作业要求链接实验一软件工程准备我的课程学习目标1.深入使用博客园进行学习2.了解Github的基本操作3.拓展关于软件工程的知识本次作业在哪些方面帮我实现学习目标1.学会了使用markdown编辑器的基本操作2.通过提问......
  • 202031607128-张政文 实验一 软件工程准备
    1、项目和内容简介项目内容班级博客链接2023年春软件工程(2020级计算机科学与技术)(西北师范大学-计算机科学与工程学院)本次作业要求链接实验一软件工程准备我的课程学习目标注册博客园和Github账号,学习使用博客园,了解Github的基本操作。本次作业在哪些......
  • 202031607230-王格 实验一 软件工程准备--构建之法与博客首秀
    实验一软件工程准备项目内容班级博客链接2023年春软件工程本次作业要求链接实验一软件工程准备我的课程学习目标1.学习博客园软件开发者学习社区使用技巧和经验。2.了解Github工具的基本操作3.阅读《现代软件工程—构建之法》,深入了解什么是软件工程......
  • 202031607327-杨辽辽 实验一 软件工程准备 初步了解软件工程
    202031607327-杨辽辽实验一软件工程准备初步了解软件工程项目内容班级博客链接20级卓越班本次作业要求链接实验一软件工程准备我的课程学习目标1.学习博客园软件开发者学习社区使用技巧和经验;2.了解Github的基本操作;本次作业在哪些方面帮我实现学习......
  • 1688用图片精准查找商品?
       今天CC来和小伙伴唠唠识图找物的这个话题。相信很多购物爱好者也好,电商狂人也好,对这个话题并不会感觉到陌生。因为随着很多电商平台的迭代更新,也是很多的平台都有这个功能,它可以帮助我们快速查找到我们无法辨别或者叫不上名字的商品,极大减少了我们通过搜索筛选的时间。但......
  • 202031607323-后涌- 实验一 软件工程准备—什么是软件?什么是工程?
    项目内容班级博客链接班级链接本次作业要求链接作业要求我的课程学习目标了解掌握软件在开发过程中的过程、方法和工具本次作业在哪些方面帮我实现学习目标准备学习软件工程的工具任务1:调查问卷在以下网址提交课程调查问卷完成情况:已认真填写并提......