assembly 地址在RISC-V I-Type的立即字段中可以是负数吗?

332nm8kg  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(126)

我了解到在RISC-V伊萨中不需要'subi',并且立即字段表示一个二进制补码整数来完成整个操作。
我的问题是,如果立即部分可以表示为负数,那么我们是否也可以将地址表示为负整数?

e3bfsja2

e3bfsja21#

地址在RISC-V I-Type的立即字段中可以是负数吗?
immediate字段实际上并不存储地址--它太短了,不能存储地址。它存储的是中小型整数,并且在使用中进行了有符号扩展,以便它可以存储正整数和负整数。
我了解到在RICS_V伊萨中不需要'subi',并且立即字段表示一个二进制补码整数来完成整个操作。
是的。immediate字段在使用前确实是符号扩展到32(或64)位的,所以我们可以添加一个负的immediate而不是减去一个正的immediate。
我的问题是,如果立即部分可以表示为负数,那么我们是否也可以将地址表示为负整数?
后一项不是前一项的结果。
存储器系统有一个地址总线,它只是一个有序的位数组。在地址总线上没有考虑符号或负值-MSB被视为更高的幅度,而不是符号位。因此,我们认为地址是无符号数。
但是,没有什么可以阻止你将内存地址解释(例如打印)为有符号整数。
有符号数的2的补码表示意味着当加、乘、减或比较有符号数时,与使用无符号数进行相同的操作时,出现相同的位模式。由于结果的位模式是相同的,因此真实的区别在于确定溢出,因为有符号数和无符号数溢出的方式不同。
我们应该对地址使用无符号算术,因为无符号有适当的溢出条件:全1的值是一个大的正数,如果递增,溢出并变为0。
相比之下,如果我们对地址使用带符号的算术,当从所有的1到0时,我们不会得到溢出,即使我们应该得到溢出。此外,如果我们将1添加到01111...111产生10000...000,我们会在不应该得到溢出时得到溢出。
请注意,在很多情况下,我们不需要检查溢出,尤其是地址和指针算法。如果程序是正确的,那么当计算我们知道存在的某个内存的地址时,计算就不会溢出。因此,验证内存分配是否成功是很重要的。

相关问题