一、實驗目的
1. 掌握8086CPU、寄存器、內存(包括棧空間)的基礎知識
2. 掌握匯編源程序組成與結構
3. 理解和掌握寄存器間接尋址方式[bx]
4. 掌握匯編指令mov, add, sub, jmp, push, pop,loop的用法,理解高級語言的表達和抽象機制
5. 熟練掌握使用debug工具編寫和調試x86匯編命令的方法
6. 掌握匯編語言源程序編寫→匯編→鏈接→調試的工具和方法
二、實驗結論
實驗任務2:
上圖為使用d命令查看生產日期的截圖。
上圖為使用e命令修改后查看,發現修改失敗。
實驗任務3:
上圖為使用e命令修改內存單元后的情形,在屏幕左上角出現了5個圖案。
上圖為使用f命令批量填充內存單元后的情形,屏幕下方出現許多圖案。
上圖為查看該段內存內容,並嘗試使用e命令對其進行修改,修改后發現屏幕下方的部分圖案發生改變。
實驗任務4:
填空:2E -> 2C -> 2A -> 28 -> 2A -> 2C -> 2E -> 30
問題1:邏輯地址:20:30
物理地址:00230H
問題2:
問題3:
此時數據空間內的數據沒有變化。
問題4:
按照截圖修改pop指令的順序后,使用d命令查看發現順序發生改變,原因是因為出棧的順序為70 80 50 60 30 40 10 20
實驗任務5:
問題1:使用t命令單步執行mov ss, ax時,並不是單步執行完這一條指令就暫停,而是緊接着執行下一條指令即mov sp, 30。
問題2:
從實驗中發現截圖中第一處黃線划的08 01為當前代碼的偏移地址,第二處黃線划的是當前代碼的段地址,執行完mov sp, 30后偏移地址為0108,最后執行完push ax后在0110 即 10 01 而在執行入棧操作后,棧頂指針向前移動2個字節,所以整體向前移動2個字節。
實驗任務6:
源碼:
1 assume cs:code 2 code segment 3 start: 4 mov cx, 10 5 mov dl, '0' 6 s: mov ah, 2 7 int 21h 8 add dl, 1 9 loop s 10 11 mov ah, 4ch 12 int 21h 13 code ends 14 end start
上為使用masm和link對程序進行匯編和鏈接過程的截圖。
上為運行該程序后輸出的結果。
上為在debug中查看task5.exe的程序段前綴PSP的截圖,由圖可見,程序前兩個 字節是為CD 20。
實驗任務7:
源碼:
1 assume cs:code 2 code segment 3 mov ax, 076Ah 4 mov ds, ax 5 mov ax, 0020h 6 mov es, ax 7 mov bx, 0 8 mov cx, 200 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
上為使用u命令反匯編查看,發現復制成功。
三、實驗總結
通過本次實驗我學到了許多關於匯編語言的實踐操作方面的知識,了解並實踐了如何在Dosbox中運用在書本上學到的匯編語言程序設計的知識。我發現在使用e命令在顯存部分修改值后,在屏幕上會顯示相對應的圖案,如果繼續使用其他代碼如d命令查看等,將輸出在屏幕上的圖案覆蓋掉后,因為屏幕上的內容發生改變,所以顯存中的數據也會隨之發生改變,這就導致連續的兩次d命令查看內存中的內容可能存在差異。