- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的教授将此作为家庭作业问题的答案之一发布。谁能帮我解决这个问题吗?我不明白他对 CON1 - CON4 做了什么以及 >> 和 0x0FFF 是什么意思。
CON1: EQU 6000
CON2: EQU 6245
CON3: EQU 10000
CON4: EQU 10245
A: DM 4 ; DM is Define Memory
addi t1, x0, A ; t1 = &A
lui t0, (CON1>>12) + ((CON1 & 0x0800)>>11)
addi t0, t0, CON1&0xFFF
sd t0, 0(t1) // Cut and paste from last question of Quiz1
// Blank line between groups of statements
lui t0, (CON2>>12) + ((CON2 & 0x0800)>>11)
addi t0, t0, CON2&0xFFF
sd t0, 8(t1)
lui t0, (CON3>>12) + ((CON3 & 0x0800)>>11)
addi t0, t0, CON3&0xFFF
sd t0, 16(t1)
lui t0, (CON4>>12) + ((CON4 & 0x0800)>>11)
addi t0, t0, CON4&0xFFF
sd t0, 24(t1)
// We need this to avoid the NO INSTRUCTION error
ebreak x0, x0, 0 ; Suspend program.
如有任何帮助,我们将不胜感激,谢谢。我们正在使用 RISC-V
最佳答案
在RISC-V基础指令集中,每条指令都以32位编码。这意味着立即操作数的空间仅限于几个位。因此,要将更大的常量放入寄存器(RV32G/RV64G 也是 32 或 64 位宽),您需要将其拆分并使用多个指令移动部分,即 RV32G 为 2 个,RV64G 为 8 个。
使用 32 位 RISC-V (RV32G),可以通过加载上立即数 ( lui
) 和添加立即数 ( addi
) 来加载更大的常量操作说明。 lui
的立即操作数是 20 位宽,而 addi
允许 12 位立即数操作数。因此,它们足以加载最多使用 32 位的常量。
lui
对立即操作数进行符号扩展并将其左移 12 位,并将结果加载到目标寄存器中。因此得名。 addi
在添加它之前,还会对它的直接操作数进行符号扩展。
因此,使用 RV32G,可以使用 lui
加载更大的常数接下来是 addi
必须取高 20 位,将它们逻辑右移 12 位,这样 12 位左移 lui
被取消。然后对低 12 位进行掩码,得到 addi
的操作数.
如果 addi
就足够了不对其直接操作数进行符号扩展。如果确实如此,因为最高位设置为 1,我们必须增加 lui
操作数使得多余的符号位在加法中再次被清零。
假设我们表示常数 x
的高位部分与 h
,低位带有l
,由于 RISC-V 在寄存器溢出时实现了二进制补码和算术换行,因此我们可以使用模算术来看到:
h + l = x # taking register widths into account:
=> (h + l) % 2**32 = x % 2**32 # in case l is sign extended:
=> (h + l + e + c) % 2**32 = x % 2**32 # replace e with the additional sign bits:
<=> (h + l + 4294963200 + c) % 2**32 = x % 2**32 # eliminate c:
<=> (h + l + 4294963200 + 4096) % 2**32 = x % 2**32
<=> (h + l) % 2**32 + (4294963200 + 4096) % 2**32 = x % 2**32
<=> (h + l) % 2**32 + 0 = x % 2**32
因此,我们必须将 lui
加 1立即操作数(左移 12 位后等于 4096)当且仅当 addi
的立即操作数是符号扩展的。
在您的汇编示例中,>>
表示右移,<<
左移和 &
逻辑与。它们用于实现所描述的分割和算术,例如在
lui t0, (CON1>>12) + ((CON1 & 0x0800)>>11)
addi t0, t0, CON1&0xFFF
哪里CON1 & 0x0800
屏蔽 12 位,即 addi
的符号位立即操作数。如果设置了 ((CON1 & 0x0800)>>11)
计算结果为 1,从而消除了以下 addi
添加的多余符号位操作说明。 CON1&0xFFF
屏蔽最低 12 位。
在标准 RISC-V 汇编中,只需使用立即加载 ( li
) 伪指令即可避免所有这些繁琐的位管理,例如:
li t1, 6245
汇编器自动将其转换为最佳指令序列(例如使用 objdump 检查):
lui t1, 0x2
addi t1, t1,-1947
或者,使用 GNU 作为汇编器,也有将操作数分为上部和下部的指令:
lui a1, %hi(6245)
addi a1, a1, %lo(6245)
这可以说比代码片段中的困惑更具可读性。
这也适用于 GNU 中的符号,例如:
.set CON2, 6245
li a1, 6245
lui a2, %hi(CON2)
addi a2, a2, %lo(CON2)
li a3, CON2
# => a1 == a2 == a3
关于assembly - 使用 LUI 和 ADDI 了解 RISC-V 汇编中的 EQU 和 >> 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59869014/
我一直在尝试使用 ADDIS 和 ADDI 指令来实现将常量求和到数组的基本函数,我按照 https://cr.yp.to/2005-590/powerpc-cwg.pdf 第 48 和 49 页中的
我一直在尝试使用 ADDIS 和 ADDI 指令来实现将常量求和到数组的基本函数,我按照 https://cr.yp.to/2005-590/powerpc-cwg.pdf 第 48 和 49 页中的
我正在阅读 Addy Osmani 的精彩杂志 memory efficient JS 的博客在关闭部分。我了解以下函数引用了largeStr,并且GC无法声明它。 var a = function
我目前正在实现 RV32I 基本指令集。 我有一个关于 ADDI 指令的问题。在手册中,如何理解“ADDI rd, rs1, 0 用于实现MV rd, rs1 汇编器伪指令”这一条款。 这是否意味着
给定这段代码: // Constructor. var Interface = function (name, methods) { if (arguments.length != 2
我正在研究使用过程的MIPS代码,但无法理解堆栈(sp)和帧指针(fp)的目的。 例如,我研究的代码如下。它会在您输入的号码之前打印所有号码,例如3. 3,2,1,0,并显示它使用了多少堆栈大小。在此
我正在使用 Addy Osmani 的 pub sub 方法: var topics = {}; jQuery.Topic = function( id ) { var callbacks,
我应该回答这个问题。经过一番研究后发现,add 和 sub 具有相同的操作码,仅在功能领域有所不同。这是答案还是其他什么? 更新 它可以在 Nios II CPU 手册中找到: subi subtra
我使用由 Yeoman 生成的 MEAN 堆栈创建了一个应用程序 angular-fullstack 我很乐意包括 uncss到我的 grunt 构建。 不幸的是,鉴于该站点是 SPA,这是不可能的。
我正在学习如何为 RISC-V 处理器编写代码。我想将 0xFFFFFFFF 的值存储到内存/寄存器中。 我可以通过在 addi 指令之前添加 lui 来扩展它的 12 个立即位,像这样的东西: lu
LUI (load upper immediate) is used to build 32-bit constants and uses the U-type format. LUI places
我正在做作业,我需要记下 5 条指令的控制信号值,并试图先找出样本(代码在底部)。我需要做的 5 条指令是 Address Code Basic S
A disadvantage of this pattern is that if a private function refers to a public function, that publi
我的教授将此作为家庭作业问题的答案之一发布。谁能帮我解决这个问题吗?我不明白他对 CON1 - CON4 做了什么以及 >> 和 0x0FFF 是什么意思。 CON1: EQU 6000 CON2
我是一名优秀的程序员,十分优秀!