彙編語言(王爽)學習記錄_第二章
- 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的地址空間
完!