RISC-V 使用 LUI 和 ADDI 构建 32 位常量

2024-01-07

LUI(加载立即数)用于构建32位常量并使用U型格式。 LUI 将 U 立即数放入目标寄存器 rd 的高 20 位,并用零填充最低 12 位。

我在手册中找到了这个,但是如果我想将 0xffffffff 移动到寄存器,我需要的所有代码是:

LUI x2, 0xfffff000
ADDI x2, x2, 0xfff

但是出现了问题,ADDI会扩展符号,将立即数据变成有符号数,所以0xfff将延伸至0xffffffff.

It make x2 to 0xffffefff但不是0xffffffff

将 32 位立即数移动到寄存器的良好实现是什么?


TL;DR:要加载的 32 位常量x2 is 0xffffffff这对应于-1. Since -1是在范围内[-2048, 2047],这个常量可以用一条指令加载:addi x2, zero, -1。您还可以使用li伪指令:li, x2, -1汇编器又将其翻译为addi x2, zero, -1.

使用 a 加载 32 位常量lui+addi顺序

一般来说,我们需要一个lui+addi序列——两条指令——用于将 32 位常量加载到寄存器中。这lui指令编码一个 20 位立即数,而addi指令编码一个 12 位立即数。lui and addi可用于分别加载 32 位常量的高 20 位和低 12 位。

Let N be a 32-bit constant we want to load into a register: N ≡ n31 ... n0. Then, we can split this constant into its upper 20 bits and lower 12 bits, NU and NL, respectively: NU ≡ n31 ... n12 ; NL ≡ n11 ... n0

In principle, we encode NU in the immediate in lui and NL in the immediate in addi. Nevertheless, there is a difficulty to handle if the most significant bit of the 12-bit immediate in addi is 1 because the immediate value encoded in the addi instruction is sign extended

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RISC-V 使用 LUI 和 ADDI 构建 32 位常量 的相关文章

  • elf .rel.text 部分中 R_386_32/R_386_PC32 的含义

    为了理解重定位的概念 我编写了一个简单的 chk c 程序 如下所示 1 include
  • 汇编语言中的全局_start是什么?

    这是我的汇编级代码 section text global start start mov eax 4 mov ebx 1 mov ecx mesg mov edx size int 0x80 exit mov eax 1 int 0x80
  • MASM 字符串反转

    好吧 我正在讨论这个问题 可能是一个非常复杂的解决方案 但这是我脑海中浮现的第一件事 我需要编写一个汇编语言程序来反转 源 字符串 而不使用 目标 字符串 临时变量 这是我的尝试 INCLUDE Irvine32 inc data sour
  • 汇编编程语言:程序仅当输入为 ESC 时退出,并在退出前要求确认(y/n),否则循环

    我只是汇编语言编程的初学者 我们的第一个任务是让程序仅在输入为 ESC 时退出 退出之前请求确认 y n 否则循环 我知道 ESC 在 ASCII 代码中具有等效值 但我对插入位置或是否需要添加更多内容感到困惑 请帮我 这是程序 model
  • 汇编中如何计算负数

    我是汇编新手 我有一个关于如何表示负数的问题 我有三个 DWORDS 变量 比方说 result DWORD 0 i DWORD 3 j DWORD 5 我想计算这个公式 结果 i j 8 但是 当我执行 i j 时 由于符号 结果将是一个
  • 汇编指令陷阱有什么作用?

    当程序需要时 程序通常会发出软件陷阱 由操作系统提供服务 通用异常处理程序 操作系统确定陷阱的原因并做出响应 适当地 汇编指令 trap 和 BASIC 中的 TRAP 指令一样吗 答案似乎是肯定的 你能接受还是拒绝我的结论 不中断 的代码
  • x86-64 上这个语句有什么问题?

    该函数的目的是获取堆栈的起始地址 unsigned long find start void asm movq rsp eax 当我编译它时 出现错误 Error suffix or operands invalid for movq mo
  • orpd等SSE2指令有什么意义?

    The orpd指令是 压缩双精度浮点值的按位逻辑或 这不是做完 全相同的事情吗por 按位逻辑或 如果是这样 拥有它还有什么意义呢 请记住 SSE1orps https www felixcloutier com x86 orps首先 实
  • 在 x86 程序集中将整数打印到控制台

    当我在 16 位汇编中添加两个值时 将结果打印到控制台的最佳方法是什么 目前我有这个代码 CODE START mov ax 1 put 1 into ax add ax 2 add 2 to ax current value mov ah
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 使用 C 库时 C++ 中的常量正确性

    目前我正在开发一个 C 应用程序 我希望它是 const 正确的 意思是尽可能在参数上使用 const 之类的东西 然而 这个 C 应用程序使用了一个不经常使用 const 的 C 库 我遇到的问题是 当向 C 库中的函数发送参数时 参数不
  • const 变量悖论

    如果我有一些关于 C 的表达式 const int x 3 我可以说 x 是一个变量吗 这看起来很奇怪 因为 x 不是变量 因为我无法更改它 提前感谢您的任何解释 Edited附 感谢您的所有回答 我明白根据 C 的定义 我的问题的答案可能
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • AVX-512CD(冲突检测)与原子变量访问有何不同?

    所以我在看他们展示了如何 void Histogram const float age int const hist const int n const float group width const int m const float o
  • ARMv8 A64 汇编中立即值的范围

    我的理解是 ARMv8 A64 汇编中的立即参数可以是 12 位长 如果是这样的话 为什么这行汇编代码是 AND X12 X10 0xFEF 产生此错误 使用 gcc 编译时 Error immediate out of range at
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作

随机推荐

  • 设备 Wavecom 调制解调器不支持 SmsSubmitPdu GSMComm 命令

    我正在使用 GSMComm 库和 Wavecom 调制解调器创建简单的程序 SMS 发送器 当我按下 winform 中的 发送 按钮时 我的 VS2010 中会出现一条消息调试 电话报告未知错误 当设备不支持命令 命令对于当前状态无效或者
  • 如何将AppHarbor与Slack集成?

    似乎没有官方集成 a t m 我怎样才能手动完成呢 我想要实现的是 每次构建从 通过 变为 失败 时 Slack 上都会发布一条 悲伤的 消息 每次构建从 失败 变为 通过 时 都应该发布不同的 快乐 消息 None
  • 如何将 Youtube 视频嵌入到我的应用程序中?

    我正在尝试为我的 Swift 应用程序创建一个视频播放器 但我不断收到 无法解析的标识符 AVPlayerViewController 的错误 我缺少什么 我是这方面的初学者 通俗地说我可能要问几千次 我已经在互联网上搜索了大约一天的视频
  • Django 多个 slug url

    我有两种蛞蝓 path
  • 两个极限之间缩放数字的数学方程不从 0 开始? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 例如 我有一个 1 100 之间的数字 我需要将其缩放到 20 80 之间 例子 1 scales to 20 100 scales to
  • 错误的键类:文本不是 IntWritable

    这似乎是一个愚蠢的问题 但我在 hadoop 的 mapreduce 代码中没有看到我的类型中的问题 正如问题中所述 问题是它需要 IntWritable 但我在减速器的collector collect 中向它传递了一个 Text 对象
  • 不支持的方法:eth_sendTransaction。 Alchemy 不持有用户的私钥

    我无法通过 Alchemy 从前端执行智能合约的发送交易方法 我是一个初学者 我正在尝试从我的前端执行一个方法 将交易发送到区块链 但我从 alchemy 收到一个错误 说该交易需要使用我的私钥签名 但我不知道如何执行此操作我在互联网上没有
  • 在 Swift 上从 kCBAdvDataManufacturerData 中提取数据

    我有一个 TI 传感器标签作为外设 以 kCBAdvDataManufacturerData 的形式广播 BLE 数据 我想从 iOS 中的数据中提取不同的值 我正在 Swift 中执行以下命令 func centralManager ce
  • 如何以 <60 秒的间隔运行 ColdFusion 计划任务?

    我有一个 CFC 方法 希望以 30 秒的间隔运行一次 但是 问题是 ColdFusion 不允许我安排以 60 秒或更短的时间间隔运行的任务 有人对我如何 并且应该 实现这一目标有建议吗 为了抢先回答 当你的脚本运行超过 30 秒时会发生
  • 调整居中径向渐变的半径大小

    我正在重新设计当前的项目 并找到了一种简单的方法来使用以下方法淡化 div 背景的左右边缘 我一直在尝试编辑中心圆的半径 以使其更小 我似乎无法改变它 除非整个渐变样式消失 我试图将黄色区域设置为文本的背景 逐渐淡入透明 我需要做什么才能获
  • 以编程方式从 *.cls 或类似文件将模块导入 access

    如果打开 Microsoft Access 则打开 Visual Basic 窗口 以便您可以看到 Access 项目中的模块和代码列表 您可以从 Windows 资源管理器中拖动基于文本的文件 txt cls bas 等 并将其放入模块文
  • 是否可以替换操作系统的Loader?有什么办法获得Loader的控制权吗?

    我只是想知道是否可以替换操作系统的加载程序 可执行程序加载程序而不是引导加载程序 Windows 是我的选择 是否有任何第三方加载程序可以修补默认加载程序 有什么方法可以让我获得对 OS Loader 的控制权吗 我的意思是 我希望它所做的
  • 有 ISO-Prolog 参考实现吗?

    Java https jdk7 java net java se 7 ri has a 参考实现 http en wikipedia org wiki Reference implementation ISO Prolog 有参考实现吗 我
  • OSError:未找到名为“cairo-2”的库(从 Custom_Widgets 导入 ProjectMaker)

    如何修复这个错误 C Users vanvl OneDrive Bureaublad Progammeren Project 1 02 2 gt python Python 3 9 13 tags v3 9 13 6de2ca5 May 1
  • 如何使用 D3DPT_TRIANGLESTRIP 基元类型在 DirectX 中绘制两个分离的矩形

    我是 DirectX 新手 我正在尝试使用以下命令在一个场景中绘制两个矩形D3DPT TRIANGLESTRIP 一个矩形没问题 但两个矩形则完全不同 是的 我可以使用用 绘制的四个三角形来绘制它们D3DPT TRIANGLELIST原始类
  • 如何向工具栏添加调用 JavaScript 函数的自定义按钮?

    我想在工具栏上添加一个按钮来调用 JavaScript 函数 例如Tada 关于如何添加这个有什么想法吗 还有一种很好的方法允许人们在不创建插件的情况下添加按钮 html
  • 如何使用 CSS 或 Jquery 覆盖 left:0?

    我有一个元素 它具有以下 CSS elem left 0 position fixed right 0 width 60 z index 1000 该元素不跨越整个屏幕 我希望它 对齐 到屏幕的右侧 如果我删除的话 这会很容易left 0
  • SNMP 代理的测试 URL

    我正在尝试查找 SNMP 代理的 URL 列表 我可以将其用于测试目的 到目前为止 我已经使用了 NET SNMP 测试 url gt test net snmp org 我还使用 Verax Simulator 来模拟特定代理 不过 请问
  • Django 根据 ChoiceField 选择显示字段

    我一直很难找到如何在 django 中创建一个依赖于表单中另一个字段的选择的文本字段 仅当选择设置为 购买 时才需要显示此字段 现在我遇到一个问题 它不会根据下拉选择进行更新 而是仅在我点击按钮 提交 表单后进行更新 有没有办法获取当前选择
  • RISC-V 使用 LUI 和 ADDI 构建 32 位常量

    LUI 加载立即数 用于构建32位常量并使用U型格式 LUI 将 U 立即数放入目标寄存器 rd 的高 20 位 并用零填充最低 12 位 我在手册中找到了这个 但是如果我想将 0xffffffff 移动到寄存器 我需要的所有代码是 LUI