新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機尋址方式小結

        單片機尋址方式小結

        作者: 時間:2013-03-08 來源:網絡 收藏

        當前,種類很多,且實際工作中僅應用一種也是不現實的,必得對常用的幾種有所了解。

        盡管現在單片機編程大多使用C語言,但必得對單片機的內核結構、及指令集有一定的了解,才有可能寫出優秀的程序代碼。對于單片機指令的學習,的學習是其中的一個重點和難點,的正確理解不僅對匯編編程至關重要,而且有助于對于單片機內核結構(如RISC和CISC的區別)、的更深刻理解。

        但是,不同單片機都提供了一些不同的,且即使同樣的尋址方式在不同的單片機中也有不同的名稱,使得尋址方式顯得混亂,不一致,不易理解。

        不過,經過仔細的對比、學習和分析,我發現,其實所有的尋址方式,都可以歸為以下六類:

        1)立即尋址

        2)無址尋址

        3)寄存器直接尋址

        4)寄存器間接尋址

        5)內存直接尋址

        6)內存間接尋址

        下面對以上六類指令一一分解:

        1、立即尋址,即在指令中直接給出實際的操作數數值,如MOV R1,#0

        2、無址尋址,就是說指令中根本沒有給出操作數或操作數地址,其原因可能是以下兩者之一:其一,本指令確實不需要操作數,如NOP指令;其二,本指令本身就是專門為某一個操作數制造的,它不可能用來操作其他的操作數,如CLRA指令(由其名稱可知,它用來清零累加器A)。

        3、寄存器直接尋址,這是一種十分重要,十分常見,也十分易于理解、易于掌握和應用的尋址方式,就是在指令中直接給出寄存器編號(在匯編中,給出的是寄存器的標號,也可以視作寄存器的名稱)作為操作數的尋址方式,而待操作的數據就存在此寄存器中。如指令MOV R1,R2就是一條雙操作數都采用寄存器直接尋址的指令。

        另外,這種尋址方式在一些處理器構架中又會有一些細微變化,如在ARM中由于大量使用寄存器直接尋址方式,為了增強此尋址方式的威力,ARM處理器中的寄存器直接尋址加入了移位功能,即在實際指令執行中的數據不是簡單的寄存器中直接存儲的數據,而是此數據經過移位后得到的數據。

        4、寄存器間接尋址,如同寄存器直接尋址,都是在指令編碼中給出寄存器編號(在匯編中表現為寄存器名稱);但與寄存器直接尋址不同的是,此處寄存中存儲的并非操作數本身,而是操作數在內存中的位置,即操作數的地址(相當于C語言中的指針),在內存中此地址處存儲的才是真正的操作數。所以,CPU要獲取此操作數,在微觀上需要進行兩次數據獲取操作,第一次從寄存器中獲取操作數的地址,第二此從剛才獲取的地址處在內存中獲取真正的操作數。在多數處理器中,指令使用寄存器間接尋址比使用寄存器直接尋址運行要耗費更多的指令周期。如指令 MOV R1,@R2將R1中的數據復制到R2中地址所指向的內存中。

        寄存器間接尋址是變種最多、擴展最多的尋址方式,正因如此,他也是處理器中最為靈活、最為強大、最為難于掌握的尋址方式。不僅不同處理器對它進行了不同的擴展,而且即使對于完全相同的擴展,不同匯編中也可能給出相差極大的書寫格式,這就更加導致了寄存器間接尋址難于理解、難于掌握。

        其擴展主要有以下形式:1)自增、自減型,@R1++、@R1--、@(--R1)、@(++R1),看到它們的書寫形式大家應該也大體明白它們的意思了,當然具體的匯編書寫格式那就根據不同的處理器和匯編器變得五花八門了,比如有的不用@號而用中括號,有的只用一個加減號而不是兩個,有的只提供了四種變體中的一種或幾種,情況不一而足,但其實質內容卻大體一致。2)索引型(或叫偏移型),就是指寄存器中存儲的地址還不是操作數的最終地址,須得對此地址加一個數才是最終的操作數地址。這種情況就更加復雜了,其一,書寫格式更加紛亂,如我就見過X(R1)、[R1,X]、(R1+X)等多種形式;其二,偏移量X本身也涉及尋址方式這個問題,最常用的當然是立即尋址和寄存器直接尋址兩種,但也不排除有更加復雜的寄存器間接尋址這種方式的使用,要是這個X本身要是也能使用寄存器間接尋址的變種——索引尋址,那可就真是熱鬧了(試想一下,這不就是迭代了嗎)。

        5、內存直接尋址,就是在指令中直接給出操作數的地址——存儲于內存中的位置,表現在匯編中,為了區分立即數和內存地址,一般對地址加或$前綴。如 MOV R1,$100

        這個內存地址可以可以分兩種情況給出:其一,直接給出完整的地址;其二,僅給出一個偏移量,將此偏移量加上PC才能得到操作數的地址。其中,前者一般叫做絕對尋址,后者一般叫做相對尋址(當然,有些匯編中可能并不這樣稱呼),二者很容易理解,也很容易區分。當然,二者也是各有優劣:絕對尋址簡化了執行電路,因為他無需進行PC和偏移量的加法運算;而相對尋址則可精簡編碼長度,從而節省程序存儲器消耗,當然,還有一個更加重要的好處,那就是可以利用這個特性編寫“可搬移”的代碼。因為使用相對地址,那么把程序整段搬移到其他的地址空間去,程序也能夠正確的執行而不致出差。

        對于同時提供了絕對尋址和相對尋址的CPU,在其匯編語法層面就需要給出區別兩種尋址方式的語法,由于不同匯編給出的解決方法不同,這里僅以MSP430編程手冊中給出的匯編語法為例進行介紹,以方便理解:

        相對尋址:MOV ADDR,R4

        絕對尋址:MOV ADDR,R4

        可見,這里是通過一個“”符合進行絕對尋址和相對尋址的區分的。

        另外,還有一個不大不小的問題需要注意,很多時候,使用內存直接尋址的匯編中并不直接給出地址數值,而是給出“標號,即label”,匯編器自己把這個標號用實際的地址值進行替代,所以就免除了地址的手工計算的麻煩。

        6、內存間接尋址,參考寄存器直接尋址與寄存器間接尋址的異同,我們可以通過上面講到內存直接尋址來推測出內存間接尋址的內容和概念。但是,鑒于在嵌入式處理器和單片機中一般都不使用內存間接尋址方式,所以,這里也就不再展開談了。

        另外,應該清楚,尋址方式并不是處理器設計者想怎么設計就怎么設計的,它很大程度上是由處理器內核結構和所決定的。一般來說,立即尋址和無址尋址在所有的處理器或單片機中都是存在的;而RISC構架的處理器中一般大量使用寄存器直接尋址,而寄存器間接尋址和內存直接尋址一般只用于加載(LDR)、存儲(STR)指令之中,內存間接尋址則在RISC中基本不使用;而對于CISC架構的處理器,不僅大量使用寄存器直接尋址,而且大量使用靈活多變的寄存器間接尋址和內存直接尋址,甚至于會提供強大的內存間接尋址。所以,CISC構架處理器的指令一般功能更豐富、更強大,可以用比RISC技術更少的指令完成相同的功能,但代價是必須增加更多的地址解析譯碼電路,增加了芯片體積和功耗。

        當然,我學單片機時間也不長,水平一般,也沒有了解過太多的單片機,只是就自己了解過的ARM、51、AVR、PIC和MSP430做一個小小總結,希望能幫助初學者更快的學習和理解單片機指令。但是能力和見識有限,未免以偏概全,所以也希望功力深厚、見識廣博的老前輩能夠指正錯誤,或添加其他未提到的尋址方式。當然,若是那位有更好的尋址方式歸納總結方法分享,那將是更好了。

        c語言相關文章:c語言教程


        單片機相關文章:單片機教程


        單片機相關文章:單片機視頻教程


        單片機相關文章:單片機工作原理




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 延寿县| 怀化市| 屯门区| 琼海市| 兴业县| 桃江县| 阳朔县| 昌图县| 鹿邑县| 华阴市| 建湖县| 确山县| 韶山市| 正阳县| 祥云县| 钦州市| 宝兴县| 陆川县| 固始县| 浦东新区| 温州市| 沙湾县| 开平市| 木兰县| 临漳县| 商城县| 收藏| 汝城县| 南和县| 连江县| 岑巩县| 乌海市| 巫溪县| 吉安县| 秦皇岛市| 定日县| 海兴县| 新民市| 晋江市| 东安县| 芦溪县|