PowerPC VxWorks BSP分析(2)–PowerPC彙編

NO IMAGE

 PowerPC彙編

這裡總結PPC指令集中幾種常用的指令。
首先為運算和邏輯指令,它與通用暫存器有關,源資料來自GPR或16位立即數,目的是GPR暫存器,操作為32位,GPR中存放32位更新資料,大多數都可以望文生義,注意在最後列的“cntlzw”指令“計算字中的第一個0”,在一個字中找到1時將一個指令中的0的數量找出,它在決定例外暫存器中最高優先服務時有用,我們將在例外處理那章討論。
下面為裝入儲存指令,它們對資料在儲存器中和通用暫存器中傳送非常有用,如果資料小於一個字,為半個字或一個位元組。指令總是使資料變位32位,將不同位填0或符號擴充套件。
“lbz”為“存0入位元組”。
“lha”為“存半字”,意思為將符號擴充套件到一個字。
“lhz”為“存半字擴充套件”。
下一個為“lwz”指令,它為“存字擴充套件0”它為PPC在64位結構中使用準備,但在32位結構中也可以使用。這個縮寫不變。
還有“store byte”指令,“store half word”和”store word”。
下面我們看到”load multiple word” , “store multiple word” , “load string word” 和”store string word” 。
另外,還有2個指令結尾位“brx” – “sthbrx”  和 “stwbrx” 它 對 PPC 存 取 小 ENDIAN 格式資料非常有用,有可能是PowerPC與其他使用小ENDIAN格式資料的處理機共用儲存器,為使PowerPC可以存取這樣的資料,這些指令允許存取這樣的資料。如果資料以小ENDIAN順序進入匯流排,就把它存為大ENDIAN順序。
下面介紹支援指令流控制的幾個指令,它包括轉移指令.這裡我們看到轉移指令,條件轉移指令,它們利用條件暫存器的位來決定是否轉移,在指令的右邊說明了條件暫存器,它分為4個4位域,在每一域中的位代表小於、大於、等於和總和溢位,這個暫存器提供了8種支援條件轉移指令的條件域。
同樣還有轉移到計數器的指令,SPR9用在使用者態程式設計模式中
特殊用途暫存器8可以完成基於接連暫存器的轉移指令,SPR8儲存著轉向子程式的地址。
還有自陷指令,一個系統呼叫指令,“rfi”用於例外服務程式,還有許多影響條件暫存器的指令。
下面,我們看到處理機控制指令的表,一個非常重要的因素是這些指令可以完成特殊用途暫存器之間和通用暫存器之間的資料交換,不可以直接對特殊用途暫存器中的值進行處理,但是,可以將一個值先拷貝到一個通用暫存器上再處理,操作後,將資訊存到特殊用途暫存器上。
“特殊暫存器移出”指令將特殊暫存器中的資料移到通用暫存器上,“移入特殊暫存器”指令將通用暫存器上的資料移到特殊暫存器上。
舉例說,如果使用者要初始化計數暫存器,就要將資料裝入通用暫存器,這裡“裝入立即數”指令裝入R13和計數暫存器,然後,移入特殊暫存器指令將R13中的值裝入計數暫存器。
比較指令可以影響任何條件暫存器域。
基本的比較指令語法為縮寫cmp後面進跟著4個域。
第一域說明CR0~CR7中哪一個受影響,第2域指出長度,有2種長度選擇,32位或64位,MPC860中只有32位。第三和第四域指出將會比較的暫存器rA和rB。
第二種比較的格式為“cmpl”比較邏輯,第三種為“cmpi”立即比較,第四種為“cmpli” 是立即比較邏輯;
比較功能也可以用簡化的縮寫完成,第一個例子是“cmpw r13, r14”,等於“cmp cr0,0,r13,r14”,表中下面的例子說明可以在運算元中包括cr5,它是用來指定cr5而不是cr0。
在下面還有2個舉例,有2個暫存器,r10包括16進位制的7千萬,r11包含16進位制的8千萬,第一個例子比較r10和r11並把值存入cr5中的條件位,在這裡cmpw是一個符號比較,即r11和r10中的值有符號值。16進位制,7千萬是一個大正數,16進位制8千萬是一個負數,這樣r10比r11大所以大於位設定,而“小於”位和“等於”位為0。
下一個指令相似但為邏輯,在這裡,引數作為無符號數處理,這樣,16進位制8千萬大於16進位制7千萬,所以11比10大,這樣小於位設定,而“大於”位和“等於”位為0。
這裡我們學習使用XER暫存器的多精度運算,XER包含3個位:總和溢位、溢位和進位。
程式設計者需要指出使用或修改XER的那位,可以利用字尾的“C”“E”和/或“O”。“C”在CA中記錄進位,“E”利用CA作為指令中的運算元在CA中記錄進位。最後,“O”在溢位和總和溢位中記錄溢位。
作為例子,一個簡單的“add”指令不使用XER,“addc”在CA中記錄進位,“adde”利用CA作為運算元並將進位記入CA,“addo”在OV中記錄溢位,“addco”在OV中記錄溢位,在CA中記錄進位。

本文出自 “Inside SW,FW and HW R&D” 部落格,請務必保留此出處http://21cnbao.blog.51cto.com/109393/133621