zoukankan      html  css  js  c++  java
  • 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)

    将陆续上传新书《自己动手写CPU》。今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了。一直都有事,不好意思哈。

    开展晒书评送书活动,在亚马逊、京东、当当三大图书站点上,发表《自己动手写CPU》书评的前十名读者。均可获赠《步步惊芯——软核处理器内部设计分析》一书。大家踊跃參与吧。活动时间:2014-9-11至2014-10-20


    今天继续对MIPS32中载入存储指令进行说明(主要是lwl、lwr),上次已经介绍一些其它的载入存储指令,大家能够回想。


    9.1.4 载入指令lwllwr说明

          载入指令lwllwr的格式如图9-6所看到的。


    •  当指令中的指令码为6'b100010时,是lwl指令。非对齐载入指令,向左载入

          指令使用方法为:lwl rt, offset(base)

          指令作用为:从内存中指定的载入地址处,载入一个字的最高有效部分。lwl指令对载入地址没有要求。从而同意地址非对齐载入,这是与前面介绍的lhlhulw指令的不同之处。在大端模式、小端模式下,lwl指令的效果不同,由于OpenMIPS是大端模式,所以此处仅仅介绍在大端模式下lwl指令的效果。如果计算出来的载入地址是loadaddrloadaddr的最低两位的值为n。将loadaddr最低两位设为0后的值称为loadaddr_align,例如以下。

    载入地址loadaddr = signed_extended(offset) + GPR[base]

    n = loadaddr[1:0]

    loadaddr_align = loadaddr – n

          比如:如果计算出来的载入地址是5lwl指令要从地址5载入数据。那么loadaddr就等于5n等于1loadaddr_align等于4

          lwl指令的作用是从地址为loadaddr_align处载入一个字,也就是4个字节,然后将这个字的最低4-n个字节保存到地址为rt的通用寄存器的高位。而且保持低位不变。

          继续上例,此时loadaddr_align4,所以从地址4处载入一个字,相应的是地址为4567的字节,由于n等于1,所以将载入到的字的最低3个字节保存到地址rt的通用寄存器的高3个字节。如图9-7所看到的。

    一个更加通用的描写叙述如图9-8所看到的。


    •  当指令中的指令码为6'b100110时,是lwr指令。非对齐载入指令,向右载入

          指令使用方法为:lwr rt, offset(base)

          指令作用为:从内存中指定的载入地址处,载入一个字的最低有效部分。还是如果计算出来的载入地址是loadaddrloadaddr的最低两位的值为n。将loadaddr最低两位设为0后的值称为loadaddr_align,例如以下。

    载入地址loadaddr = signed_extended(offset) + GPR[base]

    n = loadaddr[1:0]

    loadaddr_align = loadaddr – n

          比如:如果计算出来的载入地址是9lwr指令要从地址9载入数据。那么loadaddr就等于9n等于1loadaddr_align等于8

          lwr指令的作用是从地址为loadaddr_align处载入一个字。也就是4个字节。然后将这个字的最高n+1个字节保存到地址为rt的通用寄存器的低位,而且保持高位不变。

          继续上例,此时loadaddr_align8。所以从地址8处载入一个字,相应的是地址为891011的字节,由于n等于1。所以将载入到的字的最高2个字节保存到地址rt的通用寄存器的低2个字节。如图9-9所看到的。一个更加通用的描写叙述如图9-10所看到的。


          lwllwr指令配合能够实现从一个非对齐地址载入一个字,并且仅仅须要使用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进行逻辑“或”运算,得到终于结果

          而有了lwllwr指令后。仅仅须要2条指令就可以。

    例如以下。图9-11是对这个过程的描写叙述。

    lwl $1, 7($0)
    lwr $1,10($0)



  • 相关阅读:
    极大/小搜索,alpha/beta剪枝
    消息系统
    渲染主线程都在干什么
    好玩的虚拟CPU执行代码
    好玩的隐藏属性
    好玩的对象存储
    透视投影矩阵
    绕任意轴旋转
    视图变换
    正交投影矩阵
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7291357.html
Copyright © 2011-2022 走看看