


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、匯編語言程序設(shè)計(jì)報(bào)告班級:學(xué)號(hào):姓名:.目錄匯編語言程序設(shè)計(jì)報(bào)告1匯編語言程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告4實(shí)驗(yàn)一4實(shí)驗(yàn)內(nèi)容4實(shí)驗(yàn)?zāi)康?實(shí)驗(yàn)代碼4實(shí)驗(yàn)代碼整體思路51.檢測所編程序的正確性5實(shí)驗(yàn)二71.實(shí)驗(yàn)內(nèi)容7結(jié)果測試:11Debug:11實(shí)驗(yàn)三13實(shí)驗(yàn)要求:13實(shí)驗(yàn)代碼:13實(shí)驗(yàn)代碼思路:15檢測結(jié)果,驗(yàn)證正確性15結(jié)論17實(shí)驗(yàn)四17實(shí)驗(yàn)內(nèi)容17流程圖18實(shí)驗(yàn)代碼:18Windbg21實(shí)驗(yàn)結(jié)果測試:23輸入數(shù)據(jù)進(jìn)行測試24實(shí)驗(yàn)五24實(shí)驗(yàn)內(nèi)容:多模塊程序設(shè)計(jì)及多語言混合編程。24;.要求:24實(shí)驗(yàn)代碼:24實(shí)驗(yàn)代碼分析說明:26實(shí)驗(yàn)數(shù)據(jù)檢測:判斷是否成功完成實(shí)驗(yàn)任務(wù)27實(shí)驗(yàn)心得28;.匯編語言程序設(shè)計(jì)實(shí)驗(yàn)報(bào)
2、告實(shí)驗(yàn)一實(shí)驗(yàn)內(nèi)容 :熟悉 DOS編程環(huán)境:編寫一個(gè)DOS環(huán)境的匯編語言程序,要求從鍵盤輸入一串字符,去除連續(xù)重復(fù)的字符后再顯示,如:輸入一串為“aaawwweerrty ”的字符串,輸出結(jié)果應(yīng)為awerty 實(shí)驗(yàn)?zāi)康?:通過上機(jī)實(shí)踐加深對16 位環(huán)境下編程的了解學(xué)會(huì)使用debuge 調(diào)試程序?qū)嶒?yàn)代碼 :ASSUMECS:CODE, DS:DATADATASEGMENTBUFFER DB60, ?, 60DUP(?)PRINTDB'TOINPUT: 'CRLFDB0DH, 0AH, '$'DATAENDSCODESEGMENTMAIN:MOVAX, DATAMOV
3、DS, AXMOVAH, 9LEADX, PRINTINT21HMOVAH, 0AHLEADX, BUFFERINT21HMOVAH, 9LEADX, CRLFINT21H;.LEASI, BUFFER + 1LP1:INCSILP2:MOVAL, SICMPAL, 13JZDISPCMPAL, SI + 1JNZLP1MOVDI, SILP3:INCDIMOVAL, DI + 1MOVDI, ALCMPAL, 13JZLP2JMPLP3DISP:MOVAL, '$'MOVSI, ALMOVAH, 9LEADX, BUFFER + 2INT21HEXIT:MOVAX, 4C00
4、HINT21HCODEENDSENDMAIN實(shí)驗(yàn)代碼整體思路:定義一個(gè)大小為60 的緩沖區(qū),用來存儲(chǔ)從鍵盤輸入的字符串;調(diào)用中斷調(diào)用,將字符串輸入到緩沖區(qū)當(dāng)中;使用取地址符號(hào)Lea 取得輸入字符串的首地址然后后一位與前一位相比, 若相同則將其舍棄, 否者將其記錄在緩沖區(qū)中, 循環(huán)結(jié)束之后在其后補(bǔ)上字符“ $”即可一次輸出,無單個(gè)輸出1. 檢測所編程序的正確性 :編譯所建的1.asm 文件:;.按下回車鍵之后開始編譯,如下圖所示,編譯結(jié)束表明沒有錯(cuò)誤不存在警告對編譯成功之后的文件進(jìn)行鏈接,以生成能運(yùn)行的.exe 文件,如下圖1-1 所示:1-1鏈接之后發(fā)現(xiàn)鏈接(Link)之后也是成功的,接下來就
5、進(jìn)行測試的最后一步,即運(yùn)行1.exe 文件,輸入一串字符串,看能否達(dá)到預(yù)期的目的,如達(dá)到,則成功,否者重新編譯??梢?,與預(yù)期目的一致,達(dá)到了目的。6.該實(shí)驗(yàn)使用的知識(shí)點(diǎn):1.中斷調(diào)用,以及使用功能號(hào)實(shí)現(xiàn)輸入輸出2.使用循環(huán),無條件轉(zhuǎn)移指令(JMP)等;.實(shí)驗(yàn)二1. 實(shí)驗(yàn)內(nèi)容 :(1). 程序中自定義緩沖區(qū) AREA1,其中存放 200 個(gè)有序的無符號(hào)字型數(shù)據(jù)(至少有 3 個(gè)重復(fù)數(shù)據(jù)),編程序?qū)⑵渑判蚝笏偷阶?AREA2開始的單元中,要求傳送后的數(shù)據(jù)從大到小排序,并實(shí)現(xiàn)查找功能,判定需要查找的數(shù)據(jù)在 AREA1與 AREA2中分別對應(yīng)的位置,并通過查看內(nèi)存驗(yàn)證結(jié)果的正確性。把有序的無符號(hào)字型數(shù)據(jù)
6、換成帶符號(hào)字型數(shù)據(jù),實(shí)現(xiàn)以上功能。(2). 熟悉 DEBUG 調(diào)試環(huán)境。使用 DEBUG 調(diào)試程序察看機(jī)器碼,并單步執(zhí)行,觀察每一條指令的執(zhí)行結(jié)果、 寄存器的內(nèi)容、 內(nèi)存變量和堆棧數(shù)據(jù)的變化情況。2. 實(shí)驗(yàn)代碼 如下:assume ds:data, cs:code, ss:stackdata segmentarea1 dw 2,2,2,10,15,255,0,67,143count dw $-area1index dw 0area2 dw 200 dup(0)flag db 200 dup(0)tips1 db 'Please input the number you want to
7、find:','$'tips2 db 'Not Found!','$'crlf db 0dh,0ah,'$'output db 5 dup('$')data endsstack segment stackdw 32 dup(?)stack endscode segmentfindmost proc ;find the greatest number in area1, put it in AX push bxpush cxpush dxpush bplea bx,area1mov dx,bx;.add bx
8、,2lo:cmp dx,bxjge smaller;jae smaller ;無符號(hào)時(shí)使用此指令,并將上條指令注釋掉and flagbx,1jnz smallermov dx,bx ;將當(dāng)前最大值儲(chǔ)存mov bp,bxsmaller:add bx,2cmp bx,count ;檢查是否為最后一個(gè)元素;記錄最大值于axjl notfinishmov ax,dxmov WORD PTR ds:flagbp,1pop bppop dxpop cxpop bxretnotfinish:jmp lofindmost endpwriteGreatest2area2 proc ;按照要求將數(shù)據(jù)寫入area2
9、push axpush bxlea bx,area2find_another:call findmostmov bx,axadd bx,2mov index,bxlea ax,area2sub index,axlea ax,countcmp index,ax;.jnz find_anotherpop bxpop axretwriteGreatest2area2 endpconvertDigital2Ascii procpush bxpush dxmov dx,axxor bx,bxmov cl,100div cladd ax,48mov outputbx,alinc bxmov ax,dxmo
10、v cl,10div cladd ah,48add al,48mov outputbx,alinc bxmov outputbx,ahlea dx,outputmov ah,9int 21hlea dx,crlfint 21hmov ax,dxpop dxpop bxretconvertDigital2Ascii endp;.findTheValue proc ;在兩個(gè)區(qū)域中分別查找數(shù)字ax 的位置push axpush bxpush sipush cxpush dxmov cx,countmov bx,-2equal1:add bx,2cmp ax,area1bxjnz equal1push
11、 axmov ax,bxsar ax,1inc axcall convertDigital2Asciipop axmov bx,-2equal2:add bx,2cmp ax,area2bxjnz equal2push axmov ax,bxsar ax,1inc axcall convertDigital2Asciipop axpop dxpop cxpop sipop bxpop axretfindTheValue endp;.start:mov ax,datamov ds,axcall writeGreatest2area2mov ax,255call findTheValuemov a
12、x,4c00hint 21hcode endsend start結(jié)果測試:對實(shí)驗(yàn)二進(jìn)行編譯鏈接:運(yùn)行程序,輸出實(shí)驗(yàn)結(jié)果:Debug:顯示寄存器內(nèi)容,如下圖所示:;.用 U 命令反匯編可執(zhí)行代碼,如下圖所示:用 g 命令設(shè)置斷點(diǎn)到CS:00D8處 ,如下圖所示:用 t 命令跟蹤執(zhí)行程序,如下圖所示逐條跟蹤三次的結(jié)果:用 q 命令退出:;.實(shí)驗(yàn)三實(shí)驗(yàn)要求:熟悉 Windows 編程環(huán)境 編寫一個(gè) Windows 界面匯編程序,顯示一個(gè)帶Yes,No 選擇按鈕的消息框,標(biāo)題顯示為:自己的姓名;正文內(nèi)容顯示為:學(xué)號(hào);選擇Yes的返回:“你選擇的是 Yes”,選擇 No 的返回:“你選擇的是 No”。(
13、 2)(編寫一個(gè) Windows 32 位控制臺(tái)程序,要求從鍵盤輸入5 個(gè)十六進(jìn)制數(shù),輸出該數(shù)所對應(yīng)的二進(jìn)制數(shù)中所包含“0”的個(gè)數(shù)。)( 3)熟悉 WINDBG 調(diào)試環(huán)境。使用 WINDBG 調(diào)試程序察看機(jī)器碼,并單步執(zhí)行,觀察每一條指令的執(zhí)行結(jié)果、 寄存器的內(nèi)容、內(nèi)存變量和堆棧數(shù)據(jù)的變化情況。實(shí)驗(yàn)代碼:.386.386.model flat,stdcall.model flat,stdcalloption casemap:noneincludelib msvcrt.libMessageBoxAprintf PROTO C:dword,:vararg;.PROTO :dword, :dword
14、, :dword, :dwordscanf PROTO C:dword,:varargMessageBox equ <MessageBoxA>.dataIncludelib user32.libszmsg byte '%d',0ah,0Includelib msvcrt.libmsg byte '%d',0NULL equ 0szformat byte '%x',0MB_OK equ 1buf dword 40 dup(?).stack 4096l0 dword ?.datal1 dword ?SzTile byte '陳強(qiáng)
15、!',0l2 dword ?SzMsg byte '1120131888!',0l3 dword ?NO1 byte '我選的是確定 !',0ah,0l4 dword ?NO2 byte '我選的是取消 !',0ah,0.code.codestart:start:mov esi,0invoke MessageBox,L:invokescanf,offsetNULL,szformat,offset bufoffset SzMsg,mov eax,bufoffset SzTile,mov ecx,4MB_OKmov edx,0cmp eax,
16、1t:mov ebx,eaxjz Aand ebx,1cmp eax,1cmp ebx,0jnz Bjz yzA: invoke MessageBox,cmp ebx,0NULL,jnz tyoffset NO1,yz: inc edxoffset SzTile,ty:shr eax,1MB_OKloop tretpush edxB: invoke MessageBox,INC ESINULL,cmp esi,5offset NO2,jb Loffset SzTile,pop l4MB_OKpop l3retpop l2retpop l1end startpop l0invoke printf
17、,offset szmsg,l0invoke printf,offset szmsg,l1invoke printf,offset szmsg,l2invoke printf,offset szmsg,l3invoke printf,offset msg,l4retend start;.實(shí)驗(yàn)代碼思路 :第一小題代碼思路:第二小題代碼分析:1. 說明 MessageboxA 的調(diào)用規(guī)則和 1. 說明 scanf 和 printf 的調(diào)用規(guī)則和參數(shù)類型參數(shù)類型2. 將定義的 MessageBoxA 通過指令 2. 在數(shù)據(jù)區(qū)說明輸入輸出的表現(xiàn)形式equ 賦給 MessageBox3.設(shè)置一個(gè)外部變量
18、esi 確保循環(huán)五3.使用偽指令,首次輸出顯示次,即可以依次輸入5 個(gè)十六進(jìn)制invoke一個(gè)帶 Yes, No 選擇按鈕的消息框,數(shù);不斷使數(shù)據(jù)右移即除二,與 1標(biāo)題顯示為:自己的姓名;正文內(nèi)容做與運(yùn)算,然后和 0 比較大小,若顯示為:學(xué)號(hào)的返回值與與 0 相等,則該數(shù)有一個(gè) 0,用 edx4.通過比較記錄 0 的個(gè)數(shù)。MessageBox1 的大小確定其選擇的 yes還是 no4.把 edx 入棧,然后清零5. 再 次 使 用 偽 指 令 INVOKE 調(diào) 用 5. 出棧,倒序輸出MessageBox二次輸出選擇Yes 的返回:“你選擇的是 Yes”,選擇 No 的返回:“你選擇的是 No
19、”。檢測結(jié)果,驗(yàn)證正確性( 1) 對第一個(gè)小實(shí)驗(yàn)代碼進(jìn)行編譯鏈接,如下圖所示:( 2) 運(yùn)行檢測結(jié)果:;.分別選擇確定,取消,檢測是否有正確的返回值,實(shí)驗(yàn)測試如下:( 3) 對第二個(gè)小實(shí)驗(yàn)進(jìn)行編譯鏈接( 4) 對第二個(gè)小實(shí)驗(yàn)進(jìn)行檢測,看是否正確,測試結(jié)果如下:;.結(jié)論 :經(jīng)過上述測試,實(shí)驗(yàn)結(jié)果與理論值相符,正確實(shí)驗(yàn)四實(shí)驗(yàn)內(nèi)容 :把數(shù)組中的 n 個(gè)雙字型元素按從大到小 (從小到大)的順序排列。增加一個(gè)交換標(biāo)志,在排序完成時(shí)不再執(zhí)行多余的外層循環(huán)。熟悉 WINDBG調(diào)試環(huán)境。使用WINDBG觀察內(nèi)存變量,并觀察結(jié)果。;.流程圖開始EAX =arrESI*4EBX =arrESI*4+4ECX =
20、n-1EAX>EBX?flag fla1Flag=1arrESI*4=EBXECX>0?arrESI*4+4=EAXflag= 1flag=1?ESI=ESI+1flag= 0ESI<ECX?ESI= 0ECX =ECX-1結(jié)束實(shí)驗(yàn)代碼:.386.model flat,stdcalloption casemap:none;.includelib msvcrt.libprintfPROTO C:dword,:varargscanfPROTO C:dword,:vararg.datainput_single_num byte '%d',0output_single
21、_num byte '%d ',0output_single_num_crlf byte '%d',0ah,0numberOfElements dword ?number dword 128 dup(?).codegetInput proclocal index, temp, numberOfEle:dwordinvoke scanf,offset input_single_num, offset numberOfElements push ecxmov ecx,numberOfElementsmov numberOfEle,ecxmov index,0inpu
22、t:push eaxmov eax,4mul indexmov temp,eaxadd temp,offset numberpop eaxinvoke scanf, offset input_single_num, tempmov ecx,numberOfEledec numberOfEleinc indexloop inputpop ecxretgetInput endpbubbleSort proclocal flag:bytepushamov flag,0;Get the number of elements, and save it at ecxmov ecx,numberOfElem
23、entsdec ecx;.loop_out:xor esi,esiloop_in:mov eax,numberesi*4mov ebx,numberesi*4+4cmp eax,ebxjgcontrolmov flag,1mov numberesi*4,ebxmov numberesi*4+4,eaxcontrol:inc esicmp esi,ecxjb loop_intest flag,1jz endloopmov flag,0loop loop_outendloop:poparetbubbleSort endpoutput procpushamov ecx,numberOfElement
24、sdec ecxdec ecxxor esi,esiisover:push ecxinvoke printf, offset output_single_num, numberesi*4pop ecxcmp esi,ecxinc esijb isoverinvoke printf, offset output_single_num_crlf, numberesi*4poparetoutput endpstart:;.invoke getInputinvoke bubbleSortinvoke outputretend startWindbg1. 反匯編:使用 U 從起始地址 00401010
25、開始,列出 15 條語句2. 執(zhí)行斷點(diǎn)命令 G3.單步執(zhí)行命令t, 如下圖表示用t 執(zhí)行 3 條指令;.4.進(jìn)程執(zhí)行命令p,如下圖所示用P 命令執(zhí)行一條語句5.顯示寄存命令r,如下所示r 命令之后緊跟P 命令顯示寄存器內(nèi)容6.用 alt+4 顯示寄存器內(nèi)容,出現(xiàn)如下圖所示的寄存器窗口;.7.顯示寄存單元D 命令實(shí)驗(yàn)結(jié)果測試:對實(shí)驗(yàn)進(jìn)行編譯鏈接:;.輸入數(shù)據(jù)進(jìn)行測試:實(shí)驗(yàn)五實(shí)驗(yàn)內(nèi)容: 多模塊程序設(shè)計(jì)及多語言混合編程。要求:編寫一個(gè)匯編語言遞歸子程序 (子模塊) 求斐波那契數(shù)列, 斐波納契數(shù)列以如下被以遞歸的方法定義:F(0)=0,F(xiàn)(1)=1,F(xiàn)(n)=F(n-1)+F(n-2)(n>=2
26、,nN* );(輸入一個(gè)數(shù)字,若該數(shù)字在數(shù)列中,則輸出 N,若不在數(shù)列中,輸出“ error ”)編寫一個(gè)計(jì)算 Z=sin(2n+1)*F(n)的匯編語言主模塊,其中sin(x)調(diào)用 C 語言的函數(shù)庫、 F(n)通過調(diào)用中的模塊實(shí)現(xiàn),輸入 n。顯示格式為:Z=使用調(diào)試程序觀察參數(shù)傳遞及堆棧平衡情況。實(shí)驗(yàn)代碼 :.386.model flat,stdcalloption casemap:noneincludelib msvcrt.libscanf PROTO C:dword,:varargprintf PROTO C:dword, :vararg.data;.SzMsg byte '%d
27、',0ah,0Sz byte '%x',0buf dword2 Dup(?)pjbyte 'input error!',0F dword 1 T dword 1 counter dword 2.codestart:invoke scanf,offset Sz,offset bufcmp buf,1jz L6cmp buf,1jnz L7L6:invoke printf,offset SzMsg,bufjmp LL7: mov eax,Fpush eaxmov ebx,Tpush ebxadd eax,ebxpush eaxinc countermov e
28、dx,ebxmov ebx,eaxmov eax,edxcmp buf,ebxjz L2cmp buf,ebxja L3L2: invoke printf,offset SzMsg,counterjmp LL3: invoke printf,offset pjL:retend start.386.model flat,stdcallOption casemap:noneincludelibmsvcrt.libprintfPROTO C :dword,:varargscanfPROTO C :dword,:varargsin PROTO C:dword,:vararg.data;.n dword
29、 0fdword 50 dup(0)fmtout byte 'f(n) = %d',0ah,0fmtfout byte 'z = %f',0ah,0fmt byte '%d',0siny qword 0x qword 0y qword 0.codestart procmov word ptr f0,0mov word ptr f4,1mov esi,0mov ecx,30L1:MOV eax,fesimov ebx,fesi+4add eax,ebxmov fesi+8,eaxadd esi,4loop L1invoke scanf,offset fmt,addr nmov esi,ninvoke printf,offset fmtout,fesi*4fild word ptr fesi*4invoke sin,esifmulfstp xinvoke printf,offset fmtfout,xRETstart endpendstart實(shí)驗(yàn)代碼分析說明:1. 將初始值 F(0)=0, F(1)=1,分別存儲(chǔ)在兩個(gè)不同的變量里;.2. 設(shè)置一個(gè)變量 counter 用來記錄 N 的大小,初始值為 13. 從鍵盤輸入一個(gè)數(shù)字判斷其值與 1 的大小,若等于 1 直接輸出 counter,否者執(zhí)行第四步4. 通過疊加,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 豬肉收儲(chǔ)知識(shí)培訓(xùn)課件
- 人教版(2024)七年級英語下冊Unit 7 學(xué)情調(diào)研測試卷(含答案)
- 鋼結(jié)構(gòu)切割施工方案
- 2025年中考物理二輪復(fù)習(xí):電磁學(xué)實(shí)驗(yàn)題 能力提升練習(xí)題(含答案)
- 合同范本融資租賃合同
- 課題2 原子結(jié)構(gòu)(第2課時(shí))(教學(xué)設(shè)計(jì))九年級化學(xué)上冊同步高效課堂(人教版2024)
- 如何評估品牌傳播的效果與影響計(jì)劃
- 提升產(chǎn)品質(zhì)量的改進(jìn)措施計(jì)劃
- 學(xué)期目標(biāo)與教學(xué)任務(wù)分解計(jì)劃
- 實(shí)施素質(zhì)教育的年度工作要點(diǎn)計(jì)劃
- 第一章控制系統(tǒng)的基本概念
- 庫車縣“7.9”天山煉化油儲(chǔ)罐火災(zāi)撲救戰(zhàn)評
- 金屬結(jié)構(gòu)制造安全作業(yè)指導(dǎo)書
- 眼外傷-PPT課件
- 教學(xué)-主動(dòng)脈夾層PPT課件
- 絕句遲日江山麗
- 船體開孔規(guī)則
- (精選)沸騰焙燒爐設(shè)計(jì)相關(guān)計(jì)算
- 多元化與專業(yè)化的利弊之爭
- ASMEB16.14-1991中文版鋼鐵管螺紋管堵、內(nèi)外螺絲和鎖緊螺母
- 《雕塑工程工程量清單計(jì)價(jià)定額》
評論
0/150
提交評論