RISC-V (二)汇编语言编程

news2025/2/23 23:45:42

简介

        汇编语言是一种“低级”语言。

        汇编语言的缺点:

         -难度

        -难写

        -难移植

        汇编语言的优点:

        -灵活

        -强大

        汇编语言的应用场景

        -需要直接访问底层硬件的地方

        -需要对性能执行极致优化的地方

汇编语言语法介绍(GNU版本)

基本组成

        汇编文件一般后缀为.S或.s,.S包含了预处理的语句,.s就是纯粹的汇编语句。

        一个完整的RISC-V汇编程序有多条语句(statement)组成。一条典型的RISC-V汇编语言由3部分组成:

[label:] [operation] [comment]

        打方括号表示可选。

        -label表示一个标号,必须以":"结尾。label相当于一个地址,给这个地址起了个名字。是这条指令存放在内存的地址。

        -operation可以由以下多种类型:

                -instruction(指令):直接对应二进制机器指令的字符串

                -preudo-instruction(伪指令):为了提高编写代码的效率,可以用一条伪指令指示汇编器产生多条实际的指令(instruction)。(要在汇编器的手册里查看定义)

                -directive(指示/伪操作):通过类似指令的形式(以“.”开头),通知汇编器如何控制代码的产生等,不对应具体的指令。属于汇编器自己定义的一些语法。(要在汇编器的手册里查看定义)

                -macro:采用.macro/.endm自定义的宏

        例子:


.macro do_nothing      #directive
        nop            #preudo-instruction
        nop            #preudo-instruction
.endm

    .text              #directive  告诉大家生成的指令要放到text的section中
    .global _start     #directive  _start是个全局变量,外部可见,有点像extern


_start:                 #label
    li x6, 5            #preudo-instruction
    li x7, 4            #preudo-instruction
    add x5, x6, x7      #instruction
    do_nothing          #calling macro


    .end                #End of file

RISC-V汇编指令操作对象

        寄存器:

        -32个通用寄存器,x0~x31;

        -在RISC-V中,Hart在执行算术逻辑运算时所操作的数据必须直接来自寄存器

        内存:

        -Hart可以执行在寄存器和内存之间的数据读写操作;

        -读写操作使用字节(Byte)为基本单位进行寻址;

        -RV32可以访问最多2^32个字节的内存空间。

        XLEN指的是寄存器的长度32/64。

        x0寄存器是zero寄存器,里面读出来永远是0,只读不写。

        pc寄存器是外界不可见的。 

 RISC-V汇编指令类型

        参考riscv-spec-20191213.pdf文件中的第24章

        -指令长度;ILEN1=32 bits(RV32I)

        -指令对齐:IALIGN=32bits(RV32I),指的是在内存中对齐。地址对齐32byte。

        -32个bit划分成不同的“域(field)”

         -funct3/funct7和opcode一起决定最终的指令类型。

         -指令在内存中按照小端序排列。

31-2524-2019-1514-1211-76-0
funct7rs2rs1funct3rdopcodeR-type
imm[]imm[]rs1funct3rdopcodeI-type
imm[]rs2rs1funct3imm[4:0]opcodeS-type
imm[]rs2rs1funct3imm[4:1[11]]opcodeB-type
imm[]imm[]imm[]imm[]rdopcodeU-type
imm[]imm[]imm[]imm[]rdopcodeJ-type

        R-type:(register),每条指令中有三个fields,用于指定3个寄存器参数。

         I-type:(Immediate),每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为12bits)。

        S-type: (Store),每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为12bits,但fields的组织方式不同于I-type)。(用来访问内存的指令)

        B-type: (Branch),每条指令除了带有两个寄存器参数外,还带有一个立即数参数(宽度为12bits,但取值为2的倍数)。(跟分支跳转有关)

        U-type:(Upper),每条指令含有一个寄存器参数再加上一个立即数参数(宽度为20bits,用于表示一个立即数的高20位)。

        J-type:(Jump),每条指令含有一个寄存器参数再加上一个立即数参数(宽度为20bits)。

小端序的概念

        -主机字节序(HBO - Host Byte Order),默认小端序。

        -一个多字节整数在计算机内存中存储的字节顺序称为主机字节序(HBO-Host Byte Order,或者叫本地字节序);

        -不同类型CPU的HBO不同,这与CPU的设计有关。分为大端序和小端序。

         riscv是小端序编指令。

算数指令

基于算术运算指令实现的其他伪指令
伪指令语法等价指令指令描述例子
NEGNEG RD, RSSUB RD, X0, RS对RS中的值取反并将结果存放在RD中neg x5, x6
MVMV RD, RSADDI RD, RS, 0将RS中的值拷贝到RD中mv x5, x6
NOPNOPADDI x0, x0, 0什么也不做nop
LUI(Load Upper Immediate)
语法LUI RD, IMM
例子lui x5, 0x12345x5 = 0x12345 << 12

         LUI指令会构造一个32bits的立即数,这个立即数的高20位对应指令中的imm,低12位清零。这个立即数作为结果存放在RD中。

        例子

        -利用LUI+ADDI来为寄存器加载一个大数0x12345678

        lui        x1, 0x12345        # x1 = 0x12345000

        addi    x1, x1, 0x678       # x1 = 0x12345678

        -利用LUI+ADDI来为寄存器加载一个大数0x12345FFF

        由于addi里的立即数会被符号扩展,所以不能直接加上FFF。

        lui        x1, 0x12346      # x1 = 0x12346000

        addi    x1, x1, -1            # x1 = 0x12345FFF

LI(Load Immediate)

AUIPC
语法AUIPC RD, IMM
例子auipc x5, 0x12345x5 = 0x12345 << 12 + PC

        auipc指令采用U-type

        和LUI指令类似,AUIPC指令也会构造一个32bits的立即数,这个立即数的高20位对应指令中的imm,低12位清零。但和LUI不同的是,AUIPC会先将这个立即数和PC值相加,将相加的结果放在RD中。

        应用场景:动态库地址的加载。

LA(Load Address)
语法LA RD, LABEL
例子la x5, foo

        LA是一个伪指令

        具体编程时给出需要加载的label,编译器会根据实际情况利用auipc和其他指令自动生成正确的指令序列。

        常用语加载一个函数或者变量的地址。

        例子

_start:
    la x5, _start    # x5 = _start
    jr x5

        反汇编出来很可能就是一条auipc指令。

逻辑运算指令

​​​​​​​​​​​​​​

移位运算指令​​​​​​​​​​​​​​

内存读写指令

        

条件分支指令

        x1寄存器用来保存返回地址。

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

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

相关文章

《python程序语言设计》第6章15题财务应用程序:打印税款表。利用程序清单4-7的代码

6.15 打印税款表 def computeTax(status_n, income):tax 0if status_n 0:if income < 8350:tax income * 0.10elif income < 33950:tax 8350 * 0.10 (income - 8350) * 0.15elif income < 82250:tax 8350 * 0.10 (33950 - 8350) * 0.15 (income - 33950) * 0.…

Docker 制作java8镜像

一、在Linux服务器安装Docker 可参考&#xff1a;Linux安装Docker-CSDN博客 二、使用Dokcer制作java8镜像 2.1 上传jdk8的压缩包 mkdir -p /home/data/develop/jdk cd /home/data/develop/jdk 在该路径下上传jdk-8u261-linux-x64.tar.gz包 如下图&#xff1a; 2.2 编写Docke…

HALCON如何创建本地函数

HALCON中有本地函数(.hdev)、外部函数(HDevelop函数文件.hdvp)和库函数(.hdpl) 本地函数(.hdev)&#xff1a;创建后仅在当前程序文件中使用&#xff1b; 外部函数(HDevelop函数文件.hdvp)&#xff1a;创建后可以在其他程序文件中复用&#xff0c;默认保存在…/ procedures/下…

【React】详解 Redux 状态管理

文章目录 一、Redux 的基本概念1. 什么是 Redux&#xff1f;2. Redux 的三大原则 二、Redux 的核心组件1. Store2. Action3. Reducer 三、Redux 的使用流程1. 安装 Redux 及其 React 绑定2. 创建 Action3. 创建 Reducer4. 创建 Store5. 在 React 应用中使用 Store6. 连接 React…

【Java算法专场】二分查找(下)

目录 山脉数组的峰顶索引 算法分析 算法步骤 算法代码 算法示例 寻找峰值 算法分析 算法步骤 算法代码 算法示例 寻找旋转排序数组中的最小值 算法分析 算法步骤 算法代码 算法示例 点名 算法分析 算法步骤 算法代码 算法示例 山脉数组的峰顶索引 …

生鲜云订单零售系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;订单评价管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#…

DDOS攻击学习 - kali初学

文章目录 本地ssh配置nmap(网络连接的工具)nmap -sP IP地址nmap -p 1-65535 -A IP地址主机发现Ping扫描端口扫描时序扫描常用扫描方式指纹识别与探测全端口版本探测防火墙/IDS逃逸报文分段信息收集IP信息收集WHOIS查询数据库渗透测试MySQL列举数据库列举MySQL变量发起请求目录扫…

暑假第一周——网易云音乐仿写

iOS学习 前言发现&#xff1a;控件的堆叠我的&#xff1a;更换头像账号&#xff1a;切换夜间总结 前言 本周正式开始暑期学习&#xff0c;完成了网易云音乐的仿写。 发现&#xff1a;控件的堆叠 发现页面由一个无限轮播图&#xff0c;四个自定义cell完成。无限轮播图在之前已经…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十九章 等待队列

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

css 作业 2

文章目录 前言第四题第五题第六题第七题第八题第九题第十题&#xff08;子标签&#xff09; 前言 昨天写了前面三次作业&#xff0c;今天把剩下的七个作业写完 第四题 http://127.0.0.1:5500/index1.html&#xff0c;就用这个网址查看代码在网页的展示效果 代码评测过不了&…

【C语言】文件操作,文件读写详细介绍

目录 为什么要使用文件&#xff1f; 文件概念 1. 什么是文件&#xff1f; 2. 程序文件 3. 数据文件 4. 文件名 文件的使用 1. 文件指针 2. 文件的打开与关闭 文件的顺序读写 1. 顺序读写函数 2. scanf系列与printf系列 文件的随机读写 1. fseek 2. ftell 3. …

【C++】实验三

题目&#xff1a; 1、如何使用C来找出编码88表示的字符&#xff1f;指出至少两种方法。 思路&#xff1a;方法一定义一个字符型变量直接等于88&#xff0c;将其输出结果为编码88表示的字符&#xff1b;方法二使用整形变量来存储88&#xff0c;输出时将其强制转换成字符型。 …

GD32 MCU如何将烧录口配置为GPIO使用?

如果大家在进行GD32 MCU开发时发现GPIO引脚使用不足&#xff0c;可以尝试将烧录口配置为GPIO使用&#xff0c;这样就可以多出几个引脚使用&#xff0c;但使用的时候如何配置以及有哪些注意事项&#xff0c;本视频将会为大家进行解答。 GD32 MCU存在两种GPIO备用功能的配置&…

数字陷波器的设计和仿真(Matlab+C)

目录 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 2. 示例2 三、C语言仿真 1. 由系统函数计算差分方程 2. 示例代码 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 clear clc f0=100;%滤掉的100Hz fs=1000;%大于两倍的信号最高频率 r=0.9; w0=2*pi*f0/fs;%转换到…

【深度学习】语音合成,TTS,fish-speech

官方项目地址&#xff1a;https://github.com/fishaudio/fish-speech git clone https://github.com/fishaudio/fish-speech.gitdocker run -it --gpus device3 -v /ssd/xiedong/tts:/ssd/xiedong/tts --net host --shm-size 16G kevinchina/deeplearning:pytorch2.3.0-cuda12.…

玩转CSS:用ul li +JS 模拟select,避坑浏览器不兼容。

玩转CSS&#xff1a;用ul li JS 模拟select&#xff0c;避坑浏览器不兼容。 在前端的工作中&#xff0c;经常会遇到 selcet控件&#xff0c;但我们用css来写它的样式时候&#xff0c;总是不那么令人满意&#xff0c;各种浏览器不兼容啊有没有&#xff1f; 那么&#xff0c;我…

Datawhale AI 夏令营——AI+逻辑推理——Task1

# Datawhale AI 夏令营 夏令营手册&#xff1a;从零入门 AI 逻辑推理 比赛&#xff1a;第二届世界科学智能大赛逻辑推理赛道&#xff1a;复杂推理能力评估 代码运行平台&#xff1a;魔搭社区 比赛任务 本次比赛提供基于自然语言的逻辑推理问题&#xff0c;涉及多样的场景&…

27K star!有没有显卡都能搞,快速基于LLM构建本地智能知识库

觉得搞一个AI的智能问答知识库很难吗&#xff1f;那是你没有找对方向和工具&#xff0c; 今天我们分享一个开源项目&#xff0c;帮助你快速构建基于Langchain 和LLM 的本地知识库问答&#xff0c;在GitHub已经获得27K star&#xff0c;它就是&#xff1a;Langchain-Chatchat L…

在Spring项目中使用Maven和BCrypt来实现修改密码功能

简介 在数字时代&#xff0c;信息安全的重要性不言而喻&#xff0c;尤其当涉及到个人隐私和账户安全时。每天&#xff0c;无数的用户登录各种在线服务&#xff0c;从社交媒体到银行账户&#xff0c;再到电子邮件和云存储服务。这些服务的背后&#xff0c;是复杂的系统架构&am…

进程间关系

目录 亲缘关系 进程组关系 会话关系 孤儿态进程 亲缘关系 亲缘关系主要体现于父子进程&#xff0c;子进程父进程创建&#xff0c;代码继承于父进程&#xff0c;父进程负责回收&#xff0c;子进程诞生至结束父进程全程参与&#xff0c;这种称为强亲缘关系。 系统开机后&…