組合語言程式設計實驗報告五

2022-09-13 07:18:09 字數 3234 閱讀 5299

南京資訊工程大學實驗報告

實驗名稱 實驗 5 編寫、除錯具有多個段的程式   實驗日期  11.26  得分

學院 計軟院

專業 電腦科學與技術

年級 2017級

班次 5班

姓名 陳奕明

學號 20171308194

一、實驗目的

1. 理解和掌握將資料、**、棧放入不同段的程式的編寫和除錯 2. 理解具有多個段的彙編源程式對應的目標程式執行時,記憶體分配方式

二、實驗準備

1. 結合第6章教材和課件,複習第6章內容 2. 複習第3章「棧」的知識

四、實驗結論

實驗(1):

i.程式返回前,data段中的資料應為原有資料保持不變,即0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

ii.程式返回前,cs=076c、ss=076b、ds=076a

iii.設程式載入後,code段的段位址為x,則data段的段位址為x-20h,stack段的段位址為x-10h

。實驗(2):

i.程式返回前,data段中的資料應為原有資料保持不變,即0123h,0456h

ii.程式返回前,cs=076c、ss=076b、ds=076a

iii.設程式載入後,code段的段位址為x,則data段的段位址為x-20h,stack段的段位址為x-10h。

iv.如果段中的資料佔n個位元組,則程式載入後,該段實際占有的空間為(n/16 + 1 )*16,即每個段中以16位元組來對齊。

實驗(3):

i.程式返回前,data段中的資料應為原有資料保持不變,即0123h,0456h

ii.程式返回前,cs=076a、ss=076e、ds=076d

iii.設程式載入後,code段的段位址為x,則data段的段位址為x+20h,stack段的段位址為x+30h。

問題(4):

經測試把第三個程式的「end start」改成「end」,經思考,結論如下:

1)"end start"的作用是指名程式的入口,「end」的功能是標誌整個程式段的結束。

2)當各個程式中把「end start」改成「end」以後,程式即喪失程式入口語句

3)但是在2)的情況下第乙個和第二個程式不能正常執行了,說明可能無法找到程式的入口,但是第三個程式卻能正常執行,可見在這個程式中即使沒有指明程

序的入口,它仍可從程式的入口開始執行程式,進行正確的操作。

4)只有程式三中的第乙個機器碼為**,而前兩個程式中的開始機器碼都不是**。

結論如下:

1)在指明程式入口的情況,程式從程式入口開始執行

2)在沒有指明程式入口的情況下,系統預設從程式的第乙個機器碼執行

實驗任務(5),要求在部落格中給出如下內容:

(1) 匯程式設計序源**:

assume cs:

code

a segment

db 1,2,3,4,5,6,7,8

a ends

b segment

db 1,2,3,4,5,6,7,8

b ends

c1 segment

db 8 dup(0

)c1 ends

code segment

start:

movax,a

movds,ax

mov bx,0

movax,b

moves,ax

mov cx,8

s1:mov al,ds:

[bx]

addes:

[bx],al

incbx

loop s1

mov cx,8

mov bx,0

movax,c1

movds,ax

s2:mov al,es:

[bx]

addds:

[bx],al

incbx

loop s2

movax,4c00h

int21h

code ends

end start

(2) 在debug中除錯程式截圖,截圖中包括如下資訊:

① 在實現資料相加前,邏輯段c的8個位元組 ② 執行完實現加運算的**後,邏輯段c的8個位元組 (3) 根據①和②的除錯,驗證是否正確的實現資料相加。

由截圖得,相加成功。

實驗任務(6), 要求在部落格中給出如下內容:

(1) 匯程式設計序源**

assume cs:

code

a segment

dw 1,2,3,4,5,6,7,8,9

,0ah,0bh,0ch,0dh,0eh,0fh,0ffh

a ends

b segment

dw 8 dup(0

)b ends

code segment

start:

movax,a

movds,ax

mov bx,0

movax,b

movss,ax

movsp,10h

mov cx,8

s:push

[bx]

add bx,2

loop s

movax,4c00h

int21h

code ends

end start

(2) 在debug中除錯程式截圖,截圖中包括如下資訊: ① 在push操作執行前,檢視邏輯段b的8個字單元資訊截圖 ② 執行 push操作,然後再次檢視邏輯段b的8個子單元資訊截圖

(3) 根據①和②的除錯,驗證是否正確的實現資料相加。

根據實驗截圖,實驗成功,前8個字型資料已經逆序儲存到b中。

五、總結與體會

本次實驗中,重點我明白了x86cpu的段的概念:

x86的乙個段的大小是16個位元組,也就是說所有的段開始的位置必須是16的整數倍,因此乙個段分配的時候大小是16的整數倍,

那麼1-16個位元組,段需要16位元組17-32個位元組需要32個位元組一次類推,n個位元組就需要(n/16+1)*16。

並且對loop迴圈指令以及多個程式段的原始碼執行檔案和預分配空間命令有了進一步的了解。

《C語言程式設計》實驗報告(五)

1.熟練地掌握函式的定義方法和呼叫規則 2.掌握在c語言程式中主調函式和被呼叫函式之間進行資料傳遞的規則 3.了解函式的返回值及其型別,並正確使用它 4.了解區域性變數和全域性變數的作用域及它們與儲存分類的關係,理解變數的存在性和可見性的概念 5.練習遞迴函式的使用.實驗 include inclu...

彙編實驗報告

彙編實驗報告 實驗目標 1.了解並懂得初步使用組合語言 2.了解 cpu 中各元件的作用 3.通過比較,得出高階語言與機器語言的聯絡與區別 任務 1 2 1.pc,ir 暫存器的作用 ir 1.用來存放後續指令位址 2.儲存當前正在執行的一條指令 4.儲存當前cpu所訪問的主存單元的位址 2.acc...

C 程式設計實驗報告(五)

報告1 實驗目的 學會使用迴圈控制語句解決實際問題 實驗內容 用if語句編寫選擇結構的程式,完成分段函式的求解 作 者 劉鎮 完成日期 2011 年 10 月 26 日 版 本 號 1.002 對任務及求解方法的描述部分 輸入描述 函式自變數x 問題描述 求函式的值 當x 0.3時,f x 0 當0...