0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【RISC-V】li指令

_light ? 來(lái)源:_light ? 作者:_light ? 2022-11-18 10:12 ? 次閱讀

RISC-V中有這樣一條偽指令:

li a0, immediately

可以將任意的32位數(shù)據(jù)或者地址加載到指定的寄存器

在 RV32I中,它擴(kuò)展到 lui 和/或 addi

li 何時(shí)擴(kuò)展為 lui 或者 addi呢?又何時(shí)擴(kuò)展為lui 和 addi呢?

我們觀察lui 和 addi 的指令碼即可得出結(jié)果

在這里插入圖片描述

在這里插入圖片描述

由上圖可知,lui加載的立即數(shù)為高20位,addi加載的立即數(shù)為低12位

由此得出結(jié)論

  • li 加載的立即數(shù)范圍為:0~4096 時(shí),會(huì)擴(kuò)展成 addi 指令

    li a0, immediately ? addi a0, x0, imme

  • li 加載的立即數(shù)范圍超過(guò)4096時(shí),會(huì)擴(kuò)展成 lui 指令addi 指令

    li a0, immediately 擴(kuò)展成

    1、lui a0, (immediately >> 12)

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

  • li 加載的立即數(shù)范圍超過(guò)4096時(shí),并且低12位為0,會(huì)擴(kuò)展成 lui 指令

    li a0, immediately

    擴(kuò)展成

    lui a0, (immediately >> 12)


接上文,觀察 lui指令 、addi指令 會(huì)得到這個(gè)結(jié)果:lui指令加載的立即數(shù)為無(wú)符號(hào),無(wú)需注意。addi指令加載的為有符號(hào)數(shù),這個(gè)需要考慮一下立即數(shù)的符號(hào)位

假如我們要加載大立即數(shù)到指定的寄存器,需要考慮兩種情況

1、第11位為0

第11位為0,則指令:li a0, immediate 會(huì)直接擴(kuò)展成:

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

2、第11位為1

第11位為1,此時(shí) li a0, immediate 就不會(huì)擴(kuò)展成

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

而是擴(kuò)展成

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

解釋一下:

addi指令所加載的立即數(shù)的第11位為1時(shí),這個(gè)立即數(shù)是符號(hào)擴(kuò)展的,因此加數(shù)將為負(fù)數(shù)。這意味著除了添加常量的最右邊11位

之外,我們還需要減去2^12。為了彌補(bǔ)這個(gè)錯(cuò)誤,只需將lui 加載的常量添加一個(gè)1,因?yàn)?lui 常量縮小了 2 ^12倍

例如:將 0xE76 加載到寄存器a0中

答:

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

代碼實(shí)現(xiàn)

#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"); 
	}
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5254

    瀏覽量

    119214
  • 指令
    +關(guān)注

    關(guān)注

    1

    文章

    598

    瀏覽量

    35508
  • RISC-V
    +關(guān)注

    關(guān)注

    44

    文章

    2142

    瀏覽量

    45713
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    正式的RISC-V基礎(chǔ)指令集架構(gòu)與特權(quán)架構(gòu)規(guī)范來(lái)了,RISC-V基金會(huì)已正式批準(zhǔn)

    根據(jù)RISC-V基金會(huì)官網(wǎng)發(fā)布的公告,RISC-V 基金會(huì)宣布了批準(zhǔn)RISC-V 基礎(chǔ)指令集架構(gòu)與特權(quán)架構(gòu)規(guī)范,為 RISC-V的可擴(kuò)展性進(jìn)
    的頭像 發(fā)表于 07-11 10:46 ?9720次閱讀

    RISC-V指令集架構(gòu)特點(diǎn)

    RISC-V是當(dāng)下熱門(mén)的技術(shù),值得大家學(xué)習(xí),這里分享一份關(guān)于RISC-V指令的內(nèi)容給大家。
    的頭像 發(fā)表于 10-14 09:08 ?3269次閱讀

    RISC-V指令異常調(diào)試實(shí)例

    本文以一個(gè)簡(jiǎn)單的實(shí)例介紹RISC-V指令異常的調(diào)試過(guò)程,思路都是一樣的,遇到其他情況時(shí)分析過(guò)程也類似。
    的頭像 發(fā)表于 06-08 10:50 ?1636次閱讀
    <b class='flag-5'>RISC-V</b><b class='flag-5'>指令</b>異常調(diào)試實(shí)例

    RISC-V開(kāi)放架構(gòu)設(shè)計(jì)之道|閱讀體驗(yàn)】RISC-V基礎(chǔ)整數(shù)指令

    第2章 RV32I:RISC-V基礎(chǔ)整數(shù)指令集 本章重點(diǎn)講解構(gòu)成RISC-V基礎(chǔ)整數(shù)指令集的基本指令
    發(fā)表于 01-31 21:10

    RISC-V指令集的特點(diǎn)總結(jié)

    開(kāi)源 定義:RISC-V 是完全開(kāi)源的指令集架構(gòu)(ISA),意味著任何人都可以查看、使用、修改以及分發(fā)其設(shè)計(jì),而無(wú)需支付版權(quán)費(fèi)用。 優(yōu)勢(shì):這種開(kāi)源特性促進(jìn)了全球性的創(chuàng)新和合作。 社區(qū)化 定義
    發(fā)表于 08-30 22:05

    RISC-V架構(gòu)簡(jiǎn)介

    【摘要】 本文首先對(duì)RISC-V的架構(gòu)做了簡(jiǎn)要的介紹,在此基礎(chǔ)上實(shí)現(xiàn)了LiteOS在RISC-V架構(gòu)上的適配過(guò)程的具體步驟,希望對(duì)你有所幫助。1 RISC-V架構(gòu)簡(jiǎn)介RISC-V是一個(gè)
    發(fā)表于 07-28 07:46

    什么是RISC-V? RISC-V指令具有哪些特點(diǎn)應(yīng)用?

    什么是RISC-V?RISC-V指令具有哪些特點(diǎn)應(yīng)用?自己怎么才能設(shè)計(jì)出設(shè)計(jì)一套指令集?
    發(fā)表于 10-14 09:05

    如何在RISC-V中使用DSP指令

    如何在RISC-V中使用DSP指令?
    發(fā)表于 02-16 07:43

    RISC-V-Reader-Chinese-v2p1 RISC-V手冊(cè)(中文) RISC-V開(kāi)源指令集的指南

    RISC-V 手冊(cè) 一本開(kāi)源指令集的指南 本書(shū)是由 RISC-V 設(shè)計(jì)者 DAVID PATTERSON等親自寫(xiě)的書(shū)。書(shū)寫(xiě)的非常精彩,和Risc-V一樣非常簡(jiǎn)潔明了,沒(méi)有廢話,書(shū)本身也
    發(fā)表于 04-22 18:04

    RISC-V簡(jiǎn)介

    RISC-V簡(jiǎn)介??RISC-V 是一個(gè)自由和開(kāi)放的 ISA(開(kāi)源指令集架構(gòu)),通過(guò)開(kāi)放的標(biāo)準(zhǔn)協(xié)作實(shí)現(xiàn)處理器創(chuàng)新的新時(shí)代。RISC-V ISA在架構(gòu)上提供了一個(gè)新的自由、可擴(kuò)展的軟件和
    發(fā)表于 02-27 19:56

    我了解的RISC-V

    RISC-V(發(fā)音為“risk-five”)是一個(gè)基于精簡(jiǎn)指令集(RISC)原則的開(kāi)源指令集架構(gòu)(ISA)。 與大多數(shù)指令集相比,
    發(fā)表于 03-19 10:52

    RISC-V 發(fā)展

    不完善的地方,有傳言未來(lái)可能會(huì)形成x86、ARM、RISC-V三足鼎立的天下,但能夠形成這個(gè)局面,還需要大家的共同努力。RISC-V指令RISC-V
    發(fā)表于 04-14 10:18

    第一屆RISC-V中國(guó)峰會(huì)看點(diǎn) risc-v開(kāi)發(fā)要怎么優(yōu)化risc-v指令集架構(gòu)代碼密度

    在第一屆RISC-V中國(guó)峰會(huì)上看點(diǎn)很多,RISC-V是開(kāi)源的,那么代碼密度要怎么控制,會(huì)不會(huì)因?yàn)殚_(kāi)源而導(dǎo)致代碼密度特別大? 我們一起來(lái)看看risc-v峰會(huì)其中一個(gè)非常重要的亮點(diǎn);卡姆派樂(lè)信息科技有限公司解讀針對(duì)
    發(fā)表于 06-23 18:22 ?9590次閱讀
    第一屆<b class='flag-5'>RISC-V</b>中國(guó)峰會(huì)看點(diǎn) <b class='flag-5'>risc-v</b>開(kāi)發(fā)要怎么優(yōu)化<b class='flag-5'>risc-v</b><b class='flag-5'>指令</b>集架構(gòu)代碼密度

    簡(jiǎn)單講講RISC-V指令集CPU的參數(shù)

    本次CPU采用32位RISC-V指令集架構(gòu)(一代是自己瞎編指令集)。指令集就是程序指令的集合,指引硬件如何設(shè)計(jì)、如何運(yùn)行。
    的頭像 發(fā)表于 08-07 14:55 ?3400次閱讀
    簡(jiǎn)單講講<b class='flag-5'>RISC-V</b><b class='flag-5'>指令</b>集CPU的參數(shù)

    什么是RISC-VRISC-V的關(guān)鍵技術(shù)

    RISC-V不僅僅是一個(gè)流行語(yǔ);它建立在堅(jiān)實(shí)的技術(shù)基礎(chǔ)之上,使其有別于其他指令集架構(gòu) (ISA)。RISC-V的核心是基于精簡(jiǎn)指令集計(jì)算(RISC
    發(fā)表于 03-26 09:34 ?3040次閱讀