MIPS内联汇编

0X0

近几天使用内联汇编来完成部分功能,下面总结下基础知识点,以便以后查询

语法基本结构

	__asm__ __volatile__("汇编语句\n\t""汇编语句\n\t":输出寄存器:输入寄存器:寄存器破坏表);

‘:’把内联汇编分割为了4个部分

  • 第一部分

    如上的第二、第三行,这里可以填写若干条汇编指令

  • 第二部分

    如上的第四行,在这里对输出寄存器进行描述

  • 第三部分

    如上的第五行,在这里对输入寄存器进行描述

  • 第四部分

    如上的第六行,

如果有输入没有输出第五行的‘:’是必不可少的,是格式的一部分,第六行的‘:’可以省略
如果没有输出和输入的话’:'可以省略

寄存器修饰

修饰说明
=该寄存器只写的
+该寄存器是读写的
&该寄存器不能被再用作输入寄存器
r通用寄存器
f浮点寄存器
moffset为有符号12bit内存地址
ZCoffset为有符号16bit,4字节对齐地址
ZBoffset为0的地址

实例

  • 例1

    	int a=2,b=1,c=0;__asm__ __volatile__("addu %0, %1, %2\n\t":"=r"(c):"r"(a),"r"(b));printf("%d \n", c);
    

    MIPS 无符号32位加法指令的格式为ADDU rd, rs, rt,计算rs+rt=rd,所以rd是输出寄存器,rs、rt为输出寄存器

    • 第三行使用%+数字来进行占位,然后在第二、第三部分对寄存器进行描述,并与C语言变量关联起来

    • 第四行"=r"( c ) 是对%0的修饰,表示%0 操作数是一个通用寄存器,只写,“写的值放到变量c”

    • 第五行"r"(a),“r”(b),表示%1、%2操作数是通用寄存器,寄存器的值使用变量a、b的值

    对这段代码反汇编:

     ;-- main:;-- section..text:;-- .text:;-- _ftext:0x1200008d0      f0ffbd67       daddiu sp, sp, -0x10       ; [11] -r-x section size 608 named .text0x1200008d4      0000bcff       sd gp, (sp)0x1200008d8      02001c3c       lui gp, 20x1200008dc      c0839c67       daddiu gp, gp, -0x7c400x1200008e0      0800bfff       sd ra, 8(sp)0x1200008e4      2de09903       daddu gp, gp, t90x1200008e8      02000524       addiu a1, zero, 20x1200008ec      01000224       addiu v0, zero, 10x1200008f0      2128a200       addu a1, a1, v00x1200008f4      488084df       ld a0, -segment.LOAD0(gp)  ; [0x120010cd8:8]=0x120000000 segment.ehdr0x1200008f8      988099df       ld t9, -sym._MIPS_STUBS(gp) ; [0x120010d28:8]=0x120000b30 sym.imp.printf0x1200008fc      09f82003       jalr t90x120000900      900b8464       daddiu a0, a0, 0xb900x120000904      0800bfdf       ld ra, 8(sp)0x120000908      0000bcdf       ld gp, (sp)0x12000090c      25100000       move v0, zero0x120000910      0800e003       jr ra0x120000914      1000bd67       daddiu sp, sp, 0x100x120000918      00000000       nop0x12000091c      00000000       nop

    可以看到在第11~13行

    addiu a1, zero, 2 把2装到a1寄存器

    addiu v0, zero, 1把1装到v0寄存器

    addu a1, a1, v0把1+2结果放到a1寄存器

  • 例2

    在汇编语句比较多时,再使用%+数字的方式来表示就容易混乱

        int ret = 0;int arg;__asm__ __volatile__ ("cpucfg %[var], %[index]":[var]"=r"(ret):[index]"r"(arg):);
    

    使用%[]来占位,中括号中可以填一个字符串

    这样在汇编语句多时要方便些

  • 例3

    在遇到某些汇编指令编译器不支持时可以使用二进制编码

    	int a=0;__asm__ __volatile__(".insn \n\t"".word (0b1011100100000110010010000100) \n\t":"+r"(a):);	
    

在C语言定义变量时也可以指定变量放在那个寄存器,如下

register int a asm("$4") = 2;

定义了一个int类型的变量,值为2,并使用的是$4寄存器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓APP_ 控件(11)webView —— 简单应用:显示网页

摘自:安卓APP_ 控件(11)webView —— 简单应用:显示网页 作者:丶PURSUING 发布时间: 2021-05-11 11:50:52 网址:https://blog.csdn.net/weixin_44742824/article/details/116602469 目录 简单了…

Python 抓取数据存储到Mysql中

# -*- coding: utf-8 -*- import os,sys import requests import bs4 import pymysql#import MySQLdb#连接MYSQL数据库 db pymysql.connect(host127.0.0.1,userroot,passwordmysql,dbtest,port3306,charsetutf8) #db MySQLdb.connect(127.0.0.1,root,mysql,test,coon.set_cha…

ios 去掉底部状态栏_iOS 隐藏状态栏

1.整个项目隐藏状态栏在Targets->General->勾选中Hide status bar2.单个界面隐藏状态栏,例如登录注册页面1.首先在info.plist里面View controller-based status bar appearance 设置为 NO.2.在需要调控状态栏的ViewController类中添加以下代码://进入时隐藏-(void)viewWi…

QT应用开发基础

目录前言Windows上搭建开发环境C基础什么是C什么是面向对象,什么又是面向过程c的灵魂:c的类对象:类的实例化怎么访问类的成员类的函数成员类的访问修饰符函数的重载构造函数和析构函数类的继承虚函数和纯虚函数制作一个简单的QT界面创建工程U…

meson构建系统

简介 Meson是一个构建系统,它被设计成在不牺牲性能的前提下尽可能的友好。这方面的主要工具是用户用来描述构建结构的自定义语言。这种语言的主要设计目标是简单、清晰和简洁。很多灵感都来自于Python编程语言,它被认为是非常易读的,即使对以…

射灯安装方法图解_江苏天筑不锈钢雕塑厂家格栅射灯安装方法,格栅射灯安装注意事项...

格栅射灯安装方法,您是否已经学会了呢?不管您会不会,今天江苏天筑不锈钢雕塑厂家就结合这个问题,一起来为大家详细介绍这部分内容的一些相关的注意事项,南方的天气比较潮湿,所以我们尽量不要把格栅射灯安装…

在centos8 stream启用 Extra Packages

前言 最近把一台机器装了centos8 stream,centos8 的维护周期将会在2021-12-31结束 而centos8 stream和centos8有什么区别呢?我参考官方的描述简单总结下 由下游变更到上游 centos8是RHEL的rebuild版本,所以是处在下游的,意思是收…

ARM体系结构简介 —— 迅为

目录单片机和ARM处理器内存管理单元(MMU)高速缓冲存储器(CACHE)指令集ARM的指令系统ARM处理器工作模式ARM处理器的内部寄存器ARM处理器的异常ARM中断向量ARM架构的发展单片机和ARM处理器 内存管理单元(MMU)…

getElementById() getElementsByName() getElementsByTagName()

http://www.cnblogs.com/winner/archive/2007/03/28/593028.html1、getElementById()getElementById()可以访问DOCUMENT中的某一特定元素,顾名思义,就是通过ID来取得元素,所以只能访问设置了ID的元素。比如说有一个DIV的ID为docid&#xff1a…

网口扫盲二:Mac与Phy组成原理的简单分析(转)

1. general 下图是网口结构简图.网口由CPU、MAC和PHY三部分组成.DMA控制器通常属于CPU的一部分,用虚线放在这里是为了表示DMA控制器可能会参与到网口数据传输中. 对于上述的三部分,并不一定都是独立的芯片,根据组合形式,可分为下列三种方案: CPU集成MAC与PHY;CPU集成MAC,PHY采用…

python拼接两个数组_在Python中连接两个数组

根据你的描述,你的案子看起来像:In [344]: a[np.arange(5),np.arange(5)]In [345]: b[np.arange(5),np.arange(3)]In [346]: aOut[346]: [array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4])]In [347]: bOut[347]: [array([0, 1, 2, 3, 4]), array([0, 1, …

设置git协议clone代理

0x0 最近在clone yaffs2仓库时发现clone的异常缓慢,就算开了代理也是,搜索一番发现网上大多都是将设置http、https、ssh协议的代理,对于git协定的代理讲的很少,下面分享下如何让git协议走socks代理 以下内容前提是里已经在电脑上…

vue-cli 3.0安装和使用

零. 前言 公司最近开发项目使用的是vue-cli 3.0版本开发,但是对于vue-cli 3.0版本一直没有研究过如何使用,公司使用配置:pug ts stylus eslint;编辑器使用:vscode,使用起来简直不要太爽。 默认你已经安装…

lucene 入门整理

2019独角兽企业重金招聘Python工程师标准>>> 1. 概述 Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。它可以方便地嵌入到各种应用中实现针对应用的全文索引、检索功能&am…

bits/libc-header-start.h: No such file or directory

问题描述 最近需要在debian 安装下arm和riscv的交叉工具链 sudo apt install gcc-10-riscv64-linux-gnu在安装完后使用交叉工具链编译东西时报错 orangepiorangepi4-lts:~/float-test$ riscv64-linux-gnu-gcc-10 float-cmov3.c -O2 -S In file included from float-cmov3.c:…

安卓APP开发基础

目录安卓工程构建第一个APP运行安卓的工程目录文件夹介绍安卓APP启动过程安卓布局控件布局的种类布局和页面的关系显示一张美女图显示两个美女常用布局之相对布局基础控件之Button,TextView,EditText,ImageView, padding和margin(内外边框)相对布局综合小演练-智能家居刷卡界面…

Dlib与OpenCV图片转换

re: 1. https://zhuanlan.zhihu.com/p/36489663 2. https://stackoverflow.com/questions/38180410/convert-rgb-image-to-grayscale-image-in-dlib End转载于:https://www.cnblogs.com/happyamyhope/p/9808837.html

idea怎么直接拉去git_如何将GitHub上面的项目拉取到IDEA中

上次,小喵给大家演示了一下,那么今天小喵给大家演示一下如何将GitHub上面的项目拉去到IDEA中.一 . 获取连接有两种情况 : 一种是项目未初始化 , 第二种是项目已初始化.未初始化 获取连接 :已初始化获取连接 :获得连接后我们就要去完成今天的目标啦!二 . 拉取项目到IDEA中GitHu…

jquery.ui.draggable中文文档jquery 自由拖拽类~study~

为什么80%的码农都做不了架构师?>>> JQuery UI Draggable插件用来使选中的元素可以通过鼠标拖动. Draggable的元素受影响css: ui-draggable, 拖动过程中的css: ui-draggable-dragging. 如果需要的不仅仅是拖, 而是一个完整的拖放功能, 请参阅JQue…