匯編(一)

序言

  • 最近利用寒假的時(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)部總線完成
  • 書中用的8086CPU16CPU,所謂的16CPU,包括三方面:

(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:00001000: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è)特殊:DebugT命令在執(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),可以通過改變CSIP的值來決定代碼的執(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)前棧頂下面的單元為新的棧頂

四. 參考鏈接與聲明

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容