一.實驗準備編程
前言:因爲你們的電腦大多使用的是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
的指向。