我是RISC-V公司的新手。
我在理解何时写PC (程序计数器)相关指令和何时编写PC绝对指令方面有困难。
例如,使用lui和jalr指令的指令被认为是PC-绝对值,而带有auipc的指令和jalr指令被认为是
据我所知,所有指令都将由PC执行,这样做的PC绝对指令似乎是隐藏的(即不知道PC)。
对我来说,那些电脑绝对的指令不会被执行。
有人能提供一些基本的例子来帮助我理解这一点吗?
发布于 2018-10-04 17:37:54
我认为你的问题是“个人电脑-绝对”的概念,这实际上不是一件事。您的选择是"PC相对“和”绝对“。RISC-V定义了两种寻址指令,使这些模式得以有效实施:
lui (加载上立即):这将rd设置为32位值,低12位为0,高20位来自U型即时。auipc (将上位立即添加到程序计数器):这将rd设置为当前PC和32位值之和,低12位为0,高20位来自U型即时。这些指令本质上是相同的:它们都采用U型直接(即32位数量的高20位),将其添加到某物中,并在rd中生成结果。不同的是,lui将直接添加到0,而auipc将其添加到PC。有时,更容易将这两种寻址模式看作是“PC相对”和“0相对”,因为这使得区别更加明确。
虽然auipc和lui都被设计成两条指令对中的第一条指令,但是第二条指令并不特别相关。auipc和lui都填写32位地址的高20位,留下它们配对的指令来填充低12位。I和S格式的指令在这里设计得很好,在基本ISA中的每一条指令都有一个I或S变体,这种格式是有意义的。
作为一个具体示例,下面的C代码执行一个非常简单的
int global;
int func(void) { return global; }例如,我们假设全局为0x20000004,而func中第一个指令的PC为0x10000008。
使用-mcmodel=medlow (0-相对寻址模式)编译时,您将得到
func:
lui a0, 0x20000
lw a0, 0x004(a0)如您所见,全局(0x2000004)的全部绝对地址被填充到指令对中。另一方面,当使用-mcmodel=medany (一种PC相对寻址模式)编译时,您将得到
func:
auipc a0, 0x10000
lw a0, 0x004(a0)这一次,只有auipc的PC与目标符号之间的偏移量出现在指令对中。这是因为PC显式地(通过使用auipc指令)包括在寻址计算中。在这种情况下,auipc将a0设置为0x2000004:执行的计算是a0 = PC + (imm20 << 12),这里有PC的0x10000004和imm20的0x10000。
这些PC相对寻址序列还允许一定程度的位置独立性:如果您非常小心地限制您正在做的操作,则可以生成链接的二进制文件,当加载到与它们连接的位置不同的偏移量时,这些二进制文件仍然可以工作。实际上,在POSIX风格的系统中,这还不足以完全独立于位置独立的寻址(这就是为什么我们和其他人一样,也有一个-fPIC参数),但是如果您是在一个受严格限制的嵌入式系统中,您可能可以逃脱它。
对于最后的问题,就像RISC-RISC中的其他所有内容一样,auipc和lui使用的即时性符号都扩展到了XLEN。在32位系统上,这些寻址模式可以在系统中生成任意地址,但64位系统并非如此。这就是为什么我们把这些称谓模式称为"medany“和"medlow":"med”代表"medium",意思是一个4 4GiB窗口,所有的全球符号都必须加入其中。“低”部分意味着该窗口以绝对地址0为中心,而在“任意”部分中,此窗口是围绕链接在任何PC上的。
发布于 2018-09-30 19:49:51
PC-相对 绝对的
如果地址是相对于代码本身的地址计算的,则调用一些指令(或代码) "PC相对“。
当一个地址没有相对于指令本身的地址计算时,您就称指令为“绝对”。
不幸的是,我不知道RISC,但是下面(旧的) 68000 CPU示例向您展示了它的含义:
x:
lea.l (PC+y-x-2), a0
lea.l (y).l, a0
...
y:这两个指令都将把地址y加载到寄存器a0中。
然而,两者之间存在着差异:
假设代码位于地址0x1000,地址y位于地址0x2000。
现在,我们将代码移动到地址0x1200,并在那里执行代码。会发生什么呢?
第一条指令将地址0x2200加载到寄存器:
该地址是相对于指令的地址计算的:它被计算为(address of the instruction)+0x1000。由于指令现在位于地址0x1000,而不是0x1200,所以写入寄存器的值将是0x2200,而不是0x2000。
这被称为(PC)相对寻址。
第二条指令将地址0x2000加载到寄存器中。它总是将0x2000值加载到寄存器中--指令本身的地址并不重要。
这被称为绝对寻址。
https://stackoverflow.com/questions/52574537
复制相似问题