1. 程式人生 > >自己動手寫CPU之第九階段(2)——載入存儲指令說明2(lwl、lwr)

自己動手寫CPU之第九階段(2)——載入存儲指令說明2(lwl、lwr)

上傳 open 送書 運算 ada 讀者 str ast base

將陸續上傳新書《自己動手寫CPU》。今天是第38篇,我盡量每周四篇,可是近期已經非常久沒有實現這個目標了。一直都有事,不好意思哈。

開展曬書評送書活動,在

q=%E4%BA%9A%E9%A9%AC%E9%80%8A&ie=utf-8&src=se_lighten_f" style="color:rgb(51,102,153); text-decoration:none; font-family:Arial; font-size:14px; line-height:26px; display:inline; position:static">亞馬遜、京東、當當三大圖書站點上,發表《

自己動手寫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)
技術分享


自己動手寫CPU之第九階段(2)——載入存儲指令說明2(lwl、lwr)