實驗1 C語言開發環境使用和資料型別、運算子、表示式
實驗任務二:
(1)使用d命令檢視日期,得到日期為1992年1月1日
(2)使用e命令修改後再次檢視,發現無法修改,原因是FFF00H~FFFFFH區是隻讀儲存區,只讀儲存沒有修改許可權
實驗任務三:
(1)debug中通過e命令向記憶體中寫入資料
(2)通過f命令批量向記憶體中寫入資料
(3)修改記憶體單元資料
實驗任務四:
1 -a 2 mov ax, 20 3 mov ds, ax 4 mov ss, ax 5 mov sp, 30 6 push [0] ; 執行後,暫存器(sp) = 2e 7 push [2] ; 執行後,暫存器(sp) = 2c8 push [4] ; 執行後,暫存器(sp) = 2a 9 push [6] ; 執行後,暫存器(sp) = 28 10 pop [6] ; 執行後,暫存器(sp) = 2a 11 pop [4] ; 執行後,暫存器(sp) = 2c 12 pop [2] ; 執行後,暫存器(sp) = 2e 13 pop [0] ; 執行後,暫存器(sp) = 30
問題1:指令 mov ss, ax 和 mov sp, 30 執行後, 棧頂的邏輯地址和實體地址分別是:
邏輯地址:0020:0030;
實體地址:00230H;
問題2:指令 push [6] 執行結束, pop [6] 執行之前,使用 d 20:20 2f 檢視此時棧空間資料。給出實驗截圖。
問題3:編指令 pop [0] 執行結束後, pop [0] 指令執行結束後,使用d命令 d 20:0 7 檢視此時資料空間內的資料是否有變化。給出實驗截圖。
問題4:把最後四條指令改成截圖中的順序, pop [6] 指令執行結束後,使用d命令 d 20:0 7 檢視此時資料空間內的資料是否有變化。給出實驗截圖。
實驗任務五:
問題1:使用t命令單步執行 mov ss, ax 時,是單步執行完這一條指令就暫停了嗎?後面的指令 mov sp, 30 是什麼時候執行的?
答:沒有暫停。執行movss, ax後隨後就執行mov sp 30。
問題2:根據彙編指令,前三條指令執行後,00220H ~ 0022fH被設定為棧空間。並且,初始時,已通 過f命令將初始棧空間全部填充為0。觀察單步除錯時,棧空間00220H ~ 0022fH記憶體單元值的變化,特別是圖示中黃色下劃線表示出的資料值。根據實驗觀察,嘗試思考和分析原因。
答:因為mov sp 30是在執行movss,ax的時候一起執行的,所以在執行mov ss的時候相當於兩條指令一塊執行,那麼當前執行指令的地址便往後跳到了073f:0108。
實驗任務六:
(1) 給出程式原始碼:
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
(2)給出使用masm、link對程式彙編連結過程截圖,以及,執行可執行程式task5.exe的執行結果截圖:
實驗執行結果:
給出在debug中檢視task5.exe的程式段字首PSP的截圖:
實驗任務七:
(1)補全程式碼:
1 assume cs:code 2 3 code segment 4 mov ax, _cs_ 5 mov ds, ax 6 mov ax, 0020h 7 mov es, ax 8 mov bx, 0 9 mov cx, _17H_ 10 s: mov al, [bx] 11 mov es:[bx], al 12 inc bx 13 loop s 14 15 mov ax, 4c00h 16 int 21
依據:1、cs為程式段的起始地址,要在下一步傳給ds;
2、通過截圖並利用CX數值進行計算得出位元組長度為0017h。
(2)在debug中除錯,使用g命令將程式執行到 loop s 之後、 mov ax, 4c00h 之前,然後,使用u命令 對0:200h開始的記憶體單元反彙編,確認是否把task7.asm中line3-line12的程式碼複製到了目標記憶體空間。