匯編語言程序設計實驗報告.doc_第1頁
匯編語言程序設計實驗報告.doc_第2頁
匯編語言程序設計實驗報告.doc_第3頁
匯編語言程序設計實驗報告.doc_第4頁
匯編語言程序設計實驗報告.doc_第5頁
已閱讀5頁,還剩23頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

匯編語言程序設計報告匯編語言程序設計報告 班級 班級 學號 學號 姓名 姓名 目錄目錄 匯編語言程序設計報告 1 匯編語言程序設計實驗報告 4 實驗一 4 實驗內容 4 實驗目的 4 實驗代碼 4 實驗代碼整體思路 5 1 檢測所編程序的正確性 5 實驗二 7 1 實驗內容 7 結果測試 11 Debug 11 實驗三 13 實驗要求 13 實驗代碼 13 實驗代碼思路 15 檢測結果 驗證正確性 15 結論 17 實驗四 17 實驗內容 17 流程圖 18 實驗代碼 18 Windbg 21 實驗結果測試 23 輸入數據進行測試 24 實驗五 24 實驗內容 多模塊程序設計及多語言混合編程 24 要求 24 實驗代碼 24 實驗代碼分析說明 26 實驗數據檢測 判斷是否成功完成實驗任務 27 實驗心得 28 匯編語言程序設計實驗報告匯編語言程序設計實驗報告 實驗一實驗一 實驗內容實驗內容 熟悉 DOS 編程環境 編寫一個 DOS 環境的匯編語言程序 要求 從鍵盤 輸入一串字符 去除連續重復的字符后再顯示 如 輸入一串為 aaawwweerrty 的字符 串 輸出結果應為 awerty 實驗目的實驗目的 通過上機實踐加深對 16 位環境下編程的了解 學會使用 debuge 調試程序 實驗代碼實驗代碼 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 的緩沖區 用來存儲從鍵盤輸入的字 符串 調用中斷調用 將字符串輸入到緩沖區當中 使用取地址符號 Lea 取得輸入字符串的首地址然后后一位與前一 位相比 若相同則將其舍棄 否者將其記錄在緩沖區中 循環結 束之后在其后補上字符 即可一次輸出 無單個輸出 1 檢測所編程序的正確性檢測所編程序的正確性 編譯所建的編譯所建的 1 asm 文件 文件 按下回車鍵之后開始編譯 如下圖所示 編譯結束表明沒有錯誤不存在警告按下回車鍵之后開始編譯 如下圖所示 編譯結束表明沒有錯誤不存在警告 對編譯成功之后的文件進行鏈接 以生成能運行的對編譯成功之后的文件進行鏈接 以生成能運行的 exe 文件 如下圖文件 如下圖 1 1 所示 所示 1 1 鏈接之后發現鏈接 鏈接之后發現鏈接 Link 之后也是成功的 接下來就進行測試的最后一步 即運行 之后也是成功的 接下來就進行測試的最后一步 即運行 1 exe 文件 輸入一串字符串 看能否達到預期的目的 如達到 則成功 否者重新編文件 輸入一串字符串 看能否達到預期的目的 如達到 則成功 否者重新編 譯 譯 可見 與預期目的一致 達到了目的 可見 與預期目的一致 達到了目的 6 該實驗使用的知識點該實驗使用的知識點 1 中斷調用 以及使用功能號實現輸入輸出中斷調用 以及使用功能號實現輸入輸出 2 使用循環 無條件轉移指令 使用循環 無條件轉移指令 JMP 等 等 實驗二實驗二 1 實驗內容實驗內容 1 程序中自定義緩沖區 AREA1 其中存放 200 個有序的無符號字型 數據 至少有 3 個重復數據 編程序將其排序后送到自 AREA2 開始的 單元中 要求傳送后的數據從大到小排序 并實現查找功能 判定需要 查找的數據在 AREA1 與 AREA2 中分別對應的位置 并通過查看內存驗 證結果的正確性 把有序的無符號字型數據換成帶符號字型數據 實現 以上功能 2 熟悉 DEBUG 調試環境 使用 DEBUG 調試程序察看機器碼 并單 步執行 觀察每一條指令的執行結果 寄存器的內容 內存變量和堆 棧數據的變化情況 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 按照要求將數據寫入按照要求將數據寫入 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 在兩個區域中分別查找數字在兩個區域中分別查找數字 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 結果測試 結果測試 對實驗二進行編譯鏈接 運行程序 輸出實驗結果 Debug 顯示寄存器內容 如下圖所示 用 U 命令反匯編可執行代碼 如下圖所示 用 g 命令設置斷點到 CS 00D8 處 如下圖所示 用 t 命令跟蹤執行程序 如下圖所示逐條跟蹤三次的結果 用 q 命令退出 實驗三實驗三 實驗要求 實驗要求 熟悉 Windows 編程環境 編寫一個 Windows 界面匯編程序 顯示一個帶 Yes No 選擇按鈕的 消息框 標題顯示為 自己的姓名 正文內容顯示為 學號 選擇 Yes 的 返回 你選擇的是 Yes 選擇 No 的返回 你選擇的是 No 2 編寫一個 Windows 32 位控制臺程序 要求從鍵盤輸入 5 個十六 進制數 輸出該數所對應的二進制數中所包含 0 的個數 3 熟悉 WINDBG 調試環境 使用 WINDBG 調試程序察看機器碼 并單步執行 觀察每一條指令的執行結果 寄存器的內容 內存變量和堆 棧數據的變化情況 實驗代碼 實驗代碼 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 的調用規則和的調用規則和 參數類型參數類型 2 將定義的將定義的 MessageBoxA 通過指令通過指令 equ 賦給賦給 MessageBox 3 使用偽指令使用偽指令 invoke 首次輸出 首次輸出顯顯 示一個帶示一個帶 Yes No 選擇按鈕的消息選擇按鈕的消息 框 標題顯示為 自己的姓名 正框 標題顯示為 自己的姓名 正 文內容顯示為 學號文內容顯示為 學號 4 通過比較通過比較 MessageBox 的返回值與的返回值與 1 的大小確定其選擇的的大小確定其選擇的 yes 還是還是 no 5 再次使用偽指令再次使用偽指令 INVOKE 調用調用 MessageBox 二次輸出選擇二次輸出選擇 Yes 的返的返 回 回 你選擇的是你選擇的是 Yes 選擇 選擇 No 的的 返回 返回 你選擇的是你選擇的是 No 第二小題代碼分析 第二小題代碼分析 1 說明說明 scanf 和和 printf 的調用規則和的調用規則和 參數類型參數類型 2 在數據區說明輸入輸出的表現形式在數據區說明輸入輸出的表現形式 3 設置一個外部變量設置一個外部變量 esi 確保循環五確保循環五 次 即可以依次輸入次 即可以依次輸入 5 個十六進制個十六進制 數 不斷使數據右移即除二 與數 不斷使數據右移即除二 與 1 做與運算 然后和做與運算 然后和 0 比較大小 若比較大小 若 與與 0 相等 則該數有一個相等 則該數有一個 0 用 用 edx 記錄記錄 0 的個數 的個數 4 把把 edx 入棧 然后清零入棧 然后清零 5 出棧 倒序輸出出棧 倒序輸出 檢測結果 驗證正確性檢測結果 驗證正確性 1 對第一個小實驗代碼進行編譯鏈接 如下圖所示 對第一個小實驗代碼進行編譯鏈接 如下圖所示 2 運行檢測結果 運行檢測結果 分別選擇確定 取消 檢測是否有正確的返回值 實驗測試如下 分別選擇確定 取消 檢測是否有正確的返回值 實驗測試如下 3 對第二個小實驗進行編譯鏈接對第二個小實驗進行編譯鏈接 4 對第二個小實驗進行檢測 看是否正確 測試結果如下 對第二個小實驗進行檢測 看是否正確 測試結果如下 結論結論 經過上述測試 實驗結果與理論值相符 正確 經過上述測試 實驗結果與理論值相符 正確 實驗四實驗四 實驗內容實驗內容 把數組中的 n 個雙字型元素按從大到小 從小到大 的順序 排列 增加一個交換標志 在排序完成時不再執行多余的外層循環 熟悉 WINDBG 調試環境 使用 WINDBG 觀察內存變量 并觀察結果 流程圖流程圖 實驗代碼 實驗代碼 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 結束 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 執行斷點命令 G 3 單步執行命令 t 如下圖表示用 t 執行 3 條指令 4 進程執行命令 p 如下圖所示用 P 命令執行一條語句 5 顯示寄存命令 r 如下所示 r 命令之后緊跟 P 命令顯示寄存器內容 6 用 alt 4 顯示寄存器內容 出現如下圖所示的寄存器窗口 7 顯示寄存單元 D 命令 實驗結果測試 實驗結果測試 對實驗進行編譯鏈接 輸入數據進行測試輸入數據進行測試 實驗五實驗五 實驗內容 實驗內容 多模塊程序設計及多語言混合編程 要求 要求 編寫一個匯編語言遞歸子程序 子模塊 求斐波那契數列 斐 波納契數列以如下被以遞歸的方法定義 F 0 0 F 1 1 F n F n 1 F n 2 n 2 n N 輸入一個數字 若該數字在 數列中 則輸出 N 若不在數列中 輸出 error 編寫一個計算 Z sin 2n 1 F n 的匯編語言主模塊 其中 sin x 調 用 C 語言的函數庫 F n 通過調用 中的模塊實現 輸入 n 顯 示格式為 Z 使用調試程序觀察參數傳遞及堆棧平衡情況 實驗代碼實驗代碼 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 設置一個變量 count

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論