歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> PowerPC匯編指令集簡析

PowerPC匯編指令集簡析

日期:2017/3/1 11:17:33   编辑:Linux編程

在了解PowerPC匯編指令前,需要先看下編程所用的寄存器模型,PowerPC系統結構為大多數運算指令都定義了Register-Register的操作,這些操作的源操作數從寄存器取得,或作為嵌入指令操作碼中的立即數提供。這裡的e300核可分為用戶編程模型和管理員編程模型,該模型有32個GPR、32個FPR、特殊目的寄存器SPR和一些功能寄存器,下圖為二者的示意圖:

上面這些寄存器可能不太好理解,因為名字和Intel匯編不一樣,其實,可以這樣理解,GPR就相當於EAX/EBX/ECX,而CTR則完全就是ECX的功能,是吧?區別就是沒有堆棧而已咯。CR被分為8段,每段4位,分別代表LT、GT、EQ和SO(小於、大於、等於和溢出);LR用於記錄跳轉地址;特殊寄存器XER用於記錄溢出和進位標志;FPSCR用於記錄浮點運算類型和異常等。

再看下指令集,大部分的CPU指令集可分為:數據讀寫、數值計算、流程控制和設備管理四個部分,由於PowerPC使用RISC,指令字長為32bit,Endian一般是可調的,默認為大端,另外,PowerPC沒有棧,所以程序需要自己實現相關操作。首先為運算和邏輯指令,列舉如下:

它們與通用寄存器有關,源數據來自GPR 或16 位立即數,目的是GPR 寄存器,操作為32 位,GPR 中存放32 位更新數據。大多數指令都可以根據字面意思理解其作用,注意還有一個“cntlzw”指令,意為計算字中的第一個0,用於在一個字中找到1時將一個指令中的0的數量找出,它在決定例外寄存器中最高優先服務時有用。

下面是數據讀寫指令,它們對數據在存儲器中核通用寄存器中的傳送很有用,若數據小於傳送長度(單字,半字或字節),指令會使數據變位為32位,將不同位填0或符號擴展。指令列舉如下:

這裡需要注意的是上面列舉的lbz和lhz兩個指令並不完全等同於mov al,[ebx]和mov ax,[ebx+10]這兩個,因為前面兩個是將字節和半字加載到r3時還清空了高位,而後兩條指令只是加載數據到eax,並不會清空高位。

另外,還有兩個指令sthbrw和stwbrx,對PowerPC存取小端格式數據很有用,它們允許存取這樣的數據,若數據以小端順序進入總線,就把它存為大端順序。

好了,現在來詳細看下賦值指令,下面是最常見的賦值代碼:

lis r3,0x1234

addi r3,r3,0x5678

這段代碼的含義是將0x12345678加載到寄存器r3中。因為在RISC下,PowerPC的每條指令都是32bit,除去指令和寄存器參數編碼,只剩下16bit的長度描述立即數,如立即數加載指令li:

這樣立即數SIMM只有16位,所以需要兩次加載,使用lis(立即數載入並左移)和addi(立即數加法)兩條指令完成。

再看下PowerPC不同的子程序調用:

  1. func: /* 子程序入口 */
  2. blr /* 返回(跳轉到lr地址) */
  3. start:
  4. bl func /* 調用func(跳轉並保存地址到lr) */
  5. li r1,1 /* 設置r1、r3 */
  6. li r3,1
  7. sc /* 系統調用,結束程序 */

這裡的調用由PowerPC使用lr寄存器完成,在bl指令跳轉前,下一條指令li r1,1的地址會被保存在lr,而執行的func中的blr時,系統會跳到lr表示的地址,完成返回。

Copyright © Linux教程網 All Rights Reserved