對暫存器的認識

2021-04-13 13:47:14 字數 2876 閱讀 1313

三、對暫存器的認識

暫存器 (register) 相當於調色皿,資料相當於色料。把色料放進調色皿裡,為的是要得到預定的效果,暫存器對於資料亦然。

調色皿有大有小,深度有深有淺,其目的是針對不同的情況,以作有效的處理。暫存器也是一樣,應用得好,程式會很精簡,容易修改、閱讀。否則,想到哪乙個就用哪乙個,沒有原則,沒有章法,這種程式委實不敢恭維。

暫存器的重要性,在於處理方便靈活、速度快,占用空間小。不幸8088 cpu的暫存器很少,用起來總是捉襟見肘,辛苦異常。正因為此,暫存器的善用與否,成為程式效能高低的關鍵技術。

有些程式師不願意精打細算,經常設定一些「緩衝器」,利用緩衝器可以任意定名、便於記憶的優點,竟把珍貴的暫存器,當作各緩衝器間、搬運資料的交通工具,只見資料不停的搬進搬出。雖然程式師省了點事,但執行速度白白浪費了,空間也被糟蹋了。寫這樣的組合程式,遠不如去用高階語言。

當然,緩衝器是有必要的,但也只限於「必要」的情況,而且,在程式規劃時,就要考慮各種應用的條件,把緩衝器內的值取出後,一次處理完畢。如果不能一次解決或是經常要用到的資料,則設法放在暫存器中。

實際上,任何程式不可能在乙個過程中,同時需要很多特殊的資料。好的程式師能把複雜的工作處理得有條不紊,功力不夠的,往往把簡單的事情弄得令人難以理解。8088的暫存器的確是不夠用,但是卻不至於少到要以緩衝器取代的地步。

工作的好壞、成敗,與人的組織能力有絕對的關係,限於篇幅,我們不能多談。可是,利用暫存器的特性,來處理繁雜的資料,倒也是訓練組織力的方法之一。

首先,我們應該把暫存器視為工具,了解工具的功能、性質,然後要能銘記於心,純熟地加以運用。

根據個人的理解,暫存器概分六類:

1,分段用

程式段 code segment                :cs

資料段 data segment                :ds

堆疊段 stack segment               :ss

特設段 extra segment               :es

2,堆疊用:

堆疊值 stack pointer               :sp

棧用器 base pointer                :bp

3,記憶轉換用:

源存器 source index                :si

終存器 destination index           :di

4,一般用:

累積器 accumulator                 :ax

兼用器 base                        :bx

計數器 counter                     :cx

資料器 data                        :dx

5,標誌用:旗號值 status              :flag

6,指示用:執行值 instruction pointer :ip

為了便於記憶,我們給暫存器定中文名,其定義為:

如:資料段為 1600h,乘16即為16000h。

應注意者,各種以「器」定名的暫存器,皆有限用的段,切勿混用。

凡定名為「值」者,皆為不能用來供程式寫作的暫存器。如堆疊值(sp)系指示堆疊所在位置;旗號值(flag)表示旗號標誌的情況;執行值(ip)則代表程式當前所執行的位址。這些暫存器值並非不能改變,但對技巧尚不夠純熟者,最好保持原值,不要妄動。

經常使用的「器」有兩種,一以16位元為單位,如棧用器、源存器及終存器; 另一種則具有兩個分別稱「高位」及「低位」、各有8位元,可單獨使用,也可合併為16位元的暫存器ax,bx,cx,dx。

暫存器通常作為容器用,但有些多用為記憶區之定址,以便將其中貯存的資料取出應用。前者稱為容器功能,可以作計算、邏輯處理等。後者稱為定址功能,係供處理各「器」所定位址的資料用。由於8088 cpu的定址方式,受限於當初不成熟的設計理念,偏偏 ibm獨具慧眼,選中了它,所謂城門失火,殃及池魚,讀者不得不多花點功夫,小心應付。

棧用器(bp)屬於堆疊段的記憶位置,系提供給高階語言結構使用,對組合語言來說,功能不大,但若善於運用,也不無價值。

源存器(si)固定指向資料段,將源存器中的資料取出,所指的是取出資料段中的資料。設若

ds=2000h   si=1234h,則

si中的1234h 係指系統中 2000h×16加上位址值 1234h。

不過,使用者不必去計算,只要知道是由資料段起,位址為1234h 即可。

終存器(di)較為複雜,通常它是指向資料段,可是有幾個指令涉及大量資料轉移,需要由源存器搬到終存器。由於受限於分段的設計,為了便於段間應用,所以特別規定:在這種情況下終存器系指向特設段(es)。也就是說,只能由資料段移向特設段。程式師可以先設定各段的段暫存器,再作轉移。若要在同一段中作資料轉移,則應使資料段=特設段。

一般用的暫存器,都可以分成兩個8位元、各命名為高、低位暫存器,如:

累積器:ax  高位 ah ,低位 al

兼用器:bx  高位 bh ,低位 bl

計數器:cx  高位 ch ,低位 cl

資料器:dx  高位 dh ,低位 dl

其中累積器的功能最強,可以做乘、除計算,ah尚有貯存旗號的特殊指令。尤其是從記憶區中取值或將值放進記憶區內時,效率最高,如 lods , stosw等。

由於其功能高,運用靈活,所以宜於打雜,千萬不要賦與固定的使命。

兼用器則有一種重要的特性,它是一般用暫存器中,唯一能自記憶區中讀取資料者(xlat指令除外),所以作為「資料及定址轉換」 (後文將專門介紹此一功能) 方便異常。

計數器常用作「迴路」或次數的記錄,也有專用的指令,除非不得已,或者計數用得不多,最好保留備用。

資料器功能最少,最好固定其用途,選擇經常需要應用的資料,置放其中,以便發揮時間空間的最高效率。 

暫存器的認識

對於8086的系統 1.暫存器按照功能的不同可分為通用暫存器 ax,bx,cx,dx,sp,bp,si,di。其中的前四個暫存器可分別分成ah,al bh,bl ch,cl dh,dl的八位暫存器 指令指標暫存器 ip 標誌暫存器 flags 段暫存器 cs,ds,es,ss 它們的區別和聯絡體現在...

對暫存器的理解

在進行嵌入式開發過程中,暫存器可以說是與嵌入式工程師打交道最多的東西,因為偏向底層的驅動開發,幾乎都是利用暫存器完成的。那麼,暫存器到底是什麼呢?下面為自己的一些理解,如有錯誤之處,還望海涵與糾正,謝謝!在正式進入暫存器的知識之前,首先對記憶體對映進行簡單的介紹。此處以ti公司的dsp28335晶元...

對暫存器的操作

接觸了一陣子的stm32函式庫,使用起來挺方便的,但是很少有處理器會有函式庫,大部分情況下還是要自己來對暫存器進行操作,所以還是不要生疏了對暫存器的操作。對暫存器的操作有時候要考慮對其不同的位進行先後順序不同的設定,因為這樣可能達不到預期的效果,這個不太好總結,但是對暫存器操作的方法是固定的。在這之...