彙編語言(王爽)學習記錄_第二章

  • 2020 年 11 月 22 日
  • 筆記

第二章 寄存器

一個典型的CPU由運算器,控制器 ,寄存器等器件構成。

在CPU中:

    運算器進行信息處理;

    寄存器進行信息存儲;

    控制器控制各種器件進行工作;

    內部總線連接各種器件,在它們之間進行數據的傳送。

程序員通過改變各種寄存器中的內容來實現對CPU的控制。

2.1 通用寄存器

8086CPU的寄存器都是16位的,通用寄存器:AX,BX,CX,DX

為了兼容上一代CPU:

          AX可分為AH和AL

          BX可分為BH和BL

          CX可分為CH和CL

          DX可分為DH和DL

 

 

 2.2 字在寄存器中的存儲

位元組:byte,一個位元組由8bit組成。

字:word,一個字由兩個位元組組成,高位元組和低位元組。例如20000存儲在AX中就可以看成AH為78,AL為32

 

 

 2.3 幾條彙編指令

 

 

 在編寫時,不區分大小寫,例:mov ax,18 和MoV AX,18含義相同。

問題2.1中:最後add ax,bx 執行後 ax應該為8226H+8226H(H為16進制)等於1044CH。但是AX為16位寄存器所以多出了一位不能保存,最後AX為044CH。

 

 

 問題2.2中 :最後add al,93H 執行後al=C5H+93H=158H ,al作為獨立的8位寄存器所以也要丟失高位1,最終ax為0085H。

 

 

 兩個題總結就是:注意寄存器進行的是16位運算還是8位運算。

檢測點2.1   (一定要做檢測點,加深記憶,說不定做題中就學到新知識了。)

    

mov ax,62627 ax = F4A3
mov ah,31H ax = 31A3H
mov al,23H ax = 3123H
add ax,ax ax = 6246H
mov bx,826CH bx = 826CH
mov cx,ax cx = 6246H
mov ax,bx ax = 826CH
add ax,bx ax = 04DBH
mov al,bh ax = 0482H
mov ah,bl ax = 6C82H
add ah,ah ax = D882H
add al,6 ax = D888H
add al,al ax = D810H
mov ax,cx ax = 6246H

 2.4 物理地址  

所有的內存單元構成的儲存空間是一個一維的線性空間,每一個內存單元在這個空間中都有唯一的地址,稱為物理地址。

2.5 16位結構的CPU

2.6 8086CPU給出的物理地址的方法

8086CPU有20位地址總線,可以傳送20位地址,達到1M尋址能力。在內部一次處理、傳送、暫時存儲的地址為16位。

地址加法器採用  物理地址 = 段地址 + 偏移地址    例如1230 與 00C8  加法器做1230H*16(10進制)=12300H(這裡乘法看不懂的可以推廣到10進制的乘10上去驗證)      12300H+00C8H=123C8H

2.7 「段地址*16+偏移地址=物理地址」的本質含義

本質含義:CPU在訪存時,用一個基礎地址(段地址*16和一個相對於基礎地址的偏移地址相加。書上給了兩個例子理解,我的理解就是在限制條件下(4位16進制)下更好的增加尋址能力(有誤,且噴)。

2.8 段的概念

書上寫了兩頁,為了說明段的概念,我感覺其實就是邏輯上地址上的一個區分而已(有誤,且噴)。

2.9 段寄存器

8086CPU段寄存器:CS,DS,SS,ES。提供內存訪問時的段地址

2.10 CS和IP

CS段寄存器,IP指令寄指針存器 CS和IP可以指向讀取指令的起始位置,因為計算機存儲的都是二進制0和1,就是為了計算機能自己區分哪裡是數據哪裡是指令。

比如CS設置為2000H,IP設置為0000H,那麼計算機就從內存20000H開始把二進制01當作指令執行。執行後IP加上上一個指令的大小。繼續執行下一條指令。

2.11 修改CS、IP的指令

程序員可以通過修改CS、IP控制執行目標指令。mov指令(稱為傳送指令)可以修改大部分寄存器的值(ax,bx,,cx,dx)但是不能設置CS和IP的值(8086CPU搞得鬼)。但是8086CPU提供了轉移指令:jmp。用法:」jmp 段地址:偏移地址「 作用:修改CS 和IP。「jmp 某一合法寄存器 」 作用:用寄存器的值修改IP。

問題2.3  挺簡單的就不寫了 最後死循環。

2.12 代碼段

檢測點2.3   第一次ip指向mov指令,第二次指向sub指令,第三次指向jmp,第四次指向ax=0.

實驗一

首先需要在win10安裝dsbug,自行百度搜索win10安裝debug。

debug命令:

      R:查看、修改CPU寄存器的內容

      D:查看內存的內容

      E:修改內存內容(可以是數據、指令)

      U:將內存的內容解釋為機器指令和對應的彙編指令

      T:執行CS:IP指向的指令

      A:以彙編指令的形式向內存寫入指令

用R指令查看:

 

 用R指令修改:

 

用D命令查看內存(d 段地址:偏移地址)也可以在後面添加範圍(d 段地址:偏移地址1 偏移地址2) :

 

 用E命令修改內存內容 (e 起始地址 數據 數據 數據……)數字,字符都可以:

 

 

          也可以e 起始地址  回車後 寫一個 按空格 再寫一個

 

 

 用E命令寫機器碼:

 

例如:   

    

b80100 mov ax,0001
b90200  mov cx,0002
01c8    add ax,c x

 

 為了執行上面的指令首先得修改CS IP指向1000:0

 

 然後用t執行觀察ip ax cx:

 

 

 用A指令寫彙編指令(寫完後兩次回車):

 

 實驗二

1.用E命令寫(這寫的要命啊生怕出錯):

 

 2.用A命令寫(也好不到哪去哈哈,還是高級語言寫着快):

 (2)2的8次放(我做的時候在8+8的時候為啥沒出來16想半天,才記起是16進制  害!)

 

 

(3)查看pc上rom的生產日期,修改不了因為是rom。

 

 

(4)修改不了,1.15寫了:地址0~7FFFH的32KB為主隨機存儲器的地址空間

             地址8000H~9FFFH為顯存地址空間

              地址A000H~FFFFH為各個ROM的地址空間

 

 

 

完!