1. 程式人生 > 實用技巧 >實驗3 多個段的彙編程式編寫與除錯

實驗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, 35
data ends

①通過edit編輯

②masm彙編、link連結,檢視檔案生成情況。

③觀察結果

成功。

實驗任務3


①通過edit命令進入編輯

②使用masm、link命令進行彙編和連結操作並檢視檔案生成情況。

③使用debug載入、跟蹤

據此可以得到程式返回前的cs、ss以及ds值。

④回答問題

  1. CPU執行程式,程式返回前,data段中的資料為:0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
  2. CPU執行程式,程式返回前,cs=076C,ss=076B,ds=076A
  3. 程式載入後,code段的段地址為X,則data段的段地址為:X-2
    ,stack段的段地址為:X-1

實驗任務4


將下面的程式編譯、連線,用debug載入、跟蹤,然後回答問題。

①通過edit命令進入編輯

②使用masm、link命令進行彙編和連結操作並檢視檔案生成情況。

③使用debug載入、跟蹤

檢視資訊並進行精確反彙編

除錯到程式退出前,並檢視資訊

④回答問題

  1. CPU執行程式,程式返回前,data段中的資料為:0123H, 0456H
  2. CPU執行程式,程式返回前,cs=076C ,ss=076B ,ds=076A
  3. 設程式載入後,code段的段地址為X ,則data段的段地址為:X-2,stack段的段地址為:X-1
  4. 對於如下定義的段:

    name segment
    
    ......
    
    name ends

    如果段中的資料佔N個位元組則程式載入後,該段實際佔有的空間為:(N/16+1)*16。

實驗任務5


將下面的程式編譯、連線,用debug載入、跟蹤,然後回答問題。

①通過edit命令進入編輯

②使用masm、link命令進行彙編和連結操作並檢視檔案生成情況。

③使用debug載入、跟蹤

使用r命令檢視資訊、進行精確反彙編

除錯到程式退出前,並檢視程式執行結果

④回答問題

  1. CPU執行程式,程式返回前,data段中的資料為:0123h, 0456h
  2. CPU執行程式,程式返回前,cs=076A,ss=076E,ds=076D
  3. 程式載入後,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載入、跟蹤

檢視資訊進行反彙編,為除錯做基礎。

除錯到程式退出前,並檢視是否正確逆序儲存資料:

確實成功逆序儲存了。

五、實驗總結

經過這次實驗發現我對於多段彙編程式還不夠理解和熟悉,之後還需繼續學習。