80386ASM程序設計基礎(二)

 80386處理器的尋址方式
    在實式模式下,80386處理器的最大尋址空間仍然爲1M,和8086/8088相似。即段地址*10H+段內偏移地址,從而形成20位地址。此種模式下,段基址是16的倍數,長度最大不超過64K。
    在保護模式下,80386處理器可以使用所有的物理內存。段基址可以是32位,也可以不是16的倍數,同時它的最大長度爲4G,這與8086完全不同,在形成邏輯地址時用段基址直接加上段內偏移地址,而並不將段基址左移4位(乘以16)。通常情況下,除了訪問堆棧外,默認的段都爲DS,有跨段前綴就另當別論了。在以BP,EBP,ESP作爲基址寄存器時,這時默認的段寄存器應該是SS,舉幾個簡單的例子:
   MOV EAX,[SI];這裏的段寄存器是DS
   MOV EAX,FS:[ESI];這裏的段寄存器是FS,因爲指令中使用跨段前綴顯示指定了
   MOV EAX,[BP];這裏的段寄存器是SS,因爲指令中使用了BP作爲基址寄存器
   MOV EAX,GS:[BP];這裏段寄存器是GS,因爲指令中使用跨段前綴顯示指定了
   80386中32位數的操作的順序是“高高低低”,即是說高16-》高16,高8-》高8,低16-》低16,低8-》低8,這和8086相似。同時80386微處理器兼容所有8086的尋址方式,而且對8086的尋址方式有很大的改進和擴展。在8086下,只允許BP,BX,SI,DI作爲尋址寄存器,但在80386下,8個通用寄存器都可以作爲尋址寄存器。不過有一點要注意的是在基址變址寄存器尋址方式或相對基址變址尋址方式中,段寄存器由基址寄存器來確定,而不是由變址寄存器來確定,同時除ESP外其它的7個通用寄存器都可以作爲變址寄存器,用代碼來表示就是:
   MOV EAX,[EBP+ESP+2];這條指令是錯誤的,因爲不可以用ESP作爲變址寄存器
   MOV EAX,[EBP+ESI+10H];這裏的段寄存器應該有基址寄存器來決定。基址寄存器是BP,那麼這裏的段寄存就是SS
   MOV EAX,GS:[EBP+EDI+100H];不用看了,這裏的段寄存器應該是GS,因爲指令通過跨段前綴顯示指定了
   80386支持的基地址+變址+位移量尋址進一步滿足了高級語言支持的數據類型。對於C語言來講,普通變量,數組,結構體,結構體的數組,數組的構體我們既可存放在棧中(靜態定義-static definition),也可以存放在堆中(動態定義-dynamic definition),用ASM也一樣可以實現。基址變址寄存器提供了兩個可以改變的部分,而位移量則是靜態的。看下面的例子:
   //Variables in C Programming-Language,the corresponding ASM will list below
   void main()
   {
     int a;//普通的變量,用ASM尋址時直接用DS:[一位移量],如DS:[2000],屬於直接尋址方式
     int array[24];//數組,用ASM尋址時用DS:[BX+SI*4],4表示整型的長度,屬於基址變址尋址方式
     struct abc
     {
       int a,b,c;
       float d;
     };
     struct abc aa;//結構體,用ASM尋址時DS:[BX+Shift],Shift代表位移量,屬於寄存器相對尋址方式
     struct abc aa[100];//結構體數組,用ASM尋址時用DS:[BX+SI*sizeof(abc)+Shift],屬於相對基址變址尋址方式
     struct cde
     {
          int array[100];
          float e,f,g;
     };
     struct cde ccc;//數組結構體,用ASM尋址時用DS:[BX+SI*4+Shift],屬於相對基址變址尋址方式
   }
   80386與8086的尋址方式差不多完全一樣,只不過80386的尋址方式更靈活,它的操作數有32位,16位,8位。
   讓我們再重溫一下8086的尋址方式:
   a.立即尋址,所謂立即尋址就是操作數就在指令中,比如說:MOV AX,5678H
   b.直接尋址,即直接包含操作數的有效地址EA,比如說MOV AX,[1234]
   c.寄存器間址尋址,用寄存器的內容來作爲操作數的有效地址,比如說SI=1234,MOV AX,[SI],8086下可用的寄存器只有4個:BX,BP,SI,DI,80386下8個通用的寄存器都可以使用。
   d.寄存器相對尋址,即在寄存器間址尋址方式的基礎上再加一個位移量,位移量可以是8位也可以是16位,比如說MOV AX,[BX+90H]。
   e.基址變址尋址,即操作數的有效地址由一基址寄存器和一變址寄存器產生,如MOV AX,[BX+SI]。那麼在8086下,只有SI,DI可以作爲變址寄存器,在80386下除ESP外的其它7個通用寄存器都可以作爲變址寄存器,比如說MOV AX,[BX+SI]。
   f.相對基址變址尋址,在e尋址方式的基礎上加上一位移量,比如說MOV AX,[BX+SI+100H]。
   在8086下,我們如進行字節或字操作,往往要加上僞指令WORD PTR或BYTE PTR。在80386下不用顯示指定,處理器會自動處理,當發現目的操作爲8位時,處理器就會進行8位操作,同理當發現目的操作爲16位,處理器就會進行16位操作,80386下以目的操作數的長度爲準,以下幾條簡單的傳送指令:
   MOV AL,CS:[EAX];8位操作,段寄存器是CS,尋址方式是寄存器間址尋址
   MOV AL,ES:[BX];8位操作,段寄存器是ES,尋址方式是寄存器間址尋址
   MOV EDX,[EDX+EBX+1234H];32位操作,段寄存器是DS,尋址方式是相對基址變址尋址
   MOV AX,[EBX+ESI*4];16位操作,段寄存器是DS,尋址方式是基址變址尋址
   MOV BH,ES:[EBX+EDI+900H];8位操作,段寄存器是ES,尋址方式是相對基址變址尋址
   MOV DL,[EBP+ESI+1900H];8位操作,段寄存是SS,因爲用了EBP作爲基址寄存器。尋址方式是相對基址變址尋址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章