8086匯編語言學習(五) 8086尋址方式


8086匯編內存尋址方式

  前面的博客都多少提到了8086匯編的內存尋址,例如mov ax [2345H]。而8086匯編還提供了更多、更靈活的尋址方式,以滿足多種需求。

  需要強調的是,無論何種尋址方式,內存尋址的地址總是由基礎地址+偏移地址(段基址+偏移量)組合而成,不同之處在於基礎地址與偏移地址應該從何處獲得

8086匯編提供尋址段基址的方式

  在示例mov ax [2345H]中,並沒有顯示的指明段地址的值,這是因為8086匯編在處理沒有明確指明段基址的指令時,一般默認將數據段寄存器DS的值作為段基址。也就是說,mov ax [2345H]其實是mov ax ds:[2345H]的縮寫。

  特別的,當偏移地址的指定[],存在了bp段寄存器時,則默認的段寄存器為SS棧段寄存器,指令mov ax [bp]實際為mov ax ss:[bp]的縮寫形式。

  8086匯編中通過“段寄存器:偏移地址”的方式指定尋址時的段基址。而ds並不是唯一的段寄存器,在內存尋址時的段地址可以不存放於段寄存器DS中,而是存放其它的段寄存器中。可以在指令中顯式的指明(mov ax cs:[2345H] 此時的段地址在代碼段寄存器cs中)。

8086匯編提供尋址偏移量的方式

  8086匯編提供偏移地址的方式很多樣,大致可以分為五類:直接尋址、寄存器間接尋址、寄存器相對尋址、基址變址尋址、相對基址變址尋址,按照先后順序,靈活性和復雜度逐漸增加

  偏移地址可能由某一寄存器指定,也可能存放在某一處內存中,或是在指令緩沖器中,亦或是由它們的組合構成

直接尋址

  直接尋址其實就是前面提到過的尋址方式(mov ax [2345H]),其所指明的尋址偏移地址直接保存在指令中,在實際運行時,CPU會從指令緩沖器中獲取到對應的偏移值進行內存尋址。

  這里提出一個idata(immediate data)直接數、立即數的概念,用以指代1000H或是2345H這樣指令中的常量值。包含idata常量的指令,其值都存放在指令緩沖器中,供CPU在執行時獲取。

  指令mov ax, 1000H,代表將立即數1000H送入ax中,可以抽象表示為mov ax, idata的形式。

  指令mov ax, [1000H],代表對DS:1000H內存進行尋址,可以抽象表示為mov ax, [idata]的形式。

寄存器間接尋址

  寄存器間接尋址,從尋址方式的名字中可得,地址不是常量而是類似一個變量,其值存在於一類特殊的寄存器,尋值寄存器中。

  需要注意的是,8086並不允許所有的寄存器作為寄存器間接尋址之用,而只有寄存器bx、bp、si、di這四個寄存器被稱為尋值寄存器,可用於寄存器間接尋址。寄存器間接尋址時使用其它的寄存器都會被編譯器認為是語法錯誤。

  寄存器間接尋址的的方式為[bx]/[bp]/[si]/[di]四種,例如mov ax,[bx],指令的含義為將內存地址為ds:bx處的數據送入寄存器ax中。

寄存器相對尋址

  通過常量idata或是特定類型寄存器可以指定偏移地址進行尋址,直接尋址和寄存器間接尋址只選用了寄存器或立即數idata中的一種元素,較為簡單。而更復雜的尋址方式是將常量idata和寄存器尋址組合起來實現的。

  寄存器相對尋址是通過將尋址寄存器與idata結合起來進行的。 在寄存器相對尋址這種一個尋址寄存器+一個常量的尋址模式中,bx/bp/si/di是等價的。

 寄存器相對尋址較為靈活,大致有以下幾種(第1種是標准格式,2、3、4是語法糖):

  1.[bx+idata]/[bp+idata]/[si+idata]/[di+idata]    標准格式

  2.[bx].idata/[bp].idata/[si].idata/[di].idata     一般用於結構體

  3.idata[bx]/idata[bp]/idata[si]/idata[di]      一般用於一維數組

  4.[bx][idata]/[bp][idata]/[si][idata]/[di][idata]    一般用於二維數組  

  為什么8086匯編會為寄存器相對尋址提供如此之多語法不同但本質一樣的語法糖呢?仔細觀察可以發現,2、3、4的寫法很像高級語言中的結構體/對象、數組的訪問方式。8086提供的多樣的語法格式能夠讓寫出的程序更加易於理解。后續的博客會對8086匯編模擬高級語言中數組、結構體的內存結構設計進行詳細說明。

基址變址尋址

  基址變址尋址比寄存器相對尋址的方式更加靈活,是通過兩個不同的尋址寄存器組合而成。但這里bx/bp/si/di並不能隨意的兩兩搭配,其中bx/bp一組,si/di一組。不同組之間的尋址寄存器才能兩兩組合,共有四種:[bx+si]、[bx+di]、[bp+si]、[bp+di]。

     基址變址尋址一般用於對二維數組中數據的尋址。

相對基址變址尋址

  相對基址變址尋址在基址變址尋址的基礎上,再添加了一個idata常量元素,尋址模式是兩個變量+一個常量,是最復雜也最靈活的一種尋址方式。

  和基址變址尋址尋址類似,相對基址變址尋址也有四種方式:[bx+si+idata]、[bx+si+idata]、[bx+si+idata]、[bx+si+idata]。

  8086CPU提供的相對基址變址尋址方式,為處理嵌套的結構化數據提供了方便,如訪問結構體中的數組時可以比較自然的表達其偏移地址。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM