王爽老師《彙編語言》第二章——寄存器 筆記

 本文摘自http://blog.csdn.net/lr2131/article/details/6247159,非常感謝博主:從頭再來 的知識分享!(自己做了部分修改)

                                                             第二章   寄存器

一、   通用寄存器

1.        8086CPU的所有寄存器都是16位的,可以存放兩個字節。AXBXCXDX4個寄存器通常用來存放一般性的數據,被稱爲通用寄存器

2.        爲保證和8086之前的8CPU兼容,8086CPUAXBXCXDX4個寄存器都可分爲兩個可獨立使用的8位寄存器來用(AHALBHBLCHCLDHDL)  

                          1388378165_b97a3fac.jpg (513×171)

二、   字在寄存器中的存儲

1.        一個字是16位,可以存在一個16位寄存器中,這個字的高位字節和低位字節自然就存在這個寄存器的高8位寄存器和低8位寄存器中。


三、   幾條彙編指令

1.        在寫一個彙編指令或一個寄存器的名稱時不區分大小寫

2.        8位寄存器(XHXL)操作時,CPU會把XHXL作爲獨立的8位寄存器來使用,如果XL寄存器運算溢出時不會將進位寫到XH中,而當在對16位寄存器操作時,低8位數據的進位是會寫到高8位數據中的。

3.        注意指令的兩個操作對象的位數應當是一致的。

舉例:

                                  1388378204_ef44d27e.jpg (658×108)

以上這幾條彙編指令都是錯誤的。


四、  物理地址

1.        所有的內存單元構成的存儲空間是一個一維的線性空間,每一個內存單元在這個空間中都有唯一的地址,我們將這個唯一的地址稱爲物理地址

2.        CPU通過地址總線送入存儲器的,必須是一個內存單元的物理地址。

 

五、   8086CPU給出物理地址的方法

1.        8086CPU20位的地址總線,可以傳送20位地址,達到1MB尋址能力。

2.        8086CPU16位結構,在內部一次性處理、傳輸、暫時存儲的地址爲16位。

3.        8086CPU通過將216位地址合成的方法來形成一個20位的物理地址:

        物理地址 =段地址 x 16 + 偏移地址  (因爲16即2的4次方,將某數左移4位,即該項數乘以2的4次方)

基地址 =段地址 x 16

    1388378225_7fffbd2a.jpg (508×388)

六、   段的概念

1.  “段地址”包含着段的概念,但內存並不是被劃分成一個一個的段,內存並沒有分段,斷的劃分來自CPU,由於8086CPU用基礎地址(段地址x16+偏移地址 = 物理地址的方式給出內存單元的物理地址,使得我們可以用分段的方式管理內存。

2.        在編程時可以根據需要,將若干地址連續的內存單元看作一個段,用段地址x16定位段的起始地址(基礎地址),用偏移地址定位段中的內存單元。

3.        段地址x16必然是16的倍數,所以一個段的起始地址也一定是16的倍數,偏移地址爲16位,16位地址的尋址能力爲64KB,所以一個段的長度最大爲64KB

4.       CPU可以用不同的段地址和偏移地址形成同一個物理地址。

               1388378268_34538c37.jpg (576×228)                

5.     由於一個物理地址可以映射多個段地址和偏移地址的組合,所以不應該只給出物理地址,準確的寫法是段地址:偏移地址


七、 段寄存器

段地址是CPU中的誰提供的呢?

由CPU中的段寄存器提供。

8086CPU有4個段寄存器:CSDSES、SS


1.        8086CPU在訪問內存時要由相關部件提供內存單元的段地址和偏移地址,送入地址加法器合成物理地址。

2.        8086CPU在訪問內存時,由CSDSSSES4個段寄存器提供內存單元的段地址。


八、 CSIP

1.        CSIP8086CPU中兩個最關鍵的寄存器,它們指示了CPU當前要讀取指令的地址,即CS:IP

         CS中存放段地址,IP中存放偏移地址

2.        CS爲代碼段寄存器,IP爲指令指針寄存器,在任意時刻,CPU將從CSIP指向的內容開始,讀取一條指令並執行。

           1388378287_e6809e60.jpg (652×527)         

       1388378315_23806021.jpg (673×313)

1388378424_f4d46c17.jpg (734×348)

1388378439_449af1d4.jpg (700×344)

1388378450_8c85c273.jpg (697×333)

1388378476_a5f3a7ff.jpg (697×362)

注意上圖中的IP值的變化。

結合以上幾幅圖,得到下面的結論:

      8086CPU的工作過程簡要的描述爲:

           (1) 從CS:IP指向的內存單元讀取指令,讀取的指令進入指令緩衝器;

        (2)IP=IP+所讀取指令的長度,從而指向下一條指令;

        (3)執行指令,轉到步驟(1),反覆這個過程。(注意(2)和(3)的順序)

3.  8086CPU上電啓動或復位後,CS=FFFFHIP=0000H,也即是FFFF0H單元中的指令是8086PC機開機執行的第一條指令。

 

九、     修改CSIP的指令

1.        CPU中,程序員能夠用指令讀寫的部件只有寄存器,程序員可以通過改變寄存器中的內部實現對CPU的控制。

2.        CPU從何處執行指令是由CSIP中的內容決定的,程序員可以通過改變CSIP中的內容來控制CPU執行目標指令。

3.        8086CPU大部分寄存器的值,都可以用mov指令來改變,但mov指令不能用於設置CSIP的值,能夠改變CSIP的內容的指令被統稱爲轉移指令

4.        最簡單的轉移指令是jmp形式:jmp段地址:偏移地址

5.        若想僅修改IP的內容,可用“jmp某一合法寄存器”的指令完成。類似於mov IPax。(並不是真正擁有mov IP,ax 這條指令.)

   1388410070_c97244a2.jpg (745×462)

 

十、     代碼段

1.        在編程時,可以根據需要,將一組內存單元定義爲一個段,我們可以將長度爲NN<=64KB)的一組代碼,存在一組地址連續、起始地址爲16的倍數的內存單元中,我們可以認爲,這段內存是用來存放代碼的,從而定義了一個代碼段。

2.        要讓CPU執行我們編寫的代碼,就必須要讓CS:IP指向我們的代碼,CPU只會認爲CS:IP指向的內存單元中的內容爲指令,且是要執行的代碼。


十一、   實驗1查看CPU和內存,用機器指令和彙編指令編程

1.        DebugDOSWindows都提供的實模式(8086方式)程序的調試工具。使用它,可以查看CPU各種寄存器中的內容、內存的情況和在機器碼級跟蹤程序的運行。

2.        Debug的功能:

1)       R:查看、改變寄存器的內容

 

2)       D:查看內存中的內容

3)       E:改寫內存中的內容

4)       U:將內存中的機器指令翻譯成彙編指令

5)       T:執行一條機器指令

6)       A:以彙編指令的格式在內存中寫入一條機器指令

7)    Q:退出Debug


3.        Debug是在DOS方式下使用的程序,在進入Debug前,應先進入到DOS方式。

4.        Debug命令的典型使用範例:

1)       –r  查看CPU中各寄存器的值

 1388410432_aa592e14.jpg (646×112)

2)       –r ax 在顯示了ax中值後提示用戶輸入要修改的新值

 1388410444_adad3ed.jpg (643×133)

1388410457_456b2577.jpg (646×125)

1388410477_92656d04.jpg (643×108)

3)       –d 列出debug預設的地址處的內容

 1388410537_77b5dc82.jpg (649×132)

4)       –d 1000:9列出10009H處的連續128字節的內存中的內容(即一直到10088)

1388410554_e75a4126.jpg (645×136)

 

5)       –”e 起始地址 數據  數據   ……“的格式進行逐個修改內存中的內容

如:e 1000:0 0 1 2 3a+b 4 5 6 7 8 9 c’一次性逐個修改內存

 1388410666_a7c93cce.jpg (654×91)

6)       u 1000:10 查看彙編指令(即查看寫入的或內存中原有的機器碼所對應的彙編指令)

 1388410711_3dd1e8d6.jpg (391×202)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章