




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、80x86匯編語言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)書中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院2008年3月44目 錄實(shí)驗(yàn)一 實(shí)驗(yàn)的基本要求與方法1實(shí)驗(yàn)二 順序程序設(shè)計(jì)13實(shí)驗(yàn)三 分支程序設(shè)計(jì)18實(shí)驗(yàn)四 循環(huán)程序設(shè)計(jì)24實(shí)驗(yàn)五 子程序設(shè)計(jì)31實(shí)驗(yàn)六 串操作指令的使用36實(shí)驗(yàn)七 位運(yùn)算指令的使用41附錄a masm 6.x45附錄b windbg的使用46附錄c i/o宏說明49附錄d 匯編指令總匯65附錄e 流程圖規(guī)范82實(shí)驗(yàn)一 實(shí)驗(yàn)的基本要求與方法1.1 實(shí)驗(yàn)?zāi)康呐c要求1.1.1 實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)是掌握匯編語言程序設(shè)計(jì)的步驟,學(xué)習(xí)使80x86匯編語言程序設(shè)計(jì)的基本方法和技能,熟練掌握用匯編語言設(shè)計(jì)、編碼、調(diào)試和運(yùn)行程序的方法,
2、養(yǎng)成良好的程序設(shè)計(jì)習(xí)慣,為后續(xù)課程和將來相關(guān)的項(xiàng)目開發(fā)打下堅(jiān)實(shí)的基礎(chǔ)。1. 熟練操作宏匯編的開發(fā)環(huán)境,熟悉匯編語言的編譯工具(masm6.11)及調(diào)試器(windbg)的使用。2. 掌握匯編語言的尋址方式和常用指令。3. 掌握匯編語言基本的程序設(shè)計(jì)方法和調(diào)試手段。4. 掌握子程序和宏指令的設(shè)計(jì)和調(diào)試手段。1.1.2 實(shí)驗(yàn)要求1. 上機(jī)前應(yīng)做好充分的準(zhǔn)備。對選定的實(shí)驗(yàn)題要先進(jìn)行設(shè)計(jì)包括程序框圖、數(shù)據(jù)結(jié)構(gòu)以及算法;上機(jī)之前先編好程序代碼,并進(jìn)行認(rèn)真地靜態(tài)檢查,減少錯(cuò)誤的發(fā)生,同時(shí)還有預(yù)先估計(jì)程序運(yùn)行的結(jié)果或結(jié)果范圍,做到心中有數(shù)。2. 上機(jī)時(shí)要遵守實(shí)驗(yàn)室的規(guī)章制度,愛護(hù)實(shí)驗(yàn)設(shè)備。要熟悉與實(shí)驗(yàn)有關(guān)的
3、系統(tǒng)軟件(如編輯程序、匯編程序、連接程序和調(diào)試程序等)的使用方法。在程序的調(diào)試過程中,有意識的學(xué)習(xí)及掌握windbg程序的各種功能,以便掌握程序的調(diào)試方法和技巧。不互相抄襲,應(yīng)自己動手按自己的算法編制程序,調(diào)試通過。3. 下機(jī)后要對實(shí)驗(yàn)結(jié)果進(jìn)行整理,分析程序調(diào)試過程中所出現(xiàn)的各種情況,對未通過的程序更好認(rèn)真分析原因,總結(jié)經(jīng)驗(yàn)教訓(xùn)。4. 每個(gè)程序完成后應(yīng)寫出實(shí)驗(yàn)報(bào)告,實(shí)驗(yàn)報(bào)告的要求如下:(1) 本次實(shí)驗(yàn)的目的及要求,實(shí)驗(yàn)內(nèi)容。(2) 設(shè)計(jì)說明:用來說明程序的功能和結(jié)構(gòu),它包括:程序名、功能、原理及算法說明、數(shù)據(jù)結(jié)構(gòu)及主要符號名說明等。(3) 程序框圖: 根據(jù)設(shè)計(jì)思想給出規(guī)范的程序流程圖,流程圖規(guī)
4、范參看附錄e。(4) 調(diào)試說明:總結(jié)經(jīng)驗(yàn)提高編程及調(diào)試能力。它包括:調(diào)試情況,如上機(jī)時(shí)遇到的問題及解決的辦法,觀察到的現(xiàn)象及其分析,對程序設(shè)計(jì)技巧的總結(jié)及分析等;程序的輸出結(jié)果及對結(jié)果的分析;實(shí)驗(yàn)的心得體會等。(5) 使用說明:程序提供給用戶使用時(shí)必須作出的說明。如:程序的使方法,調(diào)用方式,操作步驟等;要求輸入信息的類型及格式;出錯(cuò)信息的含義及程序的使用范圍等。(6) 程序清單。1.2 實(shí)驗(yàn)方法例1.1 求兩數(shù)之和。試編寫一程序,輸出提示信息,從鍵盤輸入兩個(gè)數(shù)number1和number2,求它們的之和并顯示結(jié)果。1 進(jìn)入windows下的dos命令行環(huán)境鼠標(biāo)點(diǎn)擊windows系統(tǒng)的“開始”&
5、gt;“運(yùn)行”,輸入“cmd”回車后(如圖1.1),進(jìn)入windows下的dos命令行環(huán)境(圖1.2)。圖1.1圖1.2 dos命令行環(huán)境這里設(shè)定所需軟件都安裝在c盤的masm目錄下。使用dos的cd命令進(jìn)入masm目錄(圖1.3)。 輸入: cd c:masm (回車)圖1.3 進(jìn)入?yún)R編程序目錄2 調(diào)用文本編輯程序edit建立匯編源文件(后綴名為.asm)在當(dāng)前目錄,輸入:edit example.asm后就可進(jìn)入編輯環(huán)境(圖1.4)。圖1.4 edit編輯環(huán)境也可以用其他編輯程序如記事本等來建立源程序(建議不要用office word)。建議以example.asm為文件名的源文件如圖1.
6、5。;*; example assembly language program - adds two numbers; author: r. detmer; date: revised 7/97;-.386.model flat;-exitprocess proto near32 stdcall, dwexitcode:dword;-include io.h ; header file for input/output;-cr equ 0dh ; carriage return characterlf equ 0ah ; line feed;-.stack 4096 ; reserve 409
7、6-byte stack;-.data ; reserve storage for datanumber1 dword ?number2 dword ?prompt1 byte "enter first number: ", 0 prompt2 byte "enter second number: ", 0 string byte 40 dup (?)label1 byte cr, lf, "the sum is " sum byte 11 dup (?) byte cr, lf, 0;-.code ; start of main p
8、rogram code_start: output prompt1 ; prompt for first number input string, 40 ; read ascii characters atod string ; convert to integer mov number1, eax ; store in memory output prompt2 ; repeat for second number input string, 40 atod string mov number2, eax mov eax, number1 ; first number to eax add
9、eax, number2 ; add second number dtoa sum, eax ; convert to ascii characters output label1 ; output label and sum invoke exitprocess, 0 ; exit with return code 0public _start ; make entry point public;-end ; end of source code;*圖1.5 例1.1的源文件example.asm3 用匯編程序ml對源文件匯編產(chǎn)生目標(biāo)文件(后綴名為.obj)輸入: ml /c /coff /
10、zi example.asm顯示如圖1.6,則表示匯編成功,同時(shí)生成了目標(biāo)文件(example.obj)。如果匯編指示出錯(cuò)則需重新調(diào)用編輯程序修改錯(cuò)誤,直至匯編通過為止。圖1.64 用連接程序link產(chǎn)生可執(zhí)行文件(后綴名為.exe)輸入: link /debug /subsystem:console /entry:start /out:example.exe example.obj io.obj kernel32.lib顯示如圖1.7,則表示連接成功,同時(shí)生成了可執(zhí)行文件(example.exe)圖1.75 執(zhí)行程序可直接在當(dāng)前目錄下執(zhí)行如下:輸入: example顯示結(jié)果如圖1.8。圖1.
11、8 example.exe運(yùn)行結(jié)果6 查看列表文件(后綴名為.lst)在進(jìn)行匯編時(shí)候,如果在輸入?yún)?shù)中加上“/fl”,則可生成和列表文件(example.lst)。輸入: ml /c /coff /zi /fl example.asm用編輯軟件打開example.lst(圖1.9)。microsoft (r) macro assembler version 6.11 08/03/05 15:19:43example.asm page 1 - 1; example assembly language program - adds two numbers; author: r. detmer; d
12、ate: revised 7/97.386.model flatexitprocess proto near32 stdcall, dwexitcode:dwordinclude io.h ; header file for input/output c ; io.h - header file for i/o macros c ; 32-bit version for flat memory model c ; r. detmer last revised 8/2000 c .nolist ; turn off listing c .list ; begin listing c = 0000
13、000dcr equ 0dh ; carriage return character = 0000000alf equ 0ah ; line feed.stack 4096 ; reserve 4096-byte stack 00000000.data ; reserve storage for data 00000000 00000000number1 dword ? 00000004 00000000number2 dword ? 00000008 45 6e 74 65 72prompt1 byte "enter first number: ", 0 20 66 69
14、 72 73 74 20 6e 75 6d 62 65 72 3a 20 20 00 0000001e 45 6e 74 65 72prompt2 byte "enter second number: ", 0 20 73 65 63 6f 6e 64 20 6e 75 6d 62 65 72 3a 20 20 00 00000035 00000028 string byte 40 dup (?) 00 0000005d 0d 0a 54 68 65label1 byte cr, lf, "the sum is " 20 73 75 6d 20 69 7
15、3 20 0000006a 0000000b sum byte 11 dup (?) 00 00000075 0d 0a 00 byte cr, lf, 0 00000000.code ; start of main program code 00000000_start: output prompt1 ; prompt for first number input string, 40 ; read ascii characters atod string ; convert to integer0000002e a3 00000000 r mov number1, eax ; store
16、in memory output prompt2 ; repeat for second number input string, 40 atod string00000061 a3 00000004 r mov number2, eax 00000066 a1 00000000 rmov eax, number1 ; first number to eax 0000006b 03 05 00000004 r add eax, number2 ; add second number dtoa sum, eax ; convert to ascii characters output label
17、1 ; output label and sum invoke exitprocess, 0 ; exit with return code 0 00000097public _start ; make entry point publicend ; end of source codemicrosoft (r) macro assembler version 6.11 08/03/05 15:19:43example.asm symbols 2 - 1macros: n a m e typeatod . . . . . . . . . . . . . .procatoi . . . . .
18、. . . . . . . . .procdtoa . . . . . . . . . . . . . .procinput . . . . . . . . . . . . .procitoa . . . . . . . . . . . . . .procoutput . . . . . . . . . . . . .procsegments and groups: n a m e size length align combine classflat . . . . . . . . . . . . . .groupstack . . . . . . . . . . . . .32 bit 0
19、0001000 dword stack 'stack' _data . . . . . . . . . . . . .32 bit 00000078 dword public 'data'_text . . . . . . . . . . . . .32 bit 00000097 dword public 'code'procedures, parameters and locals: n a m e type value attr$00001 . . . . . . . . . .p near 00000001 _textlength= 000
20、00096 privateexitprocess . . . . . . . . . .p near 00000000 flatlength= 00000000 external stdcallsymbols: n a m e type value attrcodesize . . . . . . . . . . .number 00000000h datasize . . . . . . . . . . .number 00000000h interface . . . . . . . . . . .number 00000000h model . . . . . . . . . . . .
21、 .number 00000007h code . . . . . . . . . . . . .text _textdata . . . . . . . . . . . . .text flatfardata? . . . . . . . . . . .text flatfardata . . . . . . . . . . . .text flatstack . . . . . . . . . . . . .text flatlf . . . . . . . . . . . . . . .number 0000000ah _start . . . . . . . . . . . . .l
22、near 00000000 _textpublicatodproc . . . . . . . . . . . .l near 00000000 flatexternalatoiproc . . . . . . . . . . . .l near 00000000 flatexternalcr . . . . . . . . . . . . . . .number 0000000dh dtoaproc . . . . . . . . . . . .l near 00000000 flatexternalinproc . . . . . . . . . . . . .l near 0000000
23、0 flatexternalitoaproc . . . . . . . . . . . .l near 00000000 flatexternallabel1 . . . . . . . . . . . . .byte 0000005d _datanumber1 . . . . . . . . . . . .dword 00000000 _datanumber2 . . . . . . . . . . . .dword 00000004 _dataoutproc . . . . . . . . . . . .l near 00000000 flatexternalprompt1 . . .
24、. . . . . . . . .byte 00000008 _dataprompt2 . . . . . . . . . . . .byte 0000001e _datastring . . . . . . . . . . . . .byte 00000035 _datasum . . . . . . . . . . . . . .byte 0000006a _data 0 warnings 0 errors圖1.9 列表文件example.lst7 使用調(diào)試軟件windbg調(diào)試程序1)打開windbg程序輸入:windbg或直接在window界面下打開c盤上的文件夾masm,雙擊 wind
25、bg.exe程序的圖標(biāo),也可以運(yùn)行windbg,并看到如圖1.10的窗口。 圖1.10 windbg打開界面2)打開可執(zhí)行文件在file菜單中打開“executable”后選擇“example.exe”或其他可執(zhí)行文件,標(biāo)題欄中增加了example.exe,以及command窗口中還出現(xiàn)一些文字。點(diǎn)擊“進(jìn)入”(step into, f11 or f8)按鈕,圖標(biāo)如。 在信息窗口中點(diǎn)擊確認(rèn)后,再點(diǎn)擊“進(jìn)入”按鈕,現(xiàn)在源代碼就出現(xiàn)在command窗口后面的子窗口中。將command窗口最小化,選擇view菜單,然后選擇register子菜單,打開一個(gè)窗口,用來顯示80x86中寄存器的內(nèi)容。然后選擇
26、view菜單下memory子菜單,打開一個(gè)窗口用來顯示內(nèi)存的內(nèi)容,對于該窗口來說,必須輸入內(nèi)存的開始地址。例如,在example.asm中,使用&number1作為開始地址,這是數(shù)據(jù)段的第一項(xiàng)。最后調(diào)整各個(gè)窗口的大小,并且重新排列,讓屏幕顯示看起來和圖1.11差不多。3)跟蹤調(diào)試程序該程序的第一條語句是高亮度顯示,點(diǎn)擊“進(jìn)入”按鈕,執(zhí)行這條語句。雖然這是一條宏語句,但可以作為一個(gè)單獨(dú)的指令執(zhí)行。在輸出窗口輸出“enter first number:”。再次點(diǎn)擊“進(jìn)入”按鈕,執(zhí)行輸入宏語句。當(dāng)輸入一個(gè)數(shù)字并按回車鍵后,windbg就回到調(diào)試窗口,第三條語句高亮顯示。第三次點(diǎn)擊“進(jìn)入”按鈕
27、,執(zhí)行將ascii代碼轉(zhuǎn)換為相應(yīng)的二進(jìn)制補(bǔ)碼的雙字的宏指令,并執(zhí)行第一條mov指令?,F(xiàn)在windbg窗口看起來如圖1.12所示,輸出窗口如圖1.13。此時(shí),register窗口顯示eax值為00000027,它是39的二進(jìn)制補(bǔ)碼的雙字形式。數(shù)字39是在提示符下輸入的,在memory窗口的第四行可以看到它的ascii碼。memory窗口的每一行由三部分組成:該行的起始地址,在這些地址中存儲字節(jié)的十六進(jìn)制數(shù),可能的化,還有這些字節(jié)相應(yīng)的可打印字符。圖1.11 windbg準(zhǔn)備跟蹤程序圖1.12 windbg跟蹤程序圖1.13 輸入輸出窗口1該程序剩余部分同樣可以跟蹤,圖1.14是程序結(jié)束之前的wi
28、ndbg窗口。滾動memory窗口,以便顯示由輸出標(biāo)志的那部分內(nèi)容。此時(shí),輸入23作為第二個(gè)數(shù)字,計(jì)算3923的和,將結(jié)果以二進(jìn)制的補(bǔ)碼形式存儲在eax中,并且由dtoa 宏將計(jì)算的和轉(zhuǎn)化為11字節(jié)長的字符串。這時(shí),內(nèi)存中,在數(shù)字6(ascii值為36)和數(shù)字2(ascii碼值為32)之前有10個(gè)空格(ascii碼值為20)。圖1.14 程序結(jié)束前的windbg最后的輸入窗口如圖1.15。圖1.15 運(yùn)行的最后顯示結(jié)果實(shí)驗(yàn)二 順序程序設(shè)計(jì)2.1 實(shí)驗(yàn)?zāi)康呐c要求2.1.1 實(shí)驗(yàn)?zāi)康恼莆?0x86 32位匯編語言程序設(shè)計(jì)的基本步驟,分析問題,確立算法。根據(jù)程序算法流程選擇合適的指令編制匯編語言源程
29、序。本實(shí)驗(yàn)著重掌握順序程序設(shè)計(jì)的基本方法和技巧,熟練使用基本的i/o宏。2.1.2 實(shí)驗(yàn)要求(1) 程序要結(jié)構(gòu)化:簡明、易讀和易調(diào)試。(2) 執(zhí)行速度較快且占用存儲空間較少。2.2 示例例2.1 計(jì)算矩形面積試編寫一程序,根據(jù)用戶輸入的矩形的長和寬,計(jì)算該矩形面積并顯示結(jié)果。要求給出相應(yīng)的輸入輸出提示信息。1 分析這一題目的算法流程很簡單,首先顯示提示信息,等待用戶輸入數(shù)據(jù)后,將用戶輸入的字符串轉(zhuǎn)換為數(shù)值并保存,獲得矩形的長和寬后,計(jì)算矩形的面積(長×寬),最后顯示結(jié)果。該程序中將使用基本的i/o宏操作,進(jìn)行輸入提示信息和結(jié)果的顯示使用宏input和output,在用戶輸入信息與數(shù)值
30、之間的轉(zhuǎn)換和面積數(shù)值和顯示信息之間的轉(zhuǎn)換需要用到宏atod和dtoa,具體使用方法參考附錄。2 流程圖根據(jù)上面的分析,該程序的流程如圖2.1。3 寄存器分配情況和變量說明在程序中定義3個(gè)提示信息串變量,其中prompt1為輸入矩形長的提示信息, prompt2為輸入矩形寬的提示信息,answer為輸出矩形面積的信息。將回車和換行的ascii碼分別定義為cr和lf兩個(gè)常量。字節(jié)變量area保存計(jì)算結(jié)果。4 運(yùn)行情況windbg下動態(tài)調(diào)試和運(yùn)行例2.1之前的界面如圖2.2。運(yùn)行完例2.1后的dos界面下顯示結(jié)果如圖2.3,寄存器eax、ebx、ecx、edx內(nèi)的值和數(shù)據(jù)保留區(qū)內(nèi)容分別如圖2.4和圖
31、2.5。圖2.1 例2.1的流程圖圖2.2動態(tài)調(diào)試?yán)?.1前狀態(tài) 圖2.3 例2.1運(yùn)行情況圖2.4 例2.1運(yùn)行后主要寄存器圖2.4例2.1運(yùn)行后的數(shù)據(jù)保留區(qū)5 例2.1源程序清單;*;功能:計(jì)算矩形面積;作者:;日期:;*.386.model flatexitprocess proto near32 stdcall, dwexitcode:dword;-include io.hcr equ 0dh ;回車lf equ 0ah ;換行;-.stack 4096 ;預(yù)留4096字節(jié)的堆棧;-.data ;數(shù)據(jù)保留區(qū)prompt1 byte "this program will fin
32、d the area of a rectangle",cr,lf,lf byte "width of rectangle?",0prompt2 byte "length of rectangle? ",0value byte 16 dup(?)answer byte cr,lf,"the area of the rectangle is"area byte 11 dup(?) byte cr, lf, 0;-.code ;主程序代碼開始_start: output prompt1 ;提示輸入寬度 input value,16
33、 ;讀取ascii字符 atod value ;轉(zhuǎn)換為整數(shù) mov ebx,eax ;將寬度值保存到ebx寄存器 output prompt2 ;提示輸入長度 input value,16 ;讀取ascii字符 atod value ;轉(zhuǎn)換為整數(shù) mul ebx ;計(jì)算長×寬,得到面積值 dtoa area,eax ;將面積結(jié)果轉(zhuǎn)換為字符集 output answer ;輸出提示信息和最后得到的結(jié)果 invoke exitprocess,0 ;退出并返回0public _start ;公開程序入口end ;*2.3 實(shí)驗(yàn)題實(shí)驗(yàn)2.1 計(jì)算成績總分和平均分1 題目:計(jì)算輸入成績的總分和
34、平均分?jǐn)?shù),并顯示計(jì)算結(jié)果。2 實(shí)驗(yàn)要求:程序接收用戶鍵入的4個(gè)成績,并計(jì)算出這4個(gè)成績的總分和平均分?jǐn)?shù)。在用戶鍵入每個(gè)成績和顯示總分和平均分?jǐn)?shù)之前都要有相應(yīng)的提示信息。當(dāng)用戶輸入的成績不在0,100 之間時(shí),顯示錯(cuò)誤信息并重新等待正確輸入。3 提示:首先在數(shù)據(jù)段中定義提示信息、累計(jì)總分變量sum和平均分?jǐn)?shù)變量average。程序一開始初始化sum值為0,當(dāng)用戶每輸入一個(gè)成績后累加到sum中。4個(gè)成績輸入完成后,sum內(nèi)的值除以4得到平均分?jǐn)?shù)并保存到average中。最后顯示計(jì)算結(jié)果。實(shí)驗(yàn)2.2 華氏溫度轉(zhuǎn)換為攝氏溫度1. 題目:輸入華氏溫度,顯示其對應(yīng)的攝氏溫度2. 實(shí)驗(yàn)要求:程序從鍵盤接收用
35、戶鍵入的華氏溫度值,根據(jù)轉(zhuǎn)換公式運(yùn)算后,顯示對應(yīng)的攝氏溫度值。在用戶輸入和顯示轉(zhuǎn)換結(jié)果之前都要有相應(yīng)的提示信息。3. 提示:首先在數(shù)據(jù)段中定義提示信息、華氏溫度值變量temperaturef和攝氏溫度值變量temperaturec。當(dāng)用戶輸入華氏溫度值后,進(jìn)行運(yùn)算,然后顯示計(jì)算結(jié)果。轉(zhuǎn)換公式:c = (5/9) * (f-32) ;其中f是華氏溫度,c是攝氏溫度實(shí)驗(yàn)2.3 字符顯示1. 題目:輸入一個(gè)字符,找出它的前導(dǎo)字符和后續(xù)字符,并按順序顯示這三個(gè)字符。2. 實(shí)驗(yàn)要求:程序從鍵盤接收用戶輸入的一個(gè)字符后,然后分別找出它的前導(dǎo)字符和后續(xù)字符,再按順序顯示這三個(gè)字符。在用戶輸入和顯示字符之前都
36、要有相應(yīng)的提示信息。3. 提示:從al寄存器得到它的ascii碼,它的前導(dǎo)字符和后續(xù)字符的ascii碼分別比它的ascii碼少1或多1。然后分別顯示這三個(gè)字符。實(shí)驗(yàn)2.4 計(jì)算總評成績1. 題目:從鍵盤輸入一同學(xué)的期中成績、實(shí)驗(yàn)成績、期末成績和它們在總評成績中分別占的百分比,計(jì)算得到該同學(xué)的總評成績,并顯示出來。2. 實(shí)驗(yàn)要求:該程序提示輸入3個(gè)成績和所占百分比??蓞⒖既缦碌睦语@示:grade 1 ? 85percent 1 ? 20grade 2 ? 75percent 2 ? 20grade 3 ? 82percent 3 ? 60score is : 813. 提示: 總評成績 (期中
37、成績×百分比1實(shí)驗(yàn)成績×百分比2期末成績×百分比3)/100實(shí)驗(yàn)三 分支程序設(shè)計(jì)3.1 實(shí)驗(yàn)?zāi)康呐c要求3.1.1 實(shí)驗(yàn)?zāi)康恼莆辗种С绦蛟O(shè)計(jì)的原理和方法,重點(diǎn)掌握各種分支程序中形成和判斷條件而產(chǎn)生的程序段的設(shè)計(jì)方法和技巧。3.1.2 實(shí)驗(yàn)要求(1) 如何產(chǎn)生條件 (2) 如何對條件進(jìn)行判斷 (3) 如何實(shí)現(xiàn)分支3.2 示例例3.1 猜數(shù)字游戲計(jì)算機(jī)要求第一個(gè)人輸入一個(gè)數(shù)字,數(shù)字輸入后清屏;然后另一個(gè)人來猜這個(gè)數(shù)字,每猜測一次,計(jì)算機(jī)都提示是“太大了”還是“太小了”,或者是“答對了”。猜對之后,猜過的數(shù)字的數(shù)目會顯示在屏幕上,并詢問時(shí)候要開始下一次游戲。1 分析在該程
38、序里面有2個(gè)地方需要進(jìn)行分支設(shè)計(jì)。第一個(gè)分支設(shè)計(jì)是判斷第二人輸入的數(shù)字是否等于第一人輸入的數(shù)字,判斷結(jié)果有三種:大于、小于和等于。其中判斷結(jié)果為大于和小于就必須等待下一次輸入數(shù)字;如果結(jié)果為等于,則輸出猜測次數(shù),并等待用戶輸入是否繼續(xù)游戲,也就是進(jìn)入第二個(gè)分支。在第二個(gè)分支里面,如果用戶輸入“y”,程序重新開始一次新游戲,否則退出程序。在這里要確定用哪些跳轉(zhuǎn)指令,在進(jìn)行分支之前先設(shè)計(jì)好標(biāo)號。2 流程圖例3.1的流程圖見圖3.1。圖3.1 例3.1的流程圖3 寄存器分配情況和變量說明定義幾個(gè)顯示提示信息,分別用于提示游戲是否繼續(xù)、提示第一人和第二人輸入數(shù)字和顯示第二人每次猜測的結(jié)果(大于,等于或
39、小于)和顯示猜測最后次數(shù)。在圖3.1中,count用于記錄每次猜測次數(shù),target存放第一人輸入的待猜測的目標(biāo)數(shù),guess存放第二人輸入的猜測數(shù)。由于count 和guess在每次都要更新,在程序代碼中分別用cx寄存器保存count的值,用eax寄存器保存當(dāng)前輸入的guess值。4 運(yùn)行情況運(yùn)行情況如圖3.2所示。圖3.2 例3.1的運(yùn)行情況5 例3.1源程序清單;*; 猜數(shù)字游戲的程序; 作者: ; 日期: ;*.386.model flat;-include io.h;-exitprocess proto near32 stdcall, dwexitcode:dword;-cr equ
40、 0dh ; 回車lf equ 0ah ; 換行;-.stack 4096 ; 保留4096字節(jié)的堆棧;-.data ; 為數(shù)據(jù)保留存儲空間prompt1 byte cr,lf,lf,"player 1, please enter a number: ", 0target dword ?clear byte 24 dup (lf), 0prompt2 byte cr,lf,"player 2, your guess? ", 0stringin byte 20 dup (?)lowoutput byte "too low", cr, l
41、f, 0highoutput byte "too high", cr, lf, 0gotitoutput byte "you got it", cr, lf, 0countlabel byte lf, "number of guesses:"countout byte 6 dup (?)byte cr, lf, lf, lf, "do you want to play again? ",0;-.code ; 開始主程序_start:untildone: output prompt1 ; 要求第一個(gè)人輸入目標(biāo)數(shù) in
42、put stringin, 20 ; 取數(shù) atod stringin ; 轉(zhuǎn)換為整數(shù) mov target,eax ; 存儲目標(biāo)數(shù) output clear ; 清屏 mov cx, 0 ; 計(jì)數(shù)為0untilmatch: inc cx ; 遞增猜的次數(shù) output prompt2 ; 要求第二人猜數(shù) input stringin, 20 ; 取數(shù) atod stringin ; 轉(zhuǎn)換為整數(shù) cmp eax, target ; 比較所猜的數(shù)字和目標(biāo)數(shù) jne ifless ; 猜的數(shù)目標(biāo)數(shù) ?equal: output gotitoutput ; 顯示“答對了” jmp endcompar
43、eifless: jnl isgreater ; 猜的數(shù)<目標(biāo)數(shù) ? output lowoutput ; 顯示“太小了” jmp endcompareisgreater: output highoutput ; 顯示“太大了”endcompare: cmp eax, target ; 比較所猜的數(shù)和目標(biāo)數(shù) jne untilmatch ; 再次詢問是否猜的數(shù)目標(biāo)數(shù) itoa countout, cx ; 將count轉(zhuǎn)換為ascii碼 output countlabel ; 顯示標(biāo)號,count和提示符 input stringin, 20 ; 取出響應(yīng) cmp stringin, 'n' ; 響應(yīng)“n”? je enduntildone ; 是,則退出 cmp stringin, 'n' ; 響應(yīng) = 'n' ? jne untildone ;不是,則重復(fù)enduntildone: invoke exitprocess, 0 ; 退出,返回代碼0public _start ; 公開代碼入口點(diǎn)end ; 結(jié)束;*3.3 實(shí)驗(yàn)題實(shí)驗(yàn)3.1 分類統(tǒng)計(jì)字符個(gè)數(shù)1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文科科研課題項(xiàng)目申報(bào)書
- 市級重點(diǎn)課題申報(bào)書模板
- 高職病理課題申報(bào)書
- 傳統(tǒng)文化相關(guān)課題申報(bào)書
- 廣東省課題申報(bào)書重復(fù)率
- 山東省課題申報(bào)書范文
- 出租雜物小倉庫合同范本
- 單位食堂蔬菜配送合同范例
- 怎么拿到省級課題申報(bào)書
- 產(chǎn)品拍攝合同范本模板
- 乘務(wù)大隊(duì)客艙服務(wù)質(zhì)量
- 海智工作站申報(bào)計(jì)劃書
- 托管崗前培訓(xùn)教學(xué)課件
- 機(jī)房運(yùn)維管理制度
- 昆明撫仙湖鰭魚灣棋盤山度假娛樂旅游區(qū)總體規(guī)劃方案樣本
- 突發(fā)疾病時(shí)的安全駕駛方法
- 污水處理廠入河排污口設(shè)置論證報(bào)告
- T-SHNA 0005-2023 成人住院患者腸外營養(yǎng)輸注護(hù)理
- 課件:認(rèn)識鏡頭語言1:運(yùn)鏡方式和常用的鏡頭術(shù)語
- 職業(yè)道德(Professionalethics)教學(xué)課件
- 提升醫(yī)療質(zhì)量減少醫(yī)療糾紛
評論
0/150
提交評論