計算機原理與匯編語言
課程設計
題目名稱 :求100以內的素數2
姓名:
學號:
專業:計算機科學與技術
班級:
指導老師:
編寫日期:24/04/2019
目錄
目錄
正文部分 3
一. 問題描述 3
1.背景 3
2.基本功能要求 4
二. 系統設計 4
1. 題目的基本內容 4
2. 程序流程圖 5
三. 源代碼清單 8
四.運行結果測試與分析 13
五.結論和心得 22
正文部分
一.問題描述
1.背景
匯編語言不像其他大多數的程序設計語言一樣被廣泛用於程序設計。在今天的實際應用中,它通常被應用在底層,硬件操作和高要求的程序優化的場合。驅動程序、嵌入式操作系統和實時運行程序都需要匯編語言。匯編語言的另一個特點就是它所操作的對象不是具體的數據,而是寄存器或者存儲器,也就是說它是直接和寄存器和存儲器打交道,這也是為什么匯編語言的執行速度要比其它語言快,但同時這也使編程更加復雜,因為既然數據是存放在寄存器或存儲器中,那么必然就存在着尋址方式,也就是用什么方法找到所需要的數據。例如上面的例子,我們就不能像高級語言一樣直接使用數據,而是先要從相應的寄存器AX、BX 中把數據取出。這也就增加了編程的復雜性,因為在高級語言中尋址這部分工作是由編譯系統來完成的,而在匯編語言中是由程序員自己來完成的,這無異增加了編程的復雜程度和程序的可讀性。
2.基本功能要求
由於DOS的9號調用輸出的是ASCⅡ碼,因此我們在輸出到屏幕的時候一定要將其先轉換為ASCⅡ碼再使用9號調用輸出。考慮到ASCⅡ碼轉化為數字較為麻煩,因此可以定義兩個組數據buf、buf1,其中buf用於存放1~99,buf1用於存放1~99的ASCⅡ碼。
這段程序運用的兩次loop循環分別實現把0~99送到buf、將0~99的ASCⅡ碼送到buf1。在循環完畢后,采用dos的9號調用將buf1的數據輸出到屏幕上,
完成這段程序后,跳到下一個模塊,即刪除合數保留素數並顯示模塊。然后跳轉到下一模塊。求和,最后到求平均數模塊。
二.系統設計
1. 題目的基本內容
設計題目:求100以內的素數
具體要求:
(1)求出這些素數。
(2)在屏幕上顯示出求素數的動態過程(在屏幕上先顯示出100以內的所有數,再動態地刪去不符合要求的數,刪除的過程要明顯)。
(3)計算這些素數的平均值(取整,四舍五入),以十進制形式輸出,並讓改制以紅色顯示。
(4)數據的輸入和結果的輸出都要有必要的提示,且提示獨占一行。
(5)要使用子程序。
2. 程序流程圖
2.1.顯示素數的流程圖
顯示0~100的流程圖
刪除合數保留素數流程圖
求和流程圖
求平均數的流程圖
三.源代碼清單

data segment input1 db 0ah,0dh,'if you want to quit,please press Q/q! ' db 0ah,0dh,'if you want to print 0~99,please press any other key!',0ah,0dh,' $' input2 db 0ah,0dh,'if you want to quit,please press Q/q! ' db 0ah,0dh,'if you want to find the prime number ,please press any other key!',0ah,0dh,0ah,0dh,'$' input3 db 0ah,0dh,'if you want to quit,please press Q/q! ' db 0ah,0dh,'if you want to get the avreage of the prime numbers ,please press any other key!',0ah,0dh,0ah,0dh,'$' input4 db 0ah,0dh,'the avreage of the prime numbers is:','$' input5 db 0ah,0dh,'press any key to quit!','$' buf db 99 dup(?),0 ;用於存0~99 buf1 db 99 dup(?,?,','),0dh,0ah,'press any key to continue!',0dh,0ah,'$' ;用於放1~99的asc碼 buf2 db ?,?,0dh,0ah,'$' data ends code segment assume ds:data,cs:code start: mov ax,data mov ds,ax lea dx,input1 mov ah,9 ;打印字符串input1 int 21h ;從鍵盤讀一字符但不回顯,判斷是否要退出 mov ah,08h int 21h cmp al,'Q' jE exit cmp al,'q' je exit lea bx,buf;把buf的有效地址給bx mov ax,0 mov al,1 mov cx,99 loop1: ;buf里面存放0~100 mov [bx],al inc al ;al++ inc bx loop loop1 mov cx,99 lea si,buf1 ; lea bx,buf ; loop2: ;輸出0~100 mov ax,0 mov al,[bx] mov dl,10 div dl ;ax/dl ;轉換成ACSII碼 add al,30h ;十位asc碼 add ah,30h ;個位asc碼 mov [si],al mov [si+1],ah add si,3 add bx,1;下一個數 loop loop2 lea dx,buf1 mov ah,9 int 21h mov ah,08h int 21h ;顯示0~100 jmp bb exit: ;退出 mov ax,4c00h int 21h bb: ;判斷是否繼續輸出尋找素數的過程 lea dx,input2 mov ah,9 int 21h mov ah,08h int 21h cmp al,'Q' jE exit cmp al,'q' je exit mov cx,0 lea bx,buf lea si,buf1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; a1: mov dl,1 a2: and ax,0 mov al,[bx+3] dec al ;al-- inc dl ;dl++ cmp al,dl jz a3 inc al div dl cmp ah,0 jnz a2 mov [si+9],ah mov [si+10],ah jmp a4 a3: inc cx ;控制循環次數 a4: ;輸出篩選過程 lea dx,buf1 mov ah,9 int 21h mov ah,08h int 21h add si,3 inc bx mov dl,[bx+3] cmp dl,0 ;跳出循環 jnz a1 lea dx,input3 ;輸入提示input3(average) mov ah,9 int 21h mov ah,08h int 21h ;輸入提示 cmp al,'Q' jE exit cmp al,'q' je exit mov di,cx add di,3 ;計數送到di mov cx,99 and si,0 lea bx,buf1 loop3: mov al,[bx] ;十位 and ax,00ffh mov dh,[bx+1] ;個位 cmp al,0 jz c1 sub dh,30h sub al,30h mov dl,10 mul dl add al,dh add si,ax c1: ;求和求平均數 add bx,3 loop loop3 lea dx,input4;輸出平均值 mov ah,9 int 21h mov ah,08h int 21h mov ax,si ;和送到ax mov bx,di ;個數送到bx and bx,00ffh div bl inc al and ax,00ffh mov bx,10 and bx,00ffh div bl add al,30h add ah,30h ;將平均值轉化為asc碼,al為十位,ah為個位 lea bx,buf2 mov [bx],al mov [bx+1],ah mov ah,09 mov al,0 mov bh,00 mov cx,2 mov bl,4 int 10h lea dx,buf2 mov ah,9 int 21h mov ah,08h int 21h lea dx,input5 mov ah,9 int 21h mov ah,08h int 21h exit1: mov ax,4c00h int 21h code ends end start
四.運行結果測試與分析
五.結論和心得
這次的計算機原理與匯編語言課程設計,求100以內的素數,在數學的學習中,我們會經常接觸到素數這個概念。素數又稱質數。指在一個大於1的自然數中,除了1和此整數自身外,不能被其他自然數(不包括0)整除的數。因為合數是由若干個質數相乘而得來的,所以,沒有質數就沒有合數,由此可見素數在數論中有着很重要的地位。比1大但不是素數的數稱為合數。1和0既非素數也非合數。這個學期我們剛好學了《匯編語言程序設計》這門課,並且初步的了解了匯編語言知識,並且可以編寫簡單的代碼。因此,我們可以運用匯編語言來編寫程序,求取100以內的素數,動態的刪除合數,並且以紅色的字輸出素數的平均值。起初以為這個課題比較簡單,通過查書和資料可以很快做出來,來,結果開始做卻發現不是那么回事,發現了很多的問題。
首先,課本上的知識還遠遠不夠,需要我借鑒別人的程序來提升自己對匯編語言的認識以及了解,並且很多復雜難懂的程序還無法讀懂。其次,在編寫的過程中,總會有各種各樣的問題出現,即使一個小小的標點符號錯誤也無法將程序運行出來,這就需要我們的耐心仔細去慢慢的調試並且發現錯誤在哪里。第三,我們對於匯編語言的認識還遠遠不夠,一學期的簡單學習,應用於編程還很吃力,dos調用、bios調用我們接觸的非常非常少。總之,費了九牛二虎之力,總算是解決這次的課程設計。
這次課程設計給我帶來的收獲很多。第一,它讓我更進一步的了解了匯編語言,並用其來做一些實踐性的東西。第二,我在編寫和調試程序的時候,也鍛煉了我的耐心和細心。第三,這次課程設計也鍛煉了我查閱資料的能力。