實驗一 查看CPU和內存,用機器指令和彙編指令編程

一.實驗準備編程

  前言:因爲你們的電腦大多使用的是64位的操做系統,不能在系統自帶的MS-DOS環境下編寫彙編源程序,因此咱們須要DOSBox這個軟件,以便在64位環境下編寫彙編源程序。編程語言

下載完成後進行掛載,進入掛載虛擬盤進入debug環境便可工具

 

 二.使用debug將書中事例程序段寫入內存,逐條執行,觀察每條指令執行後CPU相關寄存器中內容的變化學習

  (可用E命令和A命令以兩種方式將指令寫入內存)操作系統

1.使用e命令將指令機器碼寫入指定1000:0地址的內存debug

2.使用u命令進行反彙編查看是否與對應的彙編指令相符合3d

通過覈對與相應的彙編指令符合調試

3.使用t命令單步執行blog

 

因爲指令行數過多,這裏只列出了部分代碼截圖。ip

經覈對,其符合彙編指令的執行

第一步,將寄存器ax的值設爲4e20h

第二步,將寄存器ax的值加上1416h變爲6236h

第三步,將寄存器bx的值設爲2000h

第四步,將寄存器ax的值與bx的值想加並賦給ax

......

步驟過多就不在此一一列舉了,總之能夠發現用e指令經過機器碼修改內存的內容能夠達到彙編指令的做用

4.使用a命令以彙編指令的形式在內存中寫入機器指令

 

5.使用u反彙編指令檢查彙編指令與機器碼是否對應

能夠發現將彙編指令反彙編後的機器碼與以前所列機器碼一致

6.使用t命令進行單步執行

經過彙編指令與單步執行的結果與機器碼單步執行的結果一致

三.將下面三條指令寫入從2000:0開始的內存單元中,使用下面三條指令計算2的8次方

 

 

1.代碼分析

---恢復內容結束---

實驗結論

一.實驗準備

  前言:因爲你們的電腦大多使用的是64位的操做系統,不能在系統自帶的MS-DOS環境下編寫彙編源程序,因此咱們須要DOSBox這個軟件,以便在64位環境下編寫彙編源程序。

下載完成後進行掛載,進入掛載虛擬盤進入debug環境便可

 

 二.使用debug將書中事例程序段寫入內存,逐條執行,觀察每條指令執行後CPU相關寄存器中內容的變化

  (可用E命令和A命令以兩種方式將指令寫入內存)

1.使用e命令將指令機器碼寫入指定1000:0地址的內存

2.使用u命令進行反彙編查看是否與對應的彙編指令相符合

通過覈對與相應的彙編指令符合

3.使用t命令單步執行

 

因爲指令行數過多,這裏只列出了部分代碼截圖。

經覈對,其符合彙編指令的執行

第一步,將寄存器ax的值設爲4e20h

第二步,將寄存器ax的值加上1416h變爲6236h

第三步,將寄存器bx的值設爲2000h

第四步,將寄存器ax的值與bx的值想加並賦給ax

......

步驟過多就不在此一一列舉了,總之能夠發現用e指令經過機器碼修改內存的內容能夠達到彙編指令的做用

4.使用a命令以彙編指令的形式在內存中寫入機器指令

 

5.使用u反彙編指令檢查彙編指令與機器碼是否對應

能夠發現將彙編指令反彙編後的機器碼與以前所列機器碼一致

6.使用t命令進行單步執行

經過彙編指令與單步執行的結果與機器碼單步執行的結果一致

三.將下面三條指令寫入從2000:0開始的內存單元中,使用下面三條指令計算2的8次方

 2000:0 mov ax,1

2000:3 add ax,ax

2000:5 jmp 2000:0003

 1.代碼分析

cs:ip初始指向2000:0

mov ax,1;將ax的值設爲1

add ax,ax:能夠當作將ax+ax的值再賦給ax

jmp 2000:0003;跳轉到2000:3的位置,執行add ax,ax指令

這樣就構成了一個循環,當ax=100h時即十進制的2的8次方

1 +1=2

2+2=4

4+4=8

8+8=10

10+10=20

20+20=40

40+40=80

80+80=100

(以上數字均爲16進制)

100h=16的平方=2的八次方

執行8個循環後(8x3)所得值爲100h(16的平方)即爲2的八次方。

2.按要求輸入指令並單步執行

經過代碼實操演練發現與代碼分析狀況一致:

(1 +1=2

2+2=4

4+4=8

8+8=10

10+10=20

20+20=40

40+40=80

80+80=100

(以上數字均爲16進制)

100h=16的平方=2的八次方

執行8個循環後(8x3)所得值爲100h(16的平方)即爲2的八次方。)

 三.查看內存中的內容

PC機主板上的ROM中寫有一個生廠日期,在內存FFF00H~FFFFFH的某幾個單元中,請找出到這個生存日期並試圖改變它

1.用d指令查看內存FFF00H~FFFFFH內容,FFF00H~FFFFFFH爲物理地址,CS:IP=FFF0:0 FF

顯示出的左邊是每行的起始地址,中間是從指定地址開始的128個內存單元內容,用十六進制的格式輸出,

右邊是每一個內存單元中的數據對應的可顯示的ASCII碼字符。

能夠看到在右下角有從FFF0:00F5開始的8個內存單元顯示爲01/01/92,該值即是ROM的生廠日期

2.利用e指令修改從從FFF0:00F5開始的8個內存單元,並再用d指令查看修改後的值

在修改內存單元內容後發現日期並無被修改,猜想可能與dosbox有關,咱們查看的多是虛擬機的日期,

須要換成XP系統進入debug中進行查看

 

四.向內存從B8100H開始的單元中填寫數據,如:

e b810:0000 01 01 02 02 03 03 04 04

並改變其內容觀察現象

1.向內存從B8100H開始的單元中填寫數據

輸入完成enter後發現屏幕右上角顯示出這樣的圖案

2.修改內存單元中內容並觀察變化

注:第一次我將全部內容都進行了修改,發現屏幕上並無出現任何圖案

 

修改最後一個內存單元的內容,出現這樣的圖案,與初始圖案有所不一樣

 

修改最後兩個內存單元的內容,出現這樣的圖案,與前面的圖案均不一樣

 

修改最後三個內存單元內容,出現

 

修改最後四個內存單元內容,出現

 

經過修改發現,每次內存單元內容的改變都會影響到圖案。

 

五.總結和體會

  經過這次實驗,我瞭解學習了Debug程序的主要用法,Debug是DOS,

Windows都提供的實模式(8086方式)程序的調試工具,使用它的各類指令

查看,改變,內存和寄存器中的內容。

  深入的體會到了用匯編指令代替機器碼的便利性,編程語言是計算機發展的必經之路

  固然,實驗也反映了理論與實踐之間的距離,通過已經瞭解了各類指令的用法。但在第一題中,

使用t指令進行單步執行時,寄存器內容並無任何改變,原來是忘了t指令的用法,沒有注意到CS:IP

的指向。

相關文章
相關標籤/搜索