序言
- 最近利用寒假的時(shí)間開始學(xué)習(xí)匯編,使用的是
王爽的《匯編語言第三版》,看了前三章,感覺確實(shí)是一本好書 - 這里記錄一下在前三章中遇到的坑和總結(jié)一下主要知識(shí)點(diǎn)和自己的體會(huì)
- 正文開始之前,先安利一波:
-
王爽匯編語言第三版電子版 ; 密碼:
nrir -
王爽匯編語言第三版答案 ; 密碼:
2otv
正文
一. 實(shí)驗(yàn)環(huán)境配置
- 如果你的系統(tǒng)是
Win7或者更低的系統(tǒng),那么應(yīng)該是沒有影響的,但是筆者的系統(tǒng)是Win10的,用DOS做實(shí)驗(yàn)的時(shí)候無法使用Debug命令,在網(wǎng)上查了一下,說是因?yàn)?code>Win10系統(tǒng)版本太高,沒有debug.exe(C:\Windows\System32目錄下),不支持Debug模式,這里的解決辦法有兩種,一是去裝一個(gè)WinXP的虛擬機(jī)(太麻煩,不推薦),二是安裝DosBox,具體使用可以參見博客,這篇博客中有詳細(xì)的配置,為了避免重復(fù)造輪子,這里就不細(xì)說啦!(如果使用的是第二種方法,按照上述博客配置好了以后,每次使用DosBox,使用Debug命令的時(shí)候,還需要mount并切換到Debug的目錄下才能使用,如果閑麻煩,可以配置一下DosBox的環(huán)境變量:在DosBox的安裝目錄下(DosBox快捷方式右鍵-->打開文件所在位置),找到DOSBox 0.74 Options.bat文件,雙擊,默認(rèn)使用記事本打開,在最后一行找到[autoexec],在[autoexec]下面的指令是在DosBox打開的時(shí)候自動(dòng)輸入的,輸入:mount D D:\debug(意思是將D:\debug掛載到D盤,這里D:\debug是我的debug.exe所在目錄,具體情況具體修改咯);之后:set PATH=%PATH%;D:\;。這樣下次打開DosBox的時(shí)候就可以直接使用了,見下圖)
1.png
二. 總線
- 總線分為:外部總線和內(nèi)部總線,
CPU通過外部總線和外部器件(芯片)傳輸數(shù)據(jù)和通信,在CPU內(nèi)部,通過內(nèi)部總線相互通信和傳輸數(shù)據(jù)
1. 外部總線
- 外部總線又分為:地址總線(決定
CPU尋址能力),數(shù)據(jù)總線(決定CPU和外界的數(shù)據(jù)傳送速度),控制總線(決定CPU的控制能力) - 地址總線需要注意的是:地址總線能傳送多少個(gè)不同的信息,
CPU就能對(duì)多少個(gè)存儲(chǔ)單元尋址(注意是對(duì)存儲(chǔ)單元),若有N根地址總線,就說CPU地址總線寬度為N,最多可以尋找2的N次方個(gè)內(nèi)存單元;注意是內(nèi)存單元(也叫存儲(chǔ)單元),而不是bit,即CPU中的內(nèi)存單元是以Byte為單位的(即8bit),所以課后檢測點(diǎn)1.1(1)中的答案是13(見下)

2.png
2. 內(nèi)部總線
-
CPU內(nèi)部由運(yùn)算器,控制器,寄存器等組成,而這些器件之間的數(shù)據(jù)傳輸與通信就通過內(nèi)部總線完成 - 書中用的
8086CPU為16位CPU,所謂的16位CPU,包括三方面:
(1). 運(yùn)算器一次最多可以處理16位數(shù)據(jù)
(2). 寄存器的最大寬度為16位
(3). 寄存器和運(yùn)算器之間的通路為16位(內(nèi)部總線寬度)
三. 其他概念
- 這里主要列舉了一些比較易忘易混淆的概念
2. 接口卡
-
CPU對(duì)外部設(shè)備不能直接控制,如:顯示器,音響,打印機(jī)等;直接控制這些設(shè)備的是插在擴(kuò)展插槽上的接口卡;擴(kuò)展插槽通過總線和CPU相連,所以接口卡也通過總線與CPU相連,CPU通過控制接口卡來間接控制外設(shè)
3. 內(nèi)存地址空間
- 所謂的內(nèi)存地址空間就是
CPU在操控外部存儲(chǔ)器的時(shí)候都把它們當(dāng)做內(nèi)存來對(duì)待,把它們總的看做一個(gè)由若干存儲(chǔ)單元組成的邏輯存儲(chǔ)器(即內(nèi)存地址空間)
三. 寄存器
- 前三章主要了寄存器:
(1). 通用寄存器(存放一般數(shù)據(jù)):
AX,BX,CX,DX(2). 段寄存器(存放段地址):
CS,DS,ES,SS(3). 指針寄存器(與
CS配合使用,指向代碼指令):IP(4). 棧寄存器(與
SS配合使用,指向棧頂):SP
1. 明確幾點(diǎn)概念
-
CPU中的數(shù)據(jù)和代碼在存儲(chǔ)上是沒有區(qū)別的,完全由上述的幾個(gè)寄存器的指向決定了該段地址空間中的數(shù)據(jù)該如何解釋(是普通數(shù)據(jù),還是代碼指令,還是棧等) - 對(duì)
CPU而言沒有棧的概念,棧只是人為規(guī)定的,CPU所知道的只是SS : SP所指向的空間,還是同上理解為寄存器的指向決定如何解釋與如何操作 -
CPU中沒有提供管理?xiàng)R绯龅牟僮?,所以需要使用者來?jǐn)慎操作
2. debug模式下操作
-
R命令: 可以查看,改變寄存器的內(nèi)容;如下圖;需要注意的是,不能通過代碼直接向段寄存器中存儲(chǔ)值,如不可:
mov cs,1000H;如果要通過代碼改變段寄存器的值,需要使用內(nèi)存空間或者其他寄存器作為中介,如:mov ax,1000H,mov cs,ax;但是如果用R命令的話就可以直接向段寄存器中輸入值

3.png
-
D命令: 查看內(nèi)存內(nèi)容(如下);還可以指定查看的范圍,如:
-d 1000:0 f(表示查看從1000:0000到1000:000F的內(nèi)存值)

4.png
-
E命令: 改寫內(nèi)存中內(nèi)容;注意一般不使用
E命令來改變寄存器中的值

5.png
- U命令: 將內(nèi)存中的機(jī)器指令翻譯為匯編指令

6.png
-
T指令: 執(zhí)行
CS : IP指向的指令;需要注意的是一個(gè)T執(zhí)行一行指令,但是有一個(gè)特殊:Debug的T命令在執(zhí)行修改寄存器SS的指令時(shí),下一條指令也緊接著被執(zhí)行mov ax,1000
mov ss,ax
mov sp,0
在執(zhí)行完
mov ss,ax指令后,指令mov sp,0也會(huì)緊跟著執(zhí)行,而不會(huì)等待下一次輸出T指令

7.png
- A命令: 以匯編的格式在內(nèi)存中寫入一條機(jī)器指令

8.png
3. DS
- 該寄存器中存儲(chǔ)的是要訪問數(shù)據(jù)的段地址(
Data)
4. CS : IP
- 指向代碼段(
Code),可以通過改變CS和IP的值來決定代碼的執(zhí)行位置
5. SS : SP
- 始終執(zhí)行棧頂
-
pop指令: 入棧;分為兩步(以pop ax為例)(注意先后順序):
(1). SP = SP - 2, SS:SP指向當(dāng)前棧頂前面的單元,以當(dāng)前棧頂前面的單元為新的棧頂
(2). 將
ax中的內(nèi)容送入SS:IP指向的內(nèi)存單元出,SS:IP此時(shí)指向新棧頂
-
push指令: 出棧;分兩步(以push ax為例)(注意先后順序):
(1). 將SS:SP指向的內(nèi)存單元處的數(shù)據(jù)送入
ax中(2). SP = SP + 2, SS:IP指向當(dāng)前棧頂下面的單元,以當(dāng)前棧頂下面的單元為新的棧頂
四. 參考鏈接與聲明
- DosBox環(huán)境變量配置
- 本文部分圖片來自王爽
《匯編語言第三版》截圖
