天天看點

CPU尋址方式

       彙編語言的文法是指令+“指令目的操作數,源操作數”。需要處理的資料(立即數、位址、寄存器存放的資料等)稱為源操作數,而指令處理結果的存放目的地稱為指令目的操作數(寄存器、位址等)。而處理器是根據位址從存儲單元中取出指令來執行的,根據CPU通路資料(尋址)形式的不同劃分了以下幾種尋址方式:

尋址方式

寄存器尋址
立即數尋址
記憶體尋址 直接尋址
基址尋址
變址尋址
基址變址尋址

       此外,根據指令位址字段的形式位址是否是操作數的真正位址還分為直接尋址和間接尋址兩大類。

寄存器尋址

       當操作數不放在記憶體中,而是放在CPU的寄存器中時,從寄存器中取操作數的方式稱為寄存器尋址。寄存器尋址也分為寄存器間接尋址和寄存器直接尋址,兩者的差別在于:寄存器間接尋址方式的指令格式中的寄存器内容不是操作數,而是操作數的位址,該位址指明的操作數在記憶體中。

mov ax, bx      ;寄存器直接尋址
mov ax, [bx]    ;寄存器間接尋址
           

立即數尋址

       立即數尋址的源操作數是常數,之是以叫立即數,是相對于其他尋址方式中處理器需要從寄存器或記憶體中擷取操作數的方式而言的。立即數尋址中指令的位址字段指出的不是操作數的位址,而是操作數本身。立即尋址方式的特點是指令執行時間很短,因為它不需要通路記憶體取數,進而節省了通路記憶體的時間。

記憶體尋址

       相對于寄存器尋址的操作數在寄存器中和立即數尋址的操作數直接在指令中,操作數需要在記憶體中尋找的方式成為記憶體尋址。可供程式員操縱的寄存器數量有限,當操作數很多的時候采用寄存器尋址方式顯得捉襟見肘。而立即數尋址必須提前知道立即數是多少,否則不可用,且大多數時候操作數位于記憶體中的某個位置,隻知道操作數所在的記憶體位址而不知道操作數的值就更談不上将其變為立即數用在指令中了。是以記憶體尋址的存在也就成了理所當然。

       在實模式下,通路記憶體時用“段基址: 段内偏移位址”的形式。預設情況下資料段寄存器是ds,即段基址已經有了,隻要再給出段内偏移位址就可以通路記憶體了,最終起決定作用的、有效的是段内偏移位址,是以段内偏移位址稱為有效位址。

直接尋址

       直接尋址就是直接在操作數中給出的數字作為記憶體位址,通過中括号的形式告訴CPU取此位址作為操作數。直接尋址和立即數尋址的差別在于,立即數尋址中的數字是直接拿來用作操作數,而直接尋址中的數字則是用來進一步尋址的。

基址尋址

       基址尋址就是在操作數中用基址寄存器(在實模式下隻能用bp和bx寄存器)作為位址的起始,位址的變化以它為基礎。就是将CPU中的基址寄存器的内容,加上變址寄存器的内容而形成操作數的有效位址。

add word[bx], 0x1234    ;将0x1234加上記憶體位址ds:bx處的值後再存入記憶體位址ds:bx中
           

       基址尋址的優點是可以擴大尋址能力,因為與形式位址相比,基址寄存器的位數可以設定得很長,進而可以在較大的存儲空間中尋址。

變址尋址

       變址尋址和基址尋址類似,隻是寄存器由bx、bp換成了si、和di。

mov [di], ax    ;将寄存器ax的值存入ds:di指向的記憶體
           

基址變址尋址

       基址尋址和變址尋址的結合,即基址寄存器bx或bp加上變址寄存器si或di。

mov [bx+di], ax    ;将ax中的值存入以ds為段基址,bx+di為偏移位址的記憶體中
           

繼續閱讀