四、實驗結論
2.實驗任務2
(1)使用d命令查看生產時期的截圖
(2)使用e命令修改生產日期所在內存單元以及修改后再次使用d命令查看的截圖
(3)結論:不能修改。使用e命令修改生產時期所在的內存單元的操作是無效的,因為這等於改寫只讀存儲器的內容。
3.實驗任務3
(1)使用e命令修改內存單元的命令:
e b800:0 03 04 03 04 03 04 03 04 03 04
效果截圖:
(2)使用f命令批量填充內存單元的命令
f b800:0f00 0f9f 03 04
效果截圖:
(3)修改內存單元和數據的命令如下:
e b810:a 04 03 04 03 04 03
效果截圖:
4.實驗任務4
(1)填空
1 -a 2 mov ax, 20 3 mov ds, ax 4 mov ss, ax 5 mov sp, 30 6 push [0] ; 執行后,寄存器(sp) = 002E 7 push [2] ; 執行后,寄存器(sp) = 002C 8 push [4] ; 執行后,寄存器(sp) = 002A 9 push [6] ; 執行后,寄存器(sp) = 0028 10 pop [6] ; 執行后,寄存器(sp) = 002A 11 pop [4] ; 執行后,寄存器(sp) = 002C 12 pop [2] ; 執行后,寄存器(sp) = 002E 13 pop [0] ; 執行后,寄存器(sp) = 0030
(2)問題1:
棧頂的邏輯地址:0020:0030
棧頂的物理地址:0020*16+0030=00230h
問題2:實驗截圖如下:
問題3:沒有變化。
實驗截圖如下:
問題4:按字來看,數據順序與原來相反。
實驗截圖如下:
5.實驗任務5
(1)問題1:使用t命令單步執行mov ss, ax時,單步執行完這一條指令沒有暫停。因為Debug的T命令在執行修改寄存器SS的指令時,下一條指令也緊接着被執行。所以指令mov sp, 30緊接着上一條指令被執行了。
(2)問題2:黃色下划線表示的是CS:IP,在數據進棧的同時,存儲的位置也發生了改變。
6.實驗任務6
(1)程序源碼:
1 assume cs:code 2 3 code segment 4 start: 5 mov cx, 10 6 mov dl, '0' 7 s: mov ah, 2 8 int 21h 9 add dl, 1 10 loop s 11 12 mov ah, 4ch 13 int 21h 14 code ends 15 end start
(2)使用masm、link對程序匯編鏈接過程,以及運行可執行程序task5.exe的運行結果截圖:
(3)在debug中查看task5.exe的程序段前綴PSP的截圖:
前兩個字節是CD 20 。
7.實驗任務7
(1)補全后的完整源碼:
1 assume cs:code 2 code segment 3 mov ax, cs 4 mov ds, ax 5 mov ax, 0020h 6 mov es, ax 7 mov bx, 0 8 mov cx, 17h 9 s: mov al, [bx] 10 mov es:[bx], al 11 inc bx 12 loop s 13 14 mov ax, 4c00h 15 int 21h 16 code ends 17 end
第一個空填cs
依據:CS:IP指向要執行的指令(即本題中要復制的代碼)。
第二個空填17h
依據:task7.asm中line3-line12的代碼占據了17h個單元,一開始寄存器CX中存儲的是循環的次數。
(2)使用g命令運行到指定點和使用u命令反匯編0:200到復制代碼長度這一段內存空間的截圖:
五、實驗總結
收獲:
向 ROM(只讀存儲器)中寫入數據的操作是無效的。
Debug的T命令在執行修改寄存器SS的指令時,下一條指令也緊接着被執行。
尚存的問題:
實驗任務5中的問題2,對於存儲CS:IP的位置移動的原因尚未清楚。