實驗3 多個段的彙編程式編寫與除錯
一、實驗目的
1. 理解和掌握將資料、程式碼、棧放入不同邏輯段的程式的編寫和除錯
2. 理解具有多個段的彙編源程式對應的目標程式執行時,記憶體分配方式
3. 掌握大小寫字元的轉換方法、數字字元和數值之間的轉換方法
4. 理解並掌握各種定址方式的靈活應用
5. 掌握彙編指令loop, and, or,div, mul的用法
二、實驗準備
複習教材chapter 6-8章。
- chapter 6 包含多個段的程式
- chapter 7 更靈活的定位記憶體地址的方法
- chapter 8 資料處理的兩個基本問題
三、實驗內容
(省略,見“四、實驗步驟與結論”)
四、實驗步驟與結論
實驗任務1
閱讀源程式,從理論上分析原始碼的功能,尤其是line15-25,迴圈實現的功能是什麼,逐行理解每條指令的功能。
①通過edit命令進入編輯,寫入程式碼。
②通過masm、link對程式彙編和連結,並檢視檔案的生成情況。
③使用debug工具進行除錯
通過r命令檢視,然後精確反彙編
執行到程式返回前,觀察結果:
④修改line4裡5個位元組單元的值,重新彙編、連結、執行、觀察結果。
基於觀察,分析、猜測這裡的數值的作用是改變輸出顏色。
最後,該程式首先定義了資料段data,並將其地址通過暫存器ax傳遞給ds;然後是通過迴圈將小寫字母變成大寫字母。
實驗任務2
已知資料段data中定義位元組資料如下:
data segments db 23, 50, 66, 71, 35data ends
①通過edit編輯
②masm彙編、link連結,檢視檔案生成情況。
③觀察結果
成功。
實驗任務3
①通過edit命令進入編輯
②使用masm、link命令進行彙編和連結操作並檢視檔案生成情況。
③使用debug載入、跟蹤
據此可以得到程式返回前的cs、ss以及ds值。
④回答問題
- CPU執行程式,程式返回前,data段中的資料為:0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
- CPU執行程式,程式返回前,cs=076C,ss=076B,ds=076A
- 程式載入後,code段的段地址為X,則data段的段地址為:X-2
實驗任務4
將下面的程式編譯、連線,用debug載入、跟蹤,然後回答問題。
①通過edit命令進入編輯
②使用masm、link命令進行彙編和連結操作並檢視檔案生成情況。
③使用debug載入、跟蹤
檢視資訊並進行精確反彙編
除錯到程式退出前,並檢視資訊
④回答問題
- CPU執行程式,程式返回前,data段中的資料為:0123H, 0456H
- CPU執行程式,程式返回前,cs=076C ,ss=076B ,ds=076A
- 設程式載入後,code段的段地址為X ,則data段的段地址為:X-2,stack段的段地址為:X-1
-
對於如下定義的段:
name segment ...... name ends
如果段中的資料佔N個位元組則程式載入後,該段實際佔有的空間為:(N/16+1)*16。
實驗任務5
將下面的程式編譯、連線,用debug載入、跟蹤,然後回答問題。
①通過edit命令進入編輯
②使用masm、link命令進行彙編和連結操作並檢視檔案生成情況。
③使用debug載入、跟蹤
使用r命令檢視資訊、進行精確反彙編
除錯到程式退出前,並檢視程式執行結果
④回答問題
- CPU執行程式,程式返回前,data段中的資料為:0123h, 0456h
- CPU執行程式,程式返回前,cs=076A,ss=076E,ds=076D
- 程式載入後,code段的段地址為X,則data段的段地址為:X+3,stack段的段地址為:X+4
實驗任務6
如果將(1)、(2)、(3)題中的最後一條偽指令“end start”改為“end”(也就是說不指明程式的入口),則哪個程式仍然可以正確執行?請說明原因。
答:task5.exe仍然可以正確執行,因為其程式碼段放在了最前面,而沒有指明程式入口時,CPU將前兩個實驗的先存放的資料當成指令讀入,這也導致在實驗任務6中對其沒有影響。
實驗任務7
在實現資料相加前,邏輯段c的8個位元組 ② 執行完實現加運算的程式碼後,邏輯段c的8個位元組 (3) 根據①和②的除錯,驗證是否正確的實現資料相加
①通過edit命令進入編輯
補全程式碼:
mov bx,0
mov cx,8
mov ax,a
mov ds,ax
mov ax,c
mov es,ax
s: mov dx,0
mov ax,a
mov ds,ax
add dl, [bx]
mov ax,b
mov ds,ax
add dl,[bx]
mov es:[bx],dl
inc bx
loop s
mov ax,4c00h
int 21h
②使用masm、link命令進行彙編和連結操作並檢視檔案生成情況。
③使用debug載入、跟蹤
檢視並精確反彙編
除錯到程式退出前,檢視執行結果
程式正確相加。
實驗任務8
編寫code段中的程式碼,用push指令將a段中的8個字型資料,逆序儲存到b段中
①通過edit命令進入編輯
補全程式碼:
mov ax,b mov ss,ax mov sp,10h mov ax,a mov ds,ax mov cx,8 mov bx,0 s: push [bx] add bx,2 loop s mov ax,4c00h int ax,21h
②使用masm、link命令進行彙編和連結操作並檢視檔案生成情況。
③使用debug載入、跟蹤
檢視資訊進行反彙編,為除錯做基礎。
除錯到程式退出前,並檢視是否正確逆序儲存資料:
確實成功逆序儲存了。
五、實驗總結
經過這次實驗發現我對於多段彙編程式還不夠理解和熟悉,之後還需繼續學習。