1. 程式人生 > 其它 >實驗1 C語言開發環境使用和資料型別、運算子、表示式

實驗1 C語言開發環境使用和資料型別、運算子、表示式

實驗任務二:

1)使用d命令檢視日期,得到日期為199211

(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) = 2c
8 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的程式碼複製到了目標記憶體空間。