讀書寫筆記-王爽《組合語言》

gudesheng發表於2008-01-03

第2章 暫存器(CPU工作原理)

2.1 通用暫存器
    8086CPU的所有暫存器都是16位,可以存放兩個位元組。AX、BX、CX、DX四個暫存器通常用來存放一般性的資料,被稱為通用暫存器。
    一個16位暫存器可以儲存一個16位的資料。
    那麼一個16位暫存器所能儲存的資料的最大值為多少呢?
    8086CPU的上一代CPU中的暫存器都是8位的,為了保證相容,使原來基於上代CPU編寫的程式稍加修改就可以執行在8086之上,8086CPU的AX、BX、CX、DX四個暫存器都可分為兩個可獨立使用的8位暫存器來使用:
    AX可分為AH和AL;
    BX可分為BH和BL;
    CX可分為CH和CL;
    DX可分為DH和DL;

2.3 彙編指令
    彙編指令舉例:
        mov ax,18  將18送入暫存器AX                            AX=18
        mov ah,78  將78送入積存器AH                            AH=78
        add ax,8   將暫存器AX中的數值加上8                     AX=AX+8
        mov ax,bx  將暫存器BX中的資料送入暫存器AX              AX=BX
        add ax,bx  將AX和BX中的數值相加,結果存在AX中          AX=AX+BX

     在寫一條彙編指令或一個暫存器的名稱時不區分大小寫,如:mov ax,18和MOV AX,18的含義相同;bx和BX的含義相同。

     注意:如果單獨把AH和AL做為兩個獨立的8位暫存器來用,那麼它們兩個就是兩個不相關的暫存器,不要錯誤的認為,諸如add al,93H的指令產生的進位會儲存在ah中,add al,93H進行的是8位運算。
如果執行add ax,93H,低8位的進位會儲存在ah中,CPU在執行這條指令時認為只有一個16位暫存器ax,進行的16位運算。指令add ax,93H執行後,ax中的值為:0158H。此時,使用的暫存器是16位暫存器ax,add ax,93H相當於將ax中的16位資料00c5H和另一個16位資料009CH相加,結果是16位的0158H。

    在進行資料傳送或運算時,要注意指令的兩個操作物件的位數應當是一致的,例如:
    mov ax,bx
    mov bx,cx
    mov ax,18H
    mov al,18H
    add ax,bx
    add ax,20000
    等都是正確的指令,而
    mov ax,bl      (在8位暫存器和16位暫存器之間傳送資料)
    mov bh,ax      (在16位暫存器和8位暫存器之間傳送資料)
    mov al,20000   (8位暫存器最大可存放值為255的資料)
    add al,100H    (將一個高於8位的資料加到一個8位暫存器中)
    等都是錯誤的指令,錯誤的原因都是指令的兩個操作物件的位數不一致。


    在8086CPU加電啟動或復位後(即CPU剛開始工作時)CS和IP被設定為CS=F000H,IP=FFFFH,即在8086PC機剛啟動時,CPU從記憶體FFFF0H單元中讀取指令執行,FFFFOH單元中的指令是8086PC機開機後執行的第一條指令。

    現在,我們更清楚了CS和IP的重要性,它們的內容提供了CPU要執行指令的地址。

    mov指令不能用於設定CS、IP的值,原因很簡單,因為8086CPU沒有提供這樣的功能。8086CPU為CS、IP提供了另外的指令來改變它們的值。能夠改變CS、IP的內容的指令被統稱為轉移指令。
    我們現在介紹一個最簡單的可以修改CS、IP的指令:jmp指令。
    若想同時修改CS、IP的內容,可用指令“jmp 段地址: 偏移地址”完成,如:
    jmp 2AE3:3,執行後:CS=2AE3H,IP=0003H,CPU將從2AE33H處讀取指令。
    jmp 3:0B16,執行後:CS=0003H,IP=0B16H,CPU將從00B46H處讀取指令。

    若想僅修改IP的內容,可用指令“jmp 某一合法暫存器”完成,如:
    jmp ax,指令執行前:ax=1000H,CS=2000H,IP=0003H
           指令執行後:ax=1000H,CS=2000H,IP=1000H
    指令“jmp 某一合法暫存器”的功能為:用暫存器中的值修改IP。

    jmp ax,在含義上類似於mov IP,ax這樣的指令。

    CPU只認被CS:IP指向的記憶體單元中的內容為指令,所以,要讓CPU執行我們放在程式碼段中的指令,必須要將CS:IP指向所定義的程式碼段中的第一條指令的首地址。

    對於上面的例子,我們將一段程式碼存放在123BOH-123BAH記憶體單元中,將其定義為程式碼段,如果要讓這段程式碼得到執行,可設CS=123BH,IP=0000H。

    段地址在8086CPU的段暫存器中存放。當8086CPU要訪問地址時,由段暫存器提供記憶體單元的段地址。8086CPU有4個段暫存器,其中CS用來存放指令的段地址。

    CS存放指令的段地址,IP存放指令的偏移地址。
    8086機中,任意時刻,CPU將CS:IP指向的內容當作指令執行。

    8086CPU的工作過程:
    1:從CS:IP指向記憶體單元讀取指令,讀取的指令進入指令緩衝器;
    2:IP指向下一條指令;
    3:執行指令。(轉到步驟1,重複這個過程。)

   檢視CPU和記憶體,用機器指令和彙編指令程式設計
   1:預備知識:Debug的使用
      (1)什麼是Debug?
           Debug是DOS,Windows都提供的真實模式(8086方式)程式的除錯工具,使用它,可以檢視    CPU各種暫存器中的內容、記憶體的情況和在機器碼級別跟蹤程式的執行。
      (2)我們用到的Debug功能
           用Debug的R命令檢視、改變CPU暫存器的內容;
           用Debug的D命令檢視記憶體中的內容;
    用Debug的E命令改寫記憶體中的內容;
     用Debug的U命令將內容中的機器指令翻譯成彙編指令;
           用Debug的T命令執行一條機器指令;
    用Debug的A命令以彙編指令的格式在記憶體中寫入一條機器指令;
      (3)進入Debug
           Debug是在DOS方式下使用的程式。我們進入Debug前,應先進入到DOS方式,用以下方式可    以進入DOS:
    1:重新啟動計算機,進入DOS方式,此時進入的是真實模式的DOS;
           2:在Windows中進入DOS方式,此時進入的是虛擬8086模式的DOS;

    下面說明在Windos2000中進入Debug的一種方法,在Windows98中進入的方法與此類似。
            開始-執行-輸入command
            進入DOS方式後,如果顯示為視窗方式,可以按下Alt+Enter鍵將視窗變成全屏方式,然後             執行Debug程式。
            具體使用方法看P46。   



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=743402


相關文章