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

來源:互聯網
上載者:User

第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。   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.