




已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
匯編語言程序設(shè)計報告匯編語言程序設(shè)計報告 班級 班級 學號 學號 姓名 姓名 目錄目錄 匯編語言程序設(shè)計報告 1 匯編語言程序設(shè)計實驗報告 4 實驗一 4 實驗內(nèi)容 4 實驗目的 4 實驗代碼 4 實驗代碼整體思路 5 1 檢測所編程序的正確性 5 實驗二 7 1 實驗內(nèi)容 7 結(jié)果測試 11 Debug 11 實驗三 13 實驗要求 13 實驗代碼 13 實驗代碼思路 15 檢測結(jié)果 驗證正確性 15 結(jié)論 17 實驗四 17 實驗內(nèi)容 17 流程圖 18 實驗代碼 18 Windbg 21 實驗結(jié)果測試 23 輸入數(shù)據(jù)進行測試 24 實驗五 24 實驗內(nèi)容 多模塊程序設(shè)計及多語言混合編程 24 要求 24 實驗代碼 24 實驗代碼分析說明 26 實驗數(shù)據(jù)檢測 判斷是否成功完成實驗任務 27 實驗心得 28 匯編語言程序設(shè)計實驗報告匯編語言程序設(shè)計實驗報告 實驗一實驗一 實驗內(nèi)容實驗內(nèi)容 熟悉 DOS 編程環(huán)境 編寫一個 DOS 環(huán)境的匯編語言程序 要求 從鍵盤 輸入一串字符 去除連續(xù)重復的字符后再顯示 如 輸入一串為 aaawwweerrty 的字符 串 輸出結(jié)果應為 awerty 實驗目的實驗目的 通過上機實踐加深對 16 位環(huán)境下編程的了解 學會使用 debuge 調(diào)試程序 實驗代碼實驗代碼 ASSUME CS CODE DS DATA DATA SEGMENT BUFFER DB 60 60 DUP PRINT DB TO INPUT CRLF DB 0DH 0AH DATA ENDS CODE SEGMENT MAIN MOV AX DATA MOV DS AX MOV AH 9 LEA DX PRINT INT 21H MOV AH 0AH LEA DX BUFFER INT 21H MOV AH 9 LEA DX CRLF INT 21H LEA SI BUFFER 1 LP1 INC SI LP2 MOV AL SI CMP AL 13 JZ DISP CMP AL SI 1 JNZ LP1 MOV DI SI LP3 INC DI MOV AL DI 1 MOV DI AL CMP AL 13 JZ LP2 JMP LP3 DISP MOV AL MOV SI AL MOV AH 9 LEA DX BUFFER 2 INT 21H EXIT MOV AX 4C00H INT 21H CODE ENDS END MAIN 實驗代碼整體思路實驗代碼整體思路 定義一個大小為 60 的緩沖區(qū) 用來存儲從鍵盤輸入的字 符串 調(diào)用中斷調(diào)用 將字符串輸入到緩沖區(qū)當中 使用取地址符號 Lea 取得輸入字符串的首地址然后后一位與前一 位相比 若相同則將其舍棄 否者將其記錄在緩沖區(qū)中 循環(huán)結(jié) 束之后在其后補上字符 即可一次輸出 無單個輸出 1 檢測所編程序的正確性檢測所編程序的正確性 編譯所建的編譯所建的 1 asm 文件 文件 按下回車鍵之后開始編譯 如下圖所示 編譯結(jié)束表明沒有錯誤不存在警告按下回車鍵之后開始編譯 如下圖所示 編譯結(jié)束表明沒有錯誤不存在警告 對編譯成功之后的文件進行鏈接 以生成能運行的對編譯成功之后的文件進行鏈接 以生成能運行的 exe 文件 如下圖文件 如下圖 1 1 所示 所示 1 1 鏈接之后發(fā)現(xiàn)鏈接 鏈接之后發(fā)現(xiàn)鏈接 Link 之后也是成功的 接下來就進行測試的最后一步 即運行 之后也是成功的 接下來就進行測試的最后一步 即運行 1 exe 文件 輸入一串字符串 看能否達到預期的目的 如達到 則成功 否者重新編文件 輸入一串字符串 看能否達到預期的目的 如達到 則成功 否者重新編 譯 譯 可見 與預期目的一致 達到了目的 可見 與預期目的一致 達到了目的 6 該實驗使用的知識點該實驗使用的知識點 1 中斷調(diào)用 以及使用功能號實現(xiàn)輸入輸出中斷調(diào)用 以及使用功能號實現(xiàn)輸入輸出 2 使用循環(huán) 無條件轉(zhuǎn)移指令 使用循環(huán) 無條件轉(zhuǎn)移指令 JMP 等 等 實驗二實驗二 1 實驗內(nèi)容實驗內(nèi)容 1 程序中自定義緩沖區(qū) AREA1 其中存放 200 個有序的無符號字型 數(shù)據(jù) 至少有 3 個重復數(shù)據(jù) 編程序?qū)⑵渑判蚝笏偷阶?AREA2 開始的 單元中 要求傳送后的數(shù)據(jù)從大到小排序 并實現(xiàn)查找功能 判定需要 查找的數(shù)據(jù)在 AREA1 與 AREA2 中分別對應的位置 并通過查看內(nèi)存驗 證結(jié)果的正確性 把有序的無符號字型數(shù)據(jù)換成帶符號字型數(shù)據(jù) 實現(xiàn) 以上功能 2 熟悉 DEBUG 調(diào)試環(huán)境 使用 DEBUG 調(diào)試程序察看機器碼 并單 步執(zhí)行 觀察每一條指令的執(zhí)行結(jié)果 寄存器的內(nèi)容 內(nèi)存變量和堆 棧數(shù)據(jù)的變化情況 2 實驗代碼實驗代碼如下 如下 assume ds data cs code ss stack data segment area1 dw 2 2 2 10 15 255 0 67 143 count dw area1 index dw 0 area2 dw 200 dup 0 flag db 200 dup 0 tips1 db Please input the number you want to find tips2 db Not Found crlf db 0dh 0ah output db 5 dup data ends stack segment stack dw 32 dup stack ends code segment findmost proc find the greatest number in area1 put it in AX push bx push cx push dx push bp lea bx area1 mov dx bx add bx 2 lo cmp dx bx jge smaller jae smaller 無符號時使用此指令 并將上條指令注釋掉無符號時使用此指令 并將上條指令注釋掉 and flag bx 1 jnz smaller mov dx bx 將當前最大值儲存將當前最大值儲存 mov bp bx smaller add bx 2 cmp bx count 檢查是否為最后一個元素檢查是否為最后一個元素 記錄最大值于記錄最大值于 ax jl notfinish mov ax dx mov WORD PTR ds flag bp 1 pop bp pop dx pop cx pop bx ret notfinish jmp lo findmost endp writeGreatest2area2 proc 按照要求將數(shù)據(jù)寫入按照要求將數(shù)據(jù)寫入 area2 push ax push bx lea bx area2 find another call findmost mov bx ax add bx 2 mov index bx lea ax area2 sub index ax lea ax count cmp index ax jnz find another pop bx pop ax ret writeGreatest2area2 endp convertDigital2Ascii proc push bx push dx mov dx ax xor bx bx mov cl 100 div cl add ax 48 mov output bx al inc bx mov ax dx mov cl 10 div cl add ah 48 add al 48 mov output bx al inc bx mov output bx ah lea dx output mov ah 9 int 21h lea dx crlf int 21h mov ax dx pop dx pop bx ret convertDigital2Ascii endp findTheValue proc 在兩個區(qū)域中分別查找數(shù)字在兩個區(qū)域中分別查找數(shù)字 ax 的位置的位置 push ax push bx push si push cx push dx mov cx count mov bx 2 equal1 add bx 2 cmp ax area1 bx jnz equal1 push ax mov ax bx sar ax 1 inc ax call convertDigital2Ascii pop ax mov bx 2 equal2 add bx 2 cmp ax area2 bx jnz equal2 push ax mov ax bx sar ax 1 inc ax call convertDigital2Ascii pop ax pop dx pop cx pop si pop bx pop ax ret findTheValue endp start mov ax data mov ds ax call writeGreatest2area2 mov ax 255 call findTheValue mov ax 4c00h int 21h code ends end start 結(jié)果測試 結(jié)果測試 對實驗二進行編譯鏈接 運行程序 輸出實驗結(jié)果 Debug 顯示寄存器內(nèi)容 如下圖所示 用 U 命令反匯編可執(zhí)行代碼 如下圖所示 用 g 命令設(shè)置斷點到 CS 00D8 處 如下圖所示 用 t 命令跟蹤執(zhí)行程序 如下圖所示逐條跟蹤三次的結(jié)果 用 q 命令退出 實驗三實驗三 實驗要求 實驗要求 熟悉 Windows 編程環(huán)境 編寫一個 Windows 界面匯編程序 顯示一個帶 Yes No 選擇按鈕的 消息框 標題顯示為 自己的姓名 正文內(nèi)容顯示為 學號 選擇 Yes 的 返回 你選擇的是 Yes 選擇 No 的返回 你選擇的是 No 2 編寫一個 Windows 32 位控制臺程序 要求從鍵盤輸入 5 個十六 進制數(shù) 輸出該數(shù)所對應的二進制數(shù)中所包含 0 的個數(shù) 3 熟悉 WINDBG 調(diào)試環(huán)境 使用 WINDBG 調(diào)試程序察看機器碼 并單步執(zhí)行 觀察每一條指令的執(zhí)行結(jié)果 寄存器的內(nèi)容 內(nèi)存變量和堆 棧數(shù)據(jù)的變化情況 實驗代碼 實驗代碼 386 model flat stdcall option casemap none MessageBoxA PROTO dword 386 model flat stdcall includelib msvcrt lib printf PROTO C dword vararg dword dword dword MessageBox equ Includelib user32 lib Includelib msvcrt lib NULL equ 0 MB OK equ 1 stack 4096 data SzTile byte 陳強陳強 0 SzMsg byte 1120131888 0 NO1 byte 我選的是確定我選的是確定 0ah 0 NO2 byte 我選的是取消我選的是取消 0ah 0 code start invoke MessageBox NULL offset SzMsg offset SzTile MB OK cmp eax 1 jz A cmp eax 1 jnz B A invoke MessageBox NULL offset NO1 offset SzTile MB OK ret B invoke MessageBox NULL offset NO2 offset SzTile MB OK ret ret end start scanf PROTO C dword vararg data szmsg byte d 0ah 0 msg byte d 0 szformat byte x 0 buf dword 40 dup l0 dword l1 dword l2 dword l3 dword l4 dword code start mov esi 0 L invoke scanf offset szformat offset buf mov eax buf mov ecx 4 mov edx 0 t mov ebx eax and ebx 1 cmp ebx 0 jz yz cmp ebx 0 jnz ty yz inc edx ty shr eax 1 loop t push edx INC ESI cmp esi 5 jb L pop l4 pop l3 pop l2 pop l1 pop l0 invoke printf offset szmsg l0 invoke printf offset szmsg l1 invoke printf offset szmsg l2 invoke printf offset szmsg l3 invoke printf offset msg l4 ret end start 實驗代碼思路實驗代碼思路 第一小題代碼思路 第一小題代碼思路 1 說明說明 MessageboxA 的調(diào)用規(guī)則和的調(diào)用規(guī)則和 參數(shù)類型參數(shù)類型 2 將定義的將定義的 MessageBoxA 通過指令通過指令 equ 賦給賦給 MessageBox 3 使用偽指令使用偽指令 invoke 首次輸出 首次輸出顯顯 示一個帶示一個帶 Yes No 選擇按鈕的消息選擇按鈕的消息 框 標題顯示為 自己的姓名 正框 標題顯示為 自己的姓名 正 文內(nèi)容顯示為 學號文內(nèi)容顯示為 學號 4 通過比較通過比較 MessageBox 的返回值與的返回值與 1 的大小確定其選擇的的大小確定其選擇的 yes 還是還是 no 5 再次使用偽指令再次使用偽指令 INVOKE 調(diào)用調(diào)用 MessageBox 二次輸出選擇二次輸出選擇 Yes 的返的返 回 回 你選擇的是你選擇的是 Yes 選擇 選擇 No 的的 返回 返回 你選擇的是你選擇的是 No 第二小題代碼分析 第二小題代碼分析 1 說明說明 scanf 和和 printf 的調(diào)用規(guī)則和的調(diào)用規(guī)則和 參數(shù)類型參數(shù)類型 2 在數(shù)據(jù)區(qū)說明輸入輸出的表現(xiàn)形式在數(shù)據(jù)區(qū)說明輸入輸出的表現(xiàn)形式 3 設(shè)置一個外部變量設(shè)置一個外部變量 esi 確保循環(huán)五確保循環(huán)五 次 即可以依次輸入次 即可以依次輸入 5 個十六進制個十六進制 數(shù) 不斷使數(shù)據(jù)右移即除二 與數(shù) 不斷使數(shù)據(jù)右移即除二 與 1 做與運算 然后和做與運算 然后和 0 比較大小 若比較大小 若 與與 0 相等 則該數(shù)有一個相等 則該數(shù)有一個 0 用 用 edx 記錄記錄 0 的個數(shù) 的個數(shù) 4 把把 edx 入棧 然后清零入棧 然后清零 5 出棧 倒序輸出出棧 倒序輸出 檢測結(jié)果 驗證正確性檢測結(jié)果 驗證正確性 1 對第一個小實驗代碼進行編譯鏈接 如下圖所示 對第一個小實驗代碼進行編譯鏈接 如下圖所示 2 運行檢測結(jié)果 運行檢測結(jié)果 分別選擇確定 取消 檢測是否有正確的返回值 實驗測試如下 分別選擇確定 取消 檢測是否有正確的返回值 實驗測試如下 3 對第二個小實驗進行編譯鏈接對第二個小實驗進行編譯鏈接 4 對第二個小實驗進行檢測 看是否正確 測試結(jié)果如下 對第二個小實驗進行檢測 看是否正確 測試結(jié)果如下 結(jié)論結(jié)論 經(jīng)過上述測試 實驗結(jié)果與理論值相符 正確 經(jīng)過上述測試 實驗結(jié)果與理論值相符 正確 實驗四實驗四 實驗內(nèi)容實驗內(nèi)容 把數(shù)組中的 n 個雙字型元素按從大到小 從小到大 的順序 排列 增加一個交換標志 在排序完成時不再執(zhí)行多余的外層循環(huán) 熟悉 WINDBG 調(diào)試環(huán)境 使用 WINDBG 觀察內(nèi)存變量 并觀察結(jié)果 流程圖流程圖 實驗代碼 實驗代碼 386 model flat stdcall option casemap none ESIEBX EBX arr ESI 4 4 ESI ESI 1 EAX arr ESI 4 flag 1 arr ESI 4 4 EAX arr ESI 4 EBX 結(jié)束 flag 1 ESI 0 flag 0 開始 ECX n 1 flag fla1 ECX 0 Flag 1 includelib msvcrt lib printf PROTO C dword vararg scanf PROTO C dword vararg data input single num byte d 0 output single num byte d 0 output single num crlf byte d 0ah 0 numberOfElements dword number dword 128 dup code getInput proc local index temp numberOfEle dword invoke scanf offset input single num offset numberOfElements push ecx mov ecx numberOfElements mov numberOfEle ecx mov index 0 input push eax mov eax 4 mul index mov temp eax add temp offset number pop eax invoke scanf offset input single num temp mov ecx numberOfEle dec numberOfEle inc index loop input pop ecx ret getInput endp bubbleSort proc local flag byte pusha mov flag 0 Get the number of elements and save it at ecx mov ecx numberOfElements dec ecx loop out xor esi esi loop in mov eax number esi 4 mov ebx number esi 4 4 cmp eax ebx jg control mov flag 1 mov number esi 4 ebx mov number esi 4 4 eax control inc esi cmp esi ecx jb loop in test flag 1 jz endloop mov flag 0 loop loop out endloop popa ret bubbleSort endp output proc pusha mov ecx numberOfElements dec ecx dec ecx xor esi esi isover push ecx invoke printf offset output single num number esi 4 pop ecx cmp esi ecx inc esi jb isover invoke printf offset output single num crlf number esi 4 popa ret output endp start invoke getInput invoke bubbleSort invoke output ret end start Windbg 1 反匯編 使用 U 從起始地址 00401010 開始 列出 15 條語句 2 執(zhí)行斷點命令 G 3 單步執(zhí)行命令 t 如下圖表示用 t 執(zhí)行 3 條指令 4 進程執(zhí)行命令 p 如下圖所示用 P 命令執(zhí)行一條語句 5 顯示寄存命令 r 如下所示 r 命令之后緊跟 P 命令顯示寄存器內(nèi)容 6 用 alt 4 顯示寄存器內(nèi)容 出現(xiàn)如下圖所示的寄存器窗口 7 顯示寄存單元 D 命令 實驗結(jié)果測試 實驗結(jié)果測試 對實驗進行編譯鏈接 輸入數(shù)據(jù)進行測試輸入數(shù)據(jù)進行測試 實驗五實驗五 實驗內(nèi)容 實驗內(nèi)容 多模塊程序設(shè)計及多語言混合編程 要求 要求 編寫一個匯編語言遞歸子程序 子模塊 求斐波那契數(shù)列 斐 波納契數(shù)列以如下被以遞歸的方法定義 F 0 0 F 1 1 F n F n 1 F n 2 n 2 n N 輸入一個數(shù)字 若該數(shù)字在 數(shù)列中 則輸出 N 若不在數(shù)列中 輸出 error 編寫一個計算 Z sin 2n 1 F n 的匯編語言主模塊 其中 sin x 調(diào) 用 C 語言的函數(shù)庫 F n 通過調(diào)用 中的模塊實現(xiàn) 輸入 n 顯 示格式為 Z 使用調(diào)試程序觀察參數(shù)傳遞及堆棧平衡情況 實驗代碼實驗代碼 386 model flat stdcall option casemap none includelib msvcrt lib scanf PROTO C dword vararg printf PROTO C dword vararg data SzMsg byte d 0ah 0 Sz byte x 0 buf dword 2 Dup pj byte input error 0 F dword 1 T dword 1 counter dword 2 code start invoke scanf offset Sz offset buf cmp buf 1 jz L6 cmp buf 1 jnz L7 L6 invoke printf offset SzMsg buf jmp L L7 mov eax F push eax mov ebx T push ebx add eax ebx push eax inc counter mov edx ebx mov ebx eax mov eax edx cmp buf ebx jz L2 cmp buf ebx ja L3 L2 invoke printf offset SzMsg counter jmp L L3 invoke printf offset pj L ret end start 386 model flat stdcall Option casemap none includelib msvcrt lib printf PROTO C dword vararg scanf PROTO C dword vararg sin PROTO C dword vararg data n dword 0 f dword 50 dup 0 fmtout byte f n d 0ah 0 fmtfout byte z f 0ah 0 fmt byte d 0 siny qword 0 x qword 0 y qword 0 code start proc mov word ptr f 0 0 mov word ptr f 4 1 mov esi 0 mov ecx 30 L1 MOV eax f esi mov ebx f esi 4 add eax ebx mov f esi 8 eax add esi 4 loop L1 invoke scanf offset fmt addr n mov esi n invoke printf offset fmtout f esi 4 fild word ptr f esi 4 invoke sin esi fmul fstp x invoke printf offset fmtfout x RET start endp end start 實驗代碼分析說明 實驗代碼分析說明 1 將初始值 F 0 0 F 1 1 分別存儲在兩個不同的變量里 2 設(shè)置一個變量 count
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)園區(qū)的物流配送規(guī)劃優(yōu)化實踐分享
- 工業(yè)廢水處理技術(shù)與工藝研究
- 工業(yè)控制系統(tǒng)中智能傳感器的應用
- 工業(yè)管道安全檢查與維護管理
- 工作效率提升工具與軟件應用
- 工作報告的靈魂-優(yōu) 秀的打造
- 3d打印室管理制度
- 863財務管理制度
- 標準黨員教育管理制度
- 樹莓管護日常管理制度
- 學校五年發(fā)展規(guī)劃2026-2030年
- 2025年江西省中考學業(yè)水平考試考前預測數(shù)學試卷(含答案)
- 2025春季學期國開電大專科《管理學基礎(chǔ)》一平臺在線形考(形考任務一至四)試題及答案
- 馬克思主義基本原理試卷2(附答案)
- 2024小學體育教師進城考試模擬試卷及參考答案
- 瘢痕疙瘩術(shù)后護理
- 2024-2025學年部編版一年級下學期期末語文試卷(含答案)
- 惠然科技有限公司半導體量測設(shè)備總部項目環(huán)評資料環(huán)境影響
- 2024年吉林省高職高專單招考試英語卷試題真題(含答案)
- 感染性休克指南解讀
- 【MOOC】電工電子學-浙江大學 中國大學慕課MOOC答案
評論
0/150
提交評論