

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 匯編語(yǔ)言課程實(shí)習(xí)報(bào)告</p><p> 實(shí)習(xí)題目 計(jì)算比賽成績(jī)</p><p> 學(xué)生姓名 </p><p> 班級(jí)(學(xué)號(hào)) 計(jì)科1123班 201211621301</p><p> 院系 信息學(xué)院計(jì)算機(jī)系</p>&l
2、t;p> 指導(dǎo)老師 </p><p> 提交時(shí)間 2014年5月28 日</p><p><b> 成績(jī)</b></p><p><b> 目 錄 </b></p><p> 1 課程實(shí)習(xí)任務(wù)……………………………………………………
3、………………2</p><p> 2 基本知識(shí)…………………………………………………………………………2 </p><p> 2.1 匯編語(yǔ)言程序結(jié)構(gòu)………………………………………………………3 </p><p> 2.2 關(guān)鍵指令分析……………………………………………………………4 </p><p> 2.3 匯編語(yǔ)言
4、上機(jī)過(guò)程………………………………………………………4</p><p> 3 總體分析…………………………………………………………………………5 </p><p> 3.1 程序功能分析……………………………………………………………5 </p><p> 3.2 設(shè)計(jì)思路…………………………………………………………………5</p>&l
5、t;p> 3.3 程序框圖…………………………………………………………………6</p><p> 4 代碼實(shí)現(xiàn)………………………………………………………………………7</p><p> 5 調(diào)試過(guò)程及操作說(shuō)明…………………………………………………………11</p><p> 6 總結(jié)……………………………………………………………………………12
6、</p><p> 7 參考文獻(xiàn)………………………………………………………………………12</p><p> 1 課程實(shí)習(xí)任務(wù) </p><p><b> 計(jì)算比賽成績(jī)系統(tǒng) </b></p><p><b> 基本功能: </b></p><p> ?。?)
7、有9名評(píng)委,每個(gè)評(píng)委給分范圍為0~10(整數(shù)):由鍵盤(pán)輸入; </p><p> ?。?) 9名評(píng)委給分中,去掉一個(gè)最高分和一個(gè)最低分,剩余7名評(píng)委的平均分即為參賽者的得分(精確到小數(shù)點(diǎn)后二位,不考慮四舍五入); (3) 將最后得分在光標(biāo)位置處顯示出來(lái)。 </p><p><b> 2 基本知識(shí) </b></p><p> 2.1 匯編
8、語(yǔ)言程序結(jié)構(gòu) </p><p> 匯編語(yǔ)言是計(jì)算機(jī)能夠提供給用戶使用的最快而又最有效的語(yǔ)言,也是能夠利用計(jì)算機(jī)所有硬件特性并能控制硬件的唯一語(yǔ)言。也因此匯編語(yǔ)言的程序結(jié)構(gòu)也是多種多樣的,我們熟知的結(jié)構(gòu)有循環(huán)、分支程序、子程序和宏匯編。而循環(huán)程序又有簡(jiǎn)單循環(huán)和多重循環(huán),最重要的是我們要控制好循環(huán)的次數(shù);分支程序則是由設(shè)定條件不同而跳轉(zhuǎn)到不用的分支,來(lái)實(shí)現(xiàn)不同的功能;子程序則是我們?yōu)榱税颜麄€(gè)程序模塊化,使得讀程序的
9、人容易理解你的程序功能;宏則是一種另類的子程序,是有些程序?yàn)榱四茉跁r(shí)間上達(dá)到嚴(yán)格的要求和一些功能代碼簡(jiǎn)短的多參數(shù)傳遞的程序?yàn)榱朔奖銋?shù)傳遞而使用的,而犧牲一點(diǎn)點(diǎn)空間來(lái)實(shí)現(xiàn),當(dāng)然宏和子程序的工作機(jī)制也是不同的。 </p><p> 2.2 關(guān)鍵指令分析 </p><p> 2.2.1 數(shù)據(jù)傳送指令 </p><p> mov指令:mov指令可以在C
10、PU內(nèi)或CPU和存儲(chǔ)器之間傳送字或者字節(jié)。 </p><p> PUSH和POP指令:這兩條分別是堆棧的進(jìn)棧和出棧指令。 </p><p> XCHG指令:它可以在寄存器之間或者在寄存器和儲(chǔ)存器之間交換信息。 2.2.2 地址傳送指令 </p><p> LEA指令:將源操作數(shù)的有效地址送到指定的寄存器中。不能使用段寄存 器,源操作數(shù)可以使用除立即數(shù)和寄存器
11、外的任一種寄存器尋址方式。 </p><p> 2.2.3 類型轉(zhuǎn)換指令 </p><p> CBW指令:將AL的內(nèi)容符號(hào)擴(kuò)展到AH,形成AX中的字 </p><p> 2.2.4 算數(shù)指令 </p><p> ADD指令:進(jìn)行加法操作 INC指令:自加1 SUB指令:進(jìn)行減法操作 DEC 指令:自減1 </p>&
12、lt;p> CMP指令:將兩個(gè)操作數(shù)進(jìn)行減法操作,但不保存結(jié)果,只設(shè)置條件標(biāo)志位 MUL指令:進(jìn)行無(wú)符號(hào)乘法操作 DIV指令:進(jìn)行無(wú)符號(hào)除法操作 2.2.5 邏輯指令 </p><p> AND指令:進(jìn)行邏輯與操作,見(jiàn)0得0 OR指令:進(jìn)行邏輯或操作,見(jiàn)1得1 </p><p> XOR指令:進(jìn)行異或操作,相同得0,不同得1 2.2.6 控制轉(zhuǎn)移指令 </p>
13、<p> JMP指令:無(wú)條件跳轉(zhuǎn)到指定位置 </p><p> 條件轉(zhuǎn)移指令:根據(jù)上一條指令所設(shè)置的條件碼來(lái)判別測(cè)試條件,每一種轉(zhuǎn) 移指令有它的測(cè)試條件,滿足測(cè)試條件則轉(zhuǎn)移到指令指定的位置 LOOP指令: 當(dāng)測(cè)試條件碼CX不為0時(shí),循環(huán)指定程序段 </p><p> CALL指令:把子程序的返回地址存入棧中,以便子程序返回主程序時(shí)調(diào)用 RET指令:轉(zhuǎn)移到子程序的入口
14、地址去繼續(xù)執(zhí)行 </p><p> 2.3 匯編語(yǔ)言上機(jī)過(guò)程 </p><p> 上機(jī)過(guò)程是我們編寫(xiě)好程序后驗(yàn)證的最好手段,也是我們對(duì)我們寫(xiě)得程序進(jìn)行調(diào)試必不可少的一個(gè)過(guò)程。上機(jī)過(guò)程我們首先要把我們編寫(xiě)的程序在編譯器里對(duì)它進(jìn)行編譯看看是否有語(yǔ)法上的錯(cuò)誤,然后編譯生成.obj文件,最后連接生成可執(zhí)行文件.exe,然后我們要對(duì)生成的
15、可執(zhí)行文件進(jìn)行調(diào)試,看看是否有邏輯上的錯(cuò)誤,如果有邏輯上的錯(cuò)誤那么我們還要對(duì)程序進(jìn)行修改,知道沒(méi)有邏輯上的錯(cuò)誤時(shí),我們就可以運(yùn)行程序,并得到我們想要的結(jié)果了。上機(jī)過(guò)程大概課分為四部分:編輯、編譯、調(diào)試、運(yùn)行。</p><p> 只有通過(guò)上機(jī)過(guò)程你才能發(fā)現(xiàn)你的程序是否有邏輯上或者語(yǔ)法上的錯(cuò)誤,最</p><p> 重要的是檢測(cè)運(yùn)行結(jié)果是不是你理論上的結(jié)果。我們只有在上機(jī)過(guò)程中才能發(fā)現(xiàn)問(wèn)題
16、,然后解決問(wèn)題,最終得到我們想要的結(jié)果。</p><p><b> 3.總體分析 </b></p><p><b> 3.1程序功能分析</b></p><p> 通過(guò)讀取依次從鍵盤(pán)輸入的9個(gè)兩位的十進(jìn)制數(shù)得分,將得分保存在字符串中,然后用冒泡法將9個(gè)數(shù)的位置按大小重新排列并輸出,再將中間的7個(gè)數(shù)累加起來(lái)除以7,即得
17、到去掉最高分和最低分之后的平均分,最后設(shè)置光標(biāo)位置到平均分處。</p><p><b> 3.2設(shè)計(jì)思路</b></p><p> 通過(guò)記錄鍵盤(pán),將ASCII碼轉(zhuǎn)化為二進(jìn)制數(shù)寸入長(zhǎng)度為9的字符串中,此部分使用用循環(huán)結(jié)構(gòu)。若輸入的兩位數(shù)的首位,即十位,非0或非1,則提示錯(cuò)誤并要求重復(fù)輸入,若輸入的個(gè)位數(shù)非0~9中的數(shù),則提示錯(cuò)誤并要求重復(fù)輸入。</p>
18、<p> 用冒泡法重排9個(gè)數(shù),使得第1和第9個(gè)數(shù)分別為最大數(shù)和最小數(shù),并在屏幕中依次顯示出來(lái)。然后用循環(huán)語(yǔ)句求出9個(gè)數(shù)中中間的7個(gè)數(shù)的和,即總得分,若總得分為70分,則直接輸出平均分:10.00分。若小于70分則將總得分除以得到的商作為平均分的個(gè)位數(shù),輸出一個(gè)小數(shù)點(diǎn),將余數(shù)乘以10再除以7,如此循環(huán)3次,后兩次不輸出小數(shù)點(diǎn),得到精確到小數(shù)點(diǎn)后兩位的平均的分?jǐn)?shù),再將平均分輸出。最后改變光標(biāo)位置為平均得分處。</p&g
19、t;<p> 3.3 程序設(shè)計(jì)框圖</p><p><b> YES</b></p><p><b> NO</b></p><p><b> 4.代碼實(shí)現(xiàn)</b></p><p> DATAS SEGMENT</p><p>
20、 RESULT DB 10 DUP(?) </p><p> STRING1 DB 'Please input integer(0-10) '</p><p> NUMBER DB 31H,': ','$'</p><p> STRING2 DB 0AH,'The ranged scores are:
21、','$'</p><p> STRING3 DB 'After removing the highest and lowest score, the average score is: ','$'</p><p> ERROR DB ' out of range',0AH,0DH,'$
22、9;</p><p> ERROR1 DB ' is not an integer',0AH,0DH,'$'</p><p> ERROR2 DB ' is not an number',0AH,0DH,'$'</p><p> DATAS ENDS</p>
23、<p> STACKS SEGMENT</p><p> ;此處輸入堆棧段代碼</p><p> STACKS ENDS</p><p> CODES SEGMENT</p><p> ASSUME CS:CODES,DS:DATAS,SS:STACKS</p><p> CR PROC NEAR
24、 ;設(shè)置一個(gè)子程序</p><p><b> PUSH AX</b></p><p><b> PUSH BX</b></p><p> MOV AH,02H</p><p> MOV DL,0DH;回車</p><p><b> INT 21
25、H</b></p><p> MOV DL,0AH;換行</p><p><b> INT 21H</b></p><p><b> POP BX</b></p><p><b> POP AX</b></p><p><b
26、> RET</b></p><p><b> CR ENDP</b></p><p><b> START:</b></p><p> MOV AX,DATAS</p><p><b> MOV DS,AX</b></p><p&
27、gt;<b> XOR SI,SI</b></p><p><b> MOV CX,9</b></p><p> MOV AH, 00H</p><p> MOV AL, 10 ;選擇顯示方式10H(16色圖形)</p><p><b> INT 10H</b><
28、;/p><p> MOV AH, 10H</p><p> MOV AL, 00H</p><p> MOV BH, 10H ;背景設(shè)為綠色(02H也可以,是用DEBUG調(diào)試出來(lái)的)</p><p> MOV BL, 0 ;選擇0號(hào)調(diào)色板</p><p><b> INT 10H</b>&l
29、t;/p><p><b> INPUT:</b></p><p> LEA DX,STRING1</p><p> MOV AH,9;9號(hào)功能,顯示字符串</p><p> INT 21H;的邏輯地址 </p><p> MOV AH,1;AL=輸入字符</p>&l
30、t;p><b> INT 21H</b></p><p> SUB AL,30H;把輸入的字符ASCII轉(zhuǎn)換成數(shù)值</p><p><b> MOV DL,10</b></p><p> MUL DL;十位數(shù)乘以10</p><p> MOV DX,AX;把十位數(shù)存放在DL&
31、lt;/p><p><b> MOV AH,1</b></p><p><b> INT 21H</b></p><p> MOV BL,'.'</p><p> CMP AL,BL;判斷個(gè)位數(shù)是否是小數(shù)點(diǎn),因?yàn)橐斎氲臄?shù)是整數(shù),用這種方法來(lái)提示輸入的數(shù)不能是小數(shù)</p
32、><p><b> JE ER1</b></p><p> SUB AL,30H</p><p> ADD AL,DL;個(gè)位數(shù)和十位數(shù)相加</p><p> CMP AL,0;跟0比較</p><p> JB ER;小于0則調(diào)到ER</p><p> CMP
33、 AL,10;跟10比較</p><p> JA ER;大于10則調(diào)到ER</p><p> MOV RESULT[SI],AL;把AL的值存放在RESULT</p><p> INC SI ;SI自加1</p><p> INC NUMBER</p><p> CALL CR;調(diào)用子
34、程序</p><p> LOOP INPUT</p><p> JMP RANGE_0;轉(zhuǎn)入排序</p><p><b> ER:</b></p><p> LEA DX,ERROR;取ERROR的偏移地址</p><p><b> MOV AH,9</b>
35、;</p><p><b> INT 21H</b></p><p><b> JMP INPUT</b></p><p><b> ER1:</b></p><p> LEA DX,ERROR1</p><p><b> MOV A
36、H,9</b></p><p><b> INT 21H</b></p><p><b> JMP INPUT</b></p><p><b> RANGE_0:</b></p><p><b> MOV BX,1</b></p&
37、gt;<p><b> MOV CX,9</b></p><p><b> XOR DI,DI</b></p><p><b> RANGE:</b></p><p> MOV AL,RESULT[DI];把RESULT(I)送到AL</p><p>
38、 CMP AL,RESULT[DI+1];進(jìn)行比較</p><p> JAE NEXT_1;大于或等于跳到NEXT_1</p><p> XCHG RESULT[DI+1],AL;小于則進(jìn)行交換</p><p> MOV RESULT[DI],AL;保存較大的數(shù)</p><p><b> MOV BX,0
39、</b></p><p><b> NEXT_1:</b></p><p><b> INC DI</b></p><p> LOOP RANGE</p><p><b> CMP BX,0</b></p><p> JE RANG
40、E_0</p><p> LEA DX,STRING2;取STRING2的偏移地址</p><p><b> MOV AH,9</b></p><p><b> INT 21H</b></p><p> MOV CX,9;顯示輸出的次數(shù)</p><p>
41、 XOR SI,SI;SI;清零</p><p><b> MOV AH,2</b></p><p> RANGE_OUTPUT:;輸出排序后的得分</p><p> MOV DL,RESULT[SI]</p><p> ADD DL,30H;把DL的值轉(zhuǎn)換成ASCII</p>
42、<p> CMP DL,39H;判斷是否是10分</p><p> JA TENS_1;10分就跳到TEXT_1</p><p> JBE TENS_0;不是就跳到TEXT_0</p><p><b> TENS_1: </b></p><p><b> MOV BX,
43、1</b></p><p> MOV DL,'1';輸出字符1</p><p><b> INT 21H</b></p><p> MOV DL,'0';輸出字符0</p><p><b> INT 21H</b></p>
44、<p><b> INC SI</b></p><p> MOV DL,',';輸出逗號(hào)</p><p><b> INT 21H</b></p><p> JMP NEXT_2</p><p> TENS_0:;十位數(shù)位0,則按原分輸出<
45、;/p><p><b> INT 21H</b></p><p><b> INC SI</b></p><p> MOV DL,','</p><p><b> INT 21H</b></p><p><b> NEXT
46、_2:</b></p><p> LOOP RANGE_OUTPUT</p><p><b> MOV AH,2</b></p><p> MOV DL,0AH;換行</p><p><b> INT 21H</b></p><p> MOV DL
47、,0AH;換行</p><p><b> INT 21H</b></p><p> MOV DL,0DH;回車</p><p><b> INT 21H</b></p><p> LEA DX,STRING3;取STRING3的偏移地址</p><p>
48、;<b> MOV AH,9H</b></p><p><b> INT 21H</b></p><p> MOV CX,7;累加中間7個(gè)數(shù)字</p><p> XOR AX,AX;AX清零</p><p><b> DEC SI</b></p>
49、;<p><b> SUM:</b></p><p><b> ;求7個(gè)分?jǐn)?shù)的和</b></p><p><b> DEC SI</b></p><p> ADD AL,RESULT[SI]</p><p><b> LOOP SUM</
50、b></p><p> CMP AL,46H;與滿分70 比較</p><p> JAE FULL_MARK;大于等于挑到FULL_MARK</p><p> JMP N_FULL_MARK;否則跳到N_FULL_MARK</p><p> FULL_MARK:</p><p><b&
51、gt; ;滿分時(shí)</b></p><p><b> MOV AH,2H</b></p><p> MOV DL,'1';輸出字符1</p><p><b> INT 21H</b></p><p> MOV DL,'0';輸出字符0
52、</p><p><b> INT 21H</b></p><p> MOV DL,'.'</p><p> INT 21H;輸出字符</p><p> MOV DL,'0'</p><p><b> INT 21H</b>&
53、lt;/p><p> MOV DL,'0'</p><p><b> INT 21H</b></p><p> JMP ENDING</p><p> N_FULL_MARK:</p><p><b> ;非滿分時(shí)</b></p><
54、p> MOV CX,3;設(shè)置循環(huán)3次,為下面的求兩位小數(shù)做準(zhǔn)備</p><p> MOV BH,1;設(shè)置小數(shù)點(diǎn)出現(xiàn)一次</p><p><b> DIVISION:</b></p><p><b> MOV BL,7</b></p><p> DIV BL;除以7
55、</p><p> PUSH AX;把除完后的AX入棧,存起來(lái)</p><p> ADD AL,30H</p><p> MOV DL,AL </p><p><b> MOV AH,2</b></p><p> INT 21H;輸出商</p><p&
56、gt; CMP BH,0;把BX置為0,使下次循環(huán)不會(huì)出現(xiàn)小數(shù)點(diǎn)</p><p> JE DOT</p><p> MOV DL,'.'</p><p><b> INT 21H</b></p><p><b> MOV BX,0</b></p>
57、<p><b> DOT: </b></p><p> POP AX;恢復(fù)之前入棧的余數(shù)</p><p> MOV AL,AH;余數(shù)存入AL</p><p><b> MOV DL,10</b></p><p> MUL DL;余數(shù)乘以10,結(jié)果存入AX&
58、lt;/p><p> LOOP DIVISION</p><p><b> ENDING:</b></p><p> MOV AH,02;調(diào)用2號(hào)功能,置光標(biāo)位置</p><p> MOV BH,0;顯示頁(yè)</p><p> MOV DX,0E48H;顯示行列,DH=0CH行
59、,DL=48H列</p><p> INT 10H;設(shè)置光標(biāo)位置</p><p> MOV AH,4CH</p><p><b> INT 21H</b></p><p> CODES ENDS</p><p><b> END START</b></
60、p><p> 5調(diào)試過(guò)程及操作說(shuō)明</p><p> 如上圖,當(dāng)我們輸入一個(gè)整數(shù)的時(shí)候會(huì)自動(dòng)跳到下行輸入,輸入的數(shù)不對(duì)如負(fù)數(shù),小數(shù)點(diǎn),大于10的都會(huì)顯示錯(cuò)誤的信息然后自動(dòng)提醒再重新輸入。當(dāng)我們輸完數(shù)據(jù)之后會(huì)自動(dòng)排序和計(jì)算成績(jī)</p><p><b> 6.總結(jié)</b></p><p> 這次課程設(shè)計(jì),代碼雖然不長(zhǎng),當(dāng)
61、卻可以從中了解很多的知識(shí),比如哪幾號(hào)的功能是做什么的,之前都不是怎么了解,等到要做的時(shí)候,一個(gè)一個(gè)會(huì)去詳細(xì)查詢,然后通過(guò)實(shí)踐了解了這些指令的作用和用處。</p><p> 通過(guò)課程幾天的課程設(shè)計(jì),學(xué)到了諸多上課學(xué)不到的知識(shí),特別是體會(huì)到了匯編語(yǔ)言與高級(jí)程序語(yǔ)言編程的不同,起初非常不適宜匯編語(yǔ)言的編程,高級(jí)程序語(yǔ)言中的基本功能,入多重循環(huán)和套嵌,在匯編語(yǔ)言看來(lái)缺是相當(dāng)復(fù)雜的,還有數(shù)字的輸入和輸出都要經(jīng)過(guò)ASCII
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 計(jì)算比賽成績(jī)_匯編語(yǔ)言課程設(shè)計(jì)報(bào)告書(shū)
- 匯編語(yǔ)言課程設(shè)計(jì)---學(xué)生成績(jī)管理
- 匯編語(yǔ)言課程設(shè)計(jì)
- 匯編語(yǔ)言課程設(shè)計(jì)--學(xué)生成績(jī)管理系統(tǒng)的設(shè)計(jì)
- 匯編語(yǔ)言課程設(shè)計(jì)
- 匯編語(yǔ)言課程設(shè)計(jì)報(bào)告
- 匯編語(yǔ)言課程設(shè)計(jì)_提取系統(tǒng)時(shí)間
- 匯編語(yǔ)言課程設(shè)計(jì)《定時(shí)顯示系統(tǒng)》
- 匯編語(yǔ)言課程設(shè)計(jì)報(bào)告
- 匯編語(yǔ)言課程設(shè)計(jì)安排
- 匯編語(yǔ)言課程設(shè)計(jì)---系統(tǒng)時(shí)間顯示
- 匯編語(yǔ)言課程設(shè)計(jì)報(bào)告
- 匯編語(yǔ)言課程設(shè)計(jì)報(bào)告a
- 匯編語(yǔ)言課程設(shè)計(jì)--簡(jiǎn)單計(jì)算器設(shè)計(jì)
- 匯編語(yǔ)言課程設(shè)計(jì)--用匯編語(yǔ)言實(shí)現(xiàn)顯示系統(tǒng)時(shí)間的程序
- 匯編語(yǔ)言課程設(shè)計(jì)報(bào)告---顯示系統(tǒng)時(shí)間
- 《匯編語(yǔ)言》課程設(shè)計(jì)報(bào)告顯示系統(tǒng)時(shí)間
- 匯編語(yǔ)言推箱子課程設(shè)計(jì)
- 匯編語(yǔ)言課程設(shè)計(jì)----電子鬧鐘
- 打字游戲-匯編語(yǔ)言課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論