1.使用Debug,将程序(見實驗源代碼)寫入内存,逐條執行,觀察每條指令執行後,CPU中相關寄存器中内存的變化。
2.将下面三條指令(見實驗源代碼)寫入從2000:0開始的内存單元中,利用這三條指令計算2的8次方。
3.查看内存中存有的PC機主闆上的ROM生産日期并試圖修改。
4.觀察下圖中的實驗過程,分析為何2000:0~2000:f中的内容會發生改變
【第一個實驗】(1.1)實驗源代碼(粘貼源代碼):
機器碼 彙編指令
b8 20 4e mov ax,4E20H
05 16 14 add ax,1416H
bb 00 20 mov bx,2000H
01 d8 add ax,bx
89 c3 mov bx,ax
01 d8 add ax,bx
b8 1a 00 mov ax,001AH
bb 26 00 mov bx,0026H
00 d8 add al,bl
00 dc add ah,bl
00 c7 add bh,al
b4 00 mov ah,0
00 d8 add al,bl
04 9c add al,9CH
(1.2)實驗代碼、過程、相應結果(截圖)并對實驗進行說明和分析:
Win10下可以借用Dosbox調試Debug,如下圖
用Debug下的-d命令查看1000:0之後128個内存單元中的内容
用Debug下的-a命令以彙編語言的形式寫入從1000:0開始的内存單元中
使用Debug下的-d命令查看1000:0内存中的内容核對
在-t命令之前注意CS:IP當前指向,這裡指向073F:0102,需要修改其指向
使用Debug下的-r命令修改CS:IP指向,如下圖
使用Debug下的-t命令逐次執行1000:0中的指令,截圖如下
曆次-t命令下CS:IP指向和寄存器中内容如下:
CS:IP AX BX
1000:0000 0000 0000
1000:0003 4E20 0000
1000:0006 6236 0000
1000:0009 6236 2000
1000:000B 8236 2000
1000:000D 8236 8236
1000:000F 046C 8236
1000:0012 001A 8236
1000:0015 001A 0026
1000:0017 0040 0026
1000:0019 2640 0026
1000:001B 2640 4026
1000:001D 0040 4026
1000:001F 0066 4026
1000:0021 0002 4026
(2.1)實驗源代碼:
mov ax,1 (從2000:0開始的内存單元)
add ax,ax
jmp 2000:0003 (觀察跳到什麼地方了?)
(2.2)實驗代碼、過程、相應結果(截圖)并對實驗進行說明和分析:
源代碼寫入過程類似上面1.2的過程,這裡不再贅述,僅展示截圖
通過jmp指令,在執行一次mov ax,1後程序将在add ax,ax和jmp 2000:0003之間循環往複,直到計算出2的8次方
(下面忽略中間過程,僅關注最終結果即可)
指令執行過程紛繁複雜!
(3.1)實驗代碼、過程、相應結果(截圖)并對實驗進行說明和分析:
由于dosbox模拟一個真實的電腦環境,故01/01/92與主闆ROM不同可以理解。
【第二個實驗】(1.1)實驗源代碼(粘貼源代碼):
mov ax,ffff
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax=C0EA
add ax,[2] ;ax=C0FC
mov bx,[4] ;bx=30F0
add bx,[6] ;bx=6021
push ax ;sp= 00FE ;修改的内存單元的地址是2200:00FE 内容為C0FC
push bx ;sp= 00FC ;修改的内存單元的地址是2200:00FC 内容為6021
pop ax ;sp= 00FE ;ax=6021
pop bx ;sp=0100 ;bx=C0FC
push [4] ;sp= 00FE ;修改的内存單元的地址是2200:00FE 内容為30F0
push [6] ;sp= 00FC ;修改的内存單元的地址是2200:00FC 内容為2F31
(1.2)實驗代碼、過程、相應結果(截圖)并對實驗進行說明和分析:
修改CS:IP,使之指向2000:0000,并查看當前寄存器中内容:
執行mov ax,ffff
執行mov ds,ax
執行mov ax,220
執行mov ss,ax,此處忘記截圖,可參考下圖
執行mov sp,0100
執行mov ax,[0]
執行add ax,[2]
執行mov bx,[4]
執行add bx,[6]
執行push ax
執行push bx
執行pop ax
執行pop bx
執行push [4]
執行push [6]
相關填空見(1.1)
(2.1) 實驗源代碼(粘貼源代碼):
mov ax,1000H
mov ds,ax
mov ds,[0]
add ds,ax
(2.2)實驗代碼、過程、相應結果(截圖)并對實驗進行說明和分析:
輸入指令過程中,出現錯誤,是因為add,sub不能對段寄存器ds進行操作
運行前三條指令是正常的(*)
若一定要執行add ds,ax,可以采用類似向ds輸入數據的方法,如下
運行結果如下
由于前面在運行不完整程序的前三條指令(*)後,寄存器ds的值發生變化,導緻bx的值發生變化,進而導緻add bx,ax運行後bx變化,最終導緻ds變化,所以在-t命令後截圖中寄存器的值與之前不同,可以通過正式程序之前提前修改ds的值,使之與之前一緻來消除影響。
(3.1)是因為中斷的影響
【實驗心得】CS:IP指向指令的内存單元地址,CPU通過它區分指令和數據。DS存放要訪問數據的段地址,CPU是不是也可以通過它來區分指令和數據呢?SS:SP時刻指向棧頂,對于PUSH指令,先進行SP=SP-2再送數據入棧;POP指令相反,先取出棧内數據再SP=SP 2。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!