實驗一 查看CPU和內存,使用機器語言和匯編語言進行編程


實驗一  查看CPU和內存,使用機器語言和匯編語言進行編程

.預備知識:Debug的使用

   DebugDOSWindows提供的實模式(8086方式)程序的調試工具。使用它,可以查看CPU各種寄存器中的內容、內存的情況和在機器碼級跟蹤程序的運行。是匯編程序設計中常用的調試工具。在Debug環境下,可以調試經匯編、連接后生成的可執行程序,編寫簡單的程序。

 

32位操作系統下debug的啟動與退出:

啟動:

 方法一:單擊“開始”→“運行”(或使用快捷鍵Windows+R),輸入cmd,確定,進入dos界面,輸入debug,回車,進入debug調試環境,以短線“—”為命令提示符。

 方法二:單擊“開始”→“運行”(或使用快捷鍵Windows+R),輸入debug,確定,即進入debug調試環境,以短線“—”為命令提示符。

退出:

使用q命令,回車即可。

 

Debug命令格式和參數:

debug中的命令大小寫等價;

      Debug中數字默認為十六進制表示,不需要加H

      debug中輸入命令后,按下回車鍵執行;按下ctrl+c則終止命令的執行;

      debug中命令和參數之間可以沒有分隔符(如空格)。

 

 

64位操作系統下使用debug

    Debug不能在64位操作系統下運行,因此需要下載debug32DOS模擬器(在此使用DOSBOX)。

DOSBOX下載:https://www.dosbox.com/download.php?main=1

安裝下載Debug.exe

 

環境配置:找到DOSBox安裝目錄下的DOSBox 0.74 Options.bat文件,然后雙擊:

進入文本,在末尾添加如圖示:

在此環境已配置好了。

 

2. 常用debug功能

l  r命令查看、改變CPU寄存器的內容:

R<回車>

顯示所有寄存器的值

R AX<回車>

顯示當前AX所謂值為0000,若要修改,則在冒號后輸入要修改的值,如輸入1234,回車再用—R AX查看,可見AX值已修改。如若不修改,則兩次回車即可。

 

l D命令查看內存中的內容:

D<回車>

D命令直接查看,列出預設地址處128位個字節內容

 

D  地址

D  1001

顯示從當前地址開始之后128個字節內容

 

D 地址范圍

D 1001  1008

兩種方式顯示指定范圍內存儲單元的內容,如上圖

l E命令改寫內存中內容;

E 地址  數據 數據·····(或字符)

E  1001  0 1 2 3 4 5 6 7

E命令修改從1001開始的8個單元的內容,用D查看內容變化

 

也可以用提問方式逐個修改:

a. 輸入E 1001,按enter鍵;

b. Debug顯示起始地址,和起始單元內容,光標停在”.”后提示想要寫入數據,輸入數據按空格,用輸入數據修改當前內存單元;或不輸入數據直接按空格,即不對當前單元進行修改;

c. 當前單元處理完成后,接着顯示下一單元的內容,並提示凈宗修改,同樣方法進行處理;

d. 當所有希望改寫的內存單元改寫完后,按enter鍵,E命令操作結束。

也可用E命令向內存中寫入字符串。

U命令將內存中的機器指令翻譯成匯編指令

E命令向內存中寫入機器碼,D命令查看寫入的機器碼用U命令可以查看每一條機器指令的地址、機器指令,並將內存單元中的內容翻譯為匯編指令並顯示出來。

 

T命令執行一條機器指令

E命令向從10000開始的內存單元中寫入8個字節的機器碼;R命令查看CPU中寄存器的狀態,CS=073FIP=0100,指向內存073F0100;用R命令修改CSIP中的內容,使CSIP指向10000。然后就可以用T命令來執行我們寫入的指令,執行后,AX中的內容變為1,IP變為IP+3。

 

A命令以匯編指令的格式在內存中寫入一條機器指令

A 起始地址,以匯編語言向從1000:0開始的內存單元中寫入了幾條指令,然后用D命令查看A命令的執行結果

A 回車,從預設的地址開始輸入,想要結束A命令,則不輸入匯編指令,直接按enter鍵即結束A命令

—?<回車>

顯示常用命令集,可幫助快速找到所需命令。

2. 實驗任務

(1)使用debug,將下面的程序段寫入內存,逐條執行,觀察每條指令執行后CPU中相關寄存器中內容的變化。

提示:用E命令和A命令以兩種方式將指令寫入內存,T命令執行時注意CS:IP的指向。

 E命令從10000處開始寫入機器碼,因為有長度限制,我只寫到第八條bb 26 00這一條,輸入R命令查看CPU內容,並修改CSIP使其指向10000。然后使用T命令逐條執行機器碼如下:

同樣方法從10000012處開始寫從bb 26 00以下的機器碼,CSIP指向10000012

A命令以匯編指令方式寫入內存,打開DOSBOX,輸入debug進入調試模式,使用R命令修改CSIP的內容使其指向10000,先用D命令查看從10000開始的單元內容,然后用A命令從10000處開始逐條寫入匯編指令,再次用D命令查看匯編指令執行后單元里面的內容。

(2)將下面三條指令寫入從20000開始的單元中,利用這三條指令計算2的八次方。

MOV AX,1

ADD AX,AX

JMP 2000:0003

一直逐條執行T命令,直到AX=0100,因為debug程序中數字默認16進制,100H=256=2^8

計算所需執行指令條數 (3+2*7=17=11H),也可直接輸入: —T=0  11

 

 3)查看內存中的內容。PC機主板上的ROM中寫有一個期,在內存FFF00H~FFFFFH的某幾個單元,請找到並試圖修改它。

可以看見E命令並未修改成功。

這是因為RomRead Only Memory)只讀存儲器,這種存儲器(Memory)的內容任何情況下都不會改變,計算機與用戶只能讀取保存在這里的指令,和使用存儲在ROM的數據,但不能變更或存入數據。

(3)向從內存單元B8100H開始的單元中填寫數據,如:

E B8100000 01 01 02 02 03 03 04 04

修改數據后:

修改地址后:

實驗發現每兩個字節表示一個字符,其中前一字節控制字符種類,后一字節控制顏色。偏移地址與字符在終端中顯示的位置有關。

實驗總結:

通過這次實驗,我對匯編debug的常用功能有了基本了解,對匯編語言這門課程有了更深層次的認識。知道了debug的調試環境以及配置問題,了解了匯編程序的簡單編寫,知道了機器指令與匯編指令編程的方式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM