0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【RISC-V】li指令

_light 来源:_light 作者:_light 2022-11-18 10:12 次阅读

RISC-V中有这样一条伪指令:

li a0, immediately

可以将任意的32位数据或者地址加载到指定的寄存器

在 RV32I中,它扩展到 lui 和/或 addi

li 何时扩展为 lui 或者 addi呢?又何时扩展为lui 和 addi呢?

我们观察lui 和 addi 的指令码即可得出结果

在这里插入图片描述

在这里插入图片描述

由上图可知,lui加载的立即数为高20位,addi加载的立即数为低12位

由此得出结论

  • li 加载的立即数范围为:0~4096 时,会扩展成 addi 指令

    li a0, immediately ⇒ addi a0, x0, imme

  • li 加载的立即数范围超过4096时,会扩展成 lui 指令addi 指令

    li a0, immediately 扩展成

    1、lui a0, (immediately >> 12)

    2、addi a0, a0, (immediately & 0xFFF)

  • li 加载的立即数范围超过4096时,并且低12位为0,会扩展成 lui 指令

    li a0, immediately

    扩展成

    lui a0, (immediately >> 12)


接上文,观察 lui指令addi指令 会得到这个结果:lui指令加载的立即数为无符号,无需注意。addi指令加载的为有符号数,这个需要考虑一下立即数的符号位

假如我们要加载大立即数到指定的寄存器,需要考虑两种情况

1、第11位为0

第11位为0,则指令:li a0, immediate 会直接扩展成:

lui   a0,  immediate >> 12
addi  a0, a0, (immediate & 0xFFF)

2、第11位为1

第11位为1,此时 li a0, immediate 就不会扩展成

lui   a0,  immediate >> 12
addi  a0, a0, (immediate & 0xFFF)

而是扩展成

lui   a0,  ((immediate >> 12) + 1)
addi  a0, a0, ((immediate & 0xFFF) - 2^12)

解释一下:

addi指令所加载的立即数的第11位为1时,这个立即数是符号扩展的,因此加数将为负数。这意味着除了添加常量的最右边11位

之外,我们还需要减去2^12。为了弥补这个错误,只需将lui 加载的常量添加一个1,因为 lui 常量缩小了 2 ^12倍

例如:将 0xE76 加载到寄存器a0中

答:

lui   a0,  0x01
addi  a0, a0, (0xE76 - 4096)

代码实现

#define immediate  XXXX

uint32_t MSB, LSB;
MSB = immediate >> 12;
LSB = immediate & 0xFFF;

if (MSB == 0) {
	if (LSB & 0x800) {
		asm volatile("lui a0, 0x01"); 
		asm volatile("addi a0, a0, LSB - 4096"); 
	} else {
		asm volatile("addi a0, x0, LSB"); 
	}
} else {
	if (LSB & 0x800) {
		asm volatile("lui a0, MSB + 0x01"); 
		asm volatile("addi a0, a0, LSB - 4096"); 
	} else {
		asm volatile("lui a0, MSB"); 
		asm volatile("addi a0, x0, LSB"); 
	}
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5342

    浏览量

    120325
  • 指令
    +关注

    关注

    1

    文章

    607

    浏览量

    35707
  • RISC-V
    +关注

    关注

    45

    文章

    2277

    浏览量

    46154
收藏 人收藏

    评论

    相关推荐

    正式的RISC-V基础指令集架构与特权架构规范来了,RISC-V基金会已正式批准

    根据RISC-V基金会官网发布的公告,RISC-V 基金会宣布了批准RISC-V 基础指令集架构与特权架构规范,为 RISC-V的可扩展性进
    的头像 发表于 07-11 10:46 9869次阅读

    RISC-V指令集架构特点

    RISC-V是当下热门的技术,值得大家学习,这里分享一份关于RISC-V指令的内容给大家。
    的头像 发表于 10-14 09:08 3604次阅读

    RISC-V指令异常调试实例

    本文以一个简单的实例介绍RISC-V指令异常的调试过程,思路都是一样的,遇到其他情况时分析过程也类似。
    的头像 发表于 06-08 10:50 1932次阅读
    <b class='flag-5'>RISC-V</b><b class='flag-5'>指令</b>异常调试实例

    RISC-V开放架构设计之道|阅读体验】RISC-V基础整数指令

    第2章 RV32I:RISC-V基础整数指令集 本章重点讲解构成RISC-V基础整数指令集的基本指令
    发表于 01-31 21:10

    RISC-V和arm指令集的对比分析

    RISC-V和ARM指令集是两种不同的计算机指令集架构,它们在多个方面存在显著的差异。以下是对这两种指令集的详细对比分析: 一、设计理念 RISC-
    发表于 09-28 11:05

    RISC-Vli指令讲解

    我们知道在RISC-V中有这样一条伪指令: li a0, immediately 可以将任意的32位数据或者地址加载到指定的寄存器中,在 RV32I中,它扩展到 lui 和/或 addi。
    发表于 10-28 14:55

    RISC-V指令集概述

    RISC-V就是RISC的第五代指令集架构。而RISC-V目标就是“成为一种完全开放的指令集架构,可被任何学术机构或商业组织自由使用”。
    发表于 11-30 23:30

    RISC-V架构简介

    【摘要】 本文首先对RISC-V的架构做了简要的介绍,在此基础上实现了LiteOS在RISC-V架构上的适配过程的具体步骤,希望对你有所帮助。1 RISC-V架构简介RISC-V是一个
    发表于 07-28 07:46

    什么是RISC-VRISC-V指令具有哪些特点应用?

    什么是RISC-VRISC-V指令具有哪些特点应用?自己怎么才能设计出设计一套指令集?
    发表于 10-14 09:05

    RISC-V-Reader-Chinese-v2p1 RISC-V手册(中文) RISC-V开源指令集的指南

    RISC-V 手册 一本开源指令集的指南 本书是由 RISC-V 设计者 DAVID PATTERSON等亲自写的书。书写的非常精彩,和Risc-V一样非常简洁明了,没有废话,书本身也
    发表于 04-22 18:04

    RISC-V简介

    RISC-V简介  RISC-V 是一个自由和开放的 ISA(开源指令集架构),通过开放的标准协作实现处理器创新的新时代。RISC-V ISA在架构上提供了一个新的自由、可扩展的软件和
    发表于 02-27 19:56

    RISC-V 发展

    不完善的地方,有传言未来可能会形成x86、ARM、RISC-V三足鼎立的天下,但能够形成这个局面,还需要大家的共同努力。RISC-V指令RISC-V
    发表于 04-14 10:18

    第一届RISC-V中国峰会看点 risc-v开发要怎么优化risc-v指令集架构代码密度

    在第一届RISC-V中国峰会上看点很多,RISC-V是开源的,那么代码密度要怎么控制,会不会因为开源而导致代码密度特别大? 我们一起来看看risc-v峰会其中一个非常重要的亮点;卡姆派乐信息科技有限公司解读针对
    发表于 06-23 18:22 9682次阅读
    第一届<b class='flag-5'>RISC-V</b>中国峰会看点 <b class='flag-5'>risc-v</b>开发要怎么优化<b class='flag-5'>risc-v</b><b class='flag-5'>指令</b>集架构代码密度

    简单讲讲RISC-V指令集CPU的参数

    本次CPU采用32位RISC-V指令集架构(一代是自己瞎编指令集)。指令集就是程序指令的集合,指引硬件如何设计、如何运行。
    的头像 发表于 08-07 14:55 3667次阅读
    简单讲讲<b class='flag-5'>RISC-V</b><b class='flag-5'>指令</b>集CPU的参数

    什么是RISC-VRISC-V的关键技术

    RISC-V不仅仅是一个流行语;它建立在坚实的技术基础之上,使其有别于其他指令集架构 (ISA)。RISC-V的核心是基于精简指令集计算(RISC
    发表于 03-26 09:34 3537次阅读