将陆续上传新书《 自己动手写CPU 》,今天是第38篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈。 开展晒书评送书活动,在 亚马逊 、京东、当当三大图书网站上,发表《 自己动手写CPU 》书评的前十名读者,均可获赠《步步
将陆续上传新书《 自己动手写CPU 》,今天是第38篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈。
开展晒书评送书活动,在 亚马逊 、京东、当当三大图书网站上,发表《 自己动手写CPU 》书评的前十名读者,均可获赠《步步惊芯——软核 处理器 内部 设计 分析 》一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-20
今天继续对MIPS32中加载存储指令进行说明(主要是lwl、lwr),上次已经介绍一些其他的加载存储指令,大家可以回顾。
9.1.4 加载指令 lwl 、 lwr 说明
加载指令 lwl 、 lwr 的格式如图 9-6 所示。
当指令中的指令码为 6 'b100010 时,是 lwl 指令,非对齐加载指令,向左加载
指令用法为: lwl rt, offset(base)
指令作用为:从内存中指定的加载地址处,加载一个字的最高有效部分。 lwl 指令对加载地址没有要求,从而允许地址非对齐加载,这是与前面介绍的 lh 、 lhu 、 lw 指令的不同之处。在大端模式、小端模式下, lwl 指令的效果不同,因为 OpenMIPS 是大端模式,所以此处只介绍在大端模式下 lwl 指令的效果。假设计算出来的加载地址是 loadaddr , loadaddr 的最低两位的值为 n ,将 loadaddr 最低两位设为 0 后的值称为 loadaddr_align ,如下。
加载地址 loadaddr = signed_extended(offset) + GPR[base]
n = loadaddr[1:0]
loadaddr_align = loadaddr – n
例如:假设计算出来的加载地址是 5 , lwl 指令要从地址 5 加载数据,那么 loadaddr 就等于 5 , n 等于 1 , loadaddr_align 等于 4 。
lwl 指令的作用是从地址为 loadaddr_align 处加载一个字,也就是 4 个字节,然后将这个字的最低 4-n 个字节保存到地址为 rt 的通用寄存器的高位,并且保持低位不变。
继续上例,此时 loadaddr_align 为 4 ,所以从地址 4 处加载一个字,对应的是地址为 4 、 5 、 6 、 7 的字节,因为 n 等于 1 ,所以将加载到的字的最低 3 个字节保存到地址 rt 的通用寄存器的高 3 个字节。如图 9-7 所示。一个更加通用的描述如图 9-8 所示。
当指令中的指令码为 6 'b100110 时,是 lwr 指令,非对齐加载指令,向右加载
指令用法为: lwr rt, offset(base)
指令作用为:从内存中指定的加载地址处,加载一个字的最低有效部分。还是假设计算出来的加载地址是 loadaddr , loadaddr 的最低两位的值为 n ,将 loadaddr 最低两位设为 0 后的值称为 loadaddr_align ,如下。
加载地址 loadaddr = signed_extended(offset) + GPR[base]
n = loadaddr[1:0]
loadaddr_align = loadaddr – n
例如:假设计算出来的加载地址是 9 , lwr 指令要从地址 9 加载数据,那么 loadaddr 就等于 9 , n 等于 1 , loadaddr_align 等于 8 。
lwr 指令的作用是从地址为 loadaddr_align 处加载一个字,也就是 4 个字节,然后将这个字的最高 n+1 个字节保存到地址为 rt 的通用寄存器的低位,并且保持高位不变。
继续上例,此时 loadaddr_align 为 8 ,所以从地址 8 处加载一个字,对应的是地址为 8 、 9 、 10 、 11 的字节,因为 n 等于 1 ,所以将加载到的字的最高 2 个字节保存到地址 rt 的通用寄存器的低 2 个字节。如图 9-9 所示。一个更加通用的描述如图 9-10 所示。
lwl 与 lwr 指令配合可以实现从一个非对齐地址加载一个字,而且只需要使用 2 条指令,提高了效率。例如:使用一般指令从地址 7 处加载一个字,那么可以使用以下代码实现,共 5 条指令。
lw $1, 4($0) # 取得地址0x4处的字,保存在$1中 lw $2, 8($0) # 取得地址0x8处的字,保存在$2中 sll $1, $1, 24 # $1左移24位 slr $2, $2, 8 # $2右移8位 or $1, $1, $2 # $1与$2进行逻辑“或”运算,得到最终结果
而有了 lwl 、 lwr 指令后,只需要 2 条指令即可。如下,图 9-11 是对这个过程的描述。
lwl $1, 7($0) lwr $1,10($0)
查看更多关于自己动手写CPU之第九阶段(2)加载存储指令说明2(lwl、lwr的详细内容...