1. 程式人生 > >實驗二——11.18

實驗二——11.18

南京資訊工程大學實驗報告

實驗日期    11.18            

學院    計軟院  

專業    計科

年級    2017級   

班次    6班

姓名    謝巨集偉     

學號    20171308260      

一、實驗目的

1. 熟練掌握使用debug工具編寫和除錯彙編命令的方法 2. 理解並掌握記憶體中多位元組資料的存放 3. 理解並掌握「棧」記憶體空間的特性和使用 4. 理解並掌握8086彙編指令mov, add, sub, push, pop的用法

二、實驗準備

1. 複習第 3 章「棧」的知識:棧的特性、暫存器 SS 和 SP、指令 push 和 pop  2. 完成教材 3.6~3.9 節內的問題 3.6~3.12,檢測點 3.1~3.2 3. 結合教材實驗1 (P35)及公郵檔案中心→實驗下的 “實驗1輔助文件.pdf”複習debug 工具用法。

三、實驗內容

1. 教材實驗2(P71) 

1)練習「1.預備知識:Debug 的使用」 

2)在練習基礎上,完成

「2. 實驗任務」 補充: 為了便於驗證實驗結果,對「2. 實驗任務」中的(1)做如下兩點調整:

① 在使用 a 命令輸入指令除錯前,使用 e 命令將記憶體單元 0021:0 ~0021:7 連續 8 個位元組資料修改為 30H, 31H, 32H, 33H,34H,35H,36H,37H 

② 將 P74 實驗任務(1)中第 1行的 mov ax, ffff → 改為 mov ax, 0021  實驗前,請理論上分析指令執行後各個填空處的值,並記錄下來。 實驗時,通過在 debug 中除錯,觀察實驗結果與理論分析是否一致,如不一致,嘗試 發現問題所在,並分析原因。

 

四、實驗結論

實驗任務(1):

① 截圖記錄:使用 e 命令修改 0021:0~0021:f 資料,及修改後檢視是否正確寫入的操 作

② 截圖記錄:使用 a 命令輸入的 p74 指令  

③ 截圖記錄:每一行指令單步除錯(如單步除錯步驟多,可分屏截圖,但不要有遺漏)

④ P74 中指令執行後各個暫存器填空結果,以在文件中手工標註或手機拍照截圖方式 複製在文件中。 對於③單步除錯的觀察,與理論上分析的結果進行比較,檢驗是否一致。 如不一致,分析查詢原因。

 

 

 1.先用d命令檢視0021:0  到0021:7 之間的內容,並將其修改成要求的資料。其中我用e命令向記憶體寫資料的方法錯誤了一下。隨後更正,並且檢視是否修改成功。

  

 

 

2.使用a命令輸入P74頁的指令,將第一行修改成mov ax,0021

 

 

 

3 使用t命令單步除錯指令。

 

 

執行以上指令後,各暫存器內值的情況:

mov ax,0021

mov ds,ax

mov ax,2200

mov ss,ax

mov sp,0100

mov ax,[0]     ;ax= 3130          

add ax,[2]      ;ax= 6462            

mov bx,[4]     ;bx= 3534            

add bx,[6]      ;bx= 6C6A            

push ax         ;sp= 00FE  ;修改的記憶體單元的地址是2200:00FE內容為6462          

push bx         ;sp= 00FC  ;修改的記憶體單元的地址是2200:00FC內容為6C6A       

pop ax           ;sp= 00FE  ;ax=6C6A              

pop bx           ;sp= 0100   ;bx=6462            

push [4]         ;sp= 00FE  ;修改的記憶體單元的地址是2200:00FE內容為3534

push [6]         ;sp= 00FC  ;修改的記憶體單元的地址是2200:00FC內容為3736   

 

以上指令可以看出,先把ax,bx先後壓入棧,然後把ax先出棧,再將bx出棧,這就使得ax和bx中的資料發生了交換。

這就是棧的特性所帶來的,先入後出。

並且該指令中有一行mov sp,0100並沒有顯示出程式碼,而是預設執行了。這一點書上提到了,說以後的課程會深入瞭解。

 

 

 

實驗任務二

 

 

 

該段指令原先ss:sp是0b39:ffee

此時顯示了2000:0000 的16個數據是我剛剛修改的0.

但是又將ss:sp修改為2000:0010

這就導致指向的棧頂被更改,再檢視2000:0000記憶體單元時,資料則顯示了不同。

 

 

 

 

我的總結體會:

 

首先對於棧,我有了一個基本的概念,就是最後進入的會先出來。

段暫存器SS和暫存器SP

SS:SP是在任意時刻都指向棧頂元素。即棧頂。

 

棧的設定格式

mov ax ,1000

mov ss,ax

mov sp ,0010

在這當中,t命令會直接執行mov sp,0010 這一步。

 

push指令:(1)SP=SP-2;(2)向SS:SP指向的字單元中送入資料。

pop指令:(1)從SS:SP指向的字單元中讀取資料;(2)SP=SP+2

對於棧的越界我們要自己考慮8086 cpu並不會限制我們,它只能記錄棧頂位置。