歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

PowerPc下的尋址模式

本篇文章主要描述了Powerpc的尋址模式,讓自己對內存映射、尋址的概念理解深入些。

在開始討論尋址模式之前,讓我們首先來回顧一下計算機內存的概念。可能之前已經了解了關於內存和編程的一些事實,但是由於現代編程語言正試圖淡化計算機中的一些物理概念,因此復習一下相關內容是很有用的:

·主存中的每個位置都使用的連續的數字地址編號,內存位置就使用這個地址來引用。

·每個主存位置的長度都是一個字節。

·較大的數據類型可以通過簡單地將多個字節當作一個單位實現(例如,將兩個內存位置放到一起作為一個 16 位的數字)。

·寄存器的長度在32位平台上是4個字節,64位8個。

·每次可以加載1、2、4、8個字節的內存到寄存器。

·非數字數據可以作為數字數據進行存儲---惟一的區別在於可以對這些數據執行哪些操作,以及如何使用這些數據。

新接觸匯編語言的程序員有時可能會對我們有多少訪問內存的方法感到驚奇。這些不同的方法就稱為尋址模式。 有些模式邏輯上是等價的,但是用途卻不同。它們之所以被視為不同的尋址模式,原因在於它們可能根據處理器采用了不同的實現。

有兩種尋址模式實際上根本就不會訪問內存。在立即尋址模式中,要使用的數據是指令的一部分(例如 li 指令就表示 “立即加載”,這是因為要加載的數字就是這條指令本身 的一部分)。在寄存器尋址模式 中,我們也不會訪問主存的內容,而是訪問寄存器。

訪問主存最顯而易見的尋址模式為直接尋址模式。在這種模式中,指令本身就包含了數據加載的源地址,該模式通常用於全局變量訪問、分支以及子程序調用。稍簡單的模式為相對尋址模式,它會根據當前程序計數器來計算地址。這通常用於短程分支,其中目標地址距當前位置很近,因此指定一個偏移量(而非絕對地址)會更有意義。這就像是直接尋址模式的最終地址在匯編或鏈接時就知道了一樣。

索引尋址模式對於全局變量訪問數字元素來說是最為有效地一種方式。它包括兩個部分:一個內存地址以及一個索引寄存器。索引寄存器會與某個指定的地址相加,結果用作訪問內存時使用的地址。有些平台(非 PowerPC)允許程序員為索引寄存器指定一個倍數。因此,如果每個數組元素的長度都是 8 個字節,那麼我們就可以使用 8 作為倍數。這樣就可以將索引寄存器當作數組索引來使用。否則,就必須按照數據大小來增加或減少索引寄存器了。

寄存器間接尋址模式使用一個寄存器來指定內存訪問的整個地址,這種模式在很多情況中都會使用,包括:

1、解除指針變量的引用;

2、使用其他模式無法進行的內存訪問(地址可以通過其他方式進行計算,並存儲到寄存器中,然後使用這個值來訪問內存)。

基地址尋址模式的工作方式與索引尋址模式非常類似(指定的數字和寄存器被加在一起得到最終地址),但兩個元素的作用交換了。在基地址尋址模式中,寄存器中保存的是基址,數字是偏移量。這對於訪問結構中的成員是非常有用的。寄存器可以存放整個結構的地址,數字部分可以根據所訪問的結構成員進行修改。

這裡假設我們有一個包括 3 個域的結構體:第一個域是 8 個字節,第二個域是 4 個字節,最後一個域是 8 個字節。然後,假設這個結構體本身的地址在一個名為 X 的寄存器中。如果我們希望訪問這個結構體的第二個元素,就需要在寄存器中的值上加上 8。因此,使用基指針尋址模式,我們可以指定寄存器 X 作為基指針,8 作為偏移量。要訪問第三個域,我們需要指定寄存器 X 作為指針,12 作為偏移量。要訪問第一個域,我們實際上可以使用間接尋址模式,而不用使用基指針尋址模式,因為這裡沒有偏移量(這就是為什麼在很多平台上第一個結構體成員都是訪問最快的一個成員;我們可以使用更加簡單的尋址模式 —— 在 PowerPC 上這並不重要)。

最後,在索引寄存器間接尋址模式中,基址和索引都保存在寄存器中,所使用的內存地址是通過將這兩個寄存器加在一起來確定的。

指令格式的重要性

為了解尋址模式對於 PowerPC 處理器上的加載和存儲指令是如何工作的,我們必須先要對 PowerPC 指令格式有點了解。PowerPc使用了加載/存儲(也叫RISC)指令集,這意味著訪問主存的唯一時機是將內存加載到寄存器或將寄存器中的內容復制到內存中時。所有實際的處理都發生在寄存器之間(或 寄存器和立即尋址模式操作數之間)。另外一種主要的處理器體系結構 CISC(x86 處理器就是一種流行的 CISC 指令集)幾乎允許在每條指令中進行內存訪問。采用加載/存儲體系架構的原因是這樣可以使處理器的其他操作更加有效。實際上,現代 CISC 處理器將自己的指令轉換成了內部使用的 RISC 格式,以實現更高的效率。

PowerPc上的每條指令都正好是32位長的,指令的opcode(操 作符,告訴處理器這條指令是什麼的代碼)占據了前6位。這個32位的長度包含了所有的立即尋址模式的值、寄存器引用、顯式地址以及指令選項。這實現了非常好的壓縮。實際上,內存地址對於任何指令格式可以使用的最大長度只有24位,最大只能為我們提供16Mb的可尋址空間。但不要擔心 —— 有很多方法都可以解決這個問題。這只是為了說明為什麼指令格式在 PowerPC 處理器上是如此重要 —— 我們需要知道自己到底需要使用多少空間!

其實不必記住所有的指令格式就能使用它們。然而,了解一些指令的基本知識可以幫助我們讀懂 PowerPC 文檔,並理解 PowerPC 指令集中的通用策略和一些細微區別。PowerPC 一共有 15 種不同的指令格式,很多指令格式都有幾種子格式。但只需要關心其中的幾種即可。下面看下基址用於尋址的指令格式:

使用D-Form和DS-Form指令格式對內存尋址

D-Form指令是主要的內存訪問指令格式之一,它格式如下:

0-5位:操作碼

6-10位:源/目標寄存器

11-15位:地址/索引寄存器/操作數

16-31位:數字地址、偏移量或立即尋址模式值

此格式可用來加載、存儲和立即尋址模式的計算,可用於包括立即尋址模式、直接尋址模式(指定地址/索引寄存器為0)、索引尋址模式、間接尋址模式(指定地址為0)和基地址尋址模式等尋址方式。

D-Form指令非常靈活,可用於任何寄存器加地址的內存訪問模式。然而,對於直接尋址和索引尋址來說,它的用處就比較有限了,因為它只能使用一個16位的地址域,所以其提供的最大尋址范圍是64K。對於立即尋址、間接尋址和基地址尋址模式,基存儲器可以保存64位的地址范圍,所以基本不受限制。

DS-Form只在64位指令中使用,它和D-Form類似,不同的是它使用地址的最後兩位為擴展操作符,然而,它會在地址的值部分最右邊加上兩個0,其范圍與D-Form指令相同(64K),但卻將其限制位32位對其的內存。

使用D-Form和DS-Form指令格式對內存尋址

X-Form用於進行索引寄存器間接尋址模式,其中兩個寄存器中的值會被加在一起來確定加載/存儲的地址。它格式如下:

0-5位:操作碼

6-10位:源/目標寄存器

11-15位:地址計算寄存器A

16-20位:地址計算寄存器B

21-30位:擴展操作符

31位:保留未用

X-Form的優點除了非常靈活外,還為我們提供了非常廣泛的尋址范圍,在D-Form中,只有一個值及寄存器來指定一個完整的范圍。而在X-Form中,由於我們有兩個寄存器,這兩個組件都可以根據需要指定足夠大的范圍。因此,在使用基指針尋址模式或索引尋址模式而D-Form固定部分的16位范圍太小的情況下,這些值可以存到寄存器中並使用X-Form。

Copyright © Linux教程網 All Rights Reserved