匯編課程設計---求0~100內的素數2


 

計算機原理與匯編語言

課程設計

 

題目名稱 :求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

 
View Code

 

.運行結果測試與分析

 

 

 

 


 

五.結論和心得

 

這次的計算機原理與匯編語言課程設計,求100以內的素數,在數學的學習中,我們會經常接觸到素數這個概念。素數又稱質數。指在一個大於1的自然數中,除了1和此整數自身外,不能被其他自然數(不包括0)整除的數。因為合數是由若干個質數相乘而得來的,所以,沒有質數就沒有合數,由此可見素數在數論中有着很重要的地位。比1大但不是素數的數稱為合數。1和0既非素數也非合數。這個學期我們剛好學了《匯編語言程序設計》這門課,並且初步的了解了匯編語言知識,並且可以編寫簡單的代碼。因此,我們可以運用匯編語言來編寫程序,求取100以內的素數,動態的刪除合數,並且以紅色的字輸出素數的平均值。起初以為這個課題比較簡單,通過查書和資料可以很快做出來,來,結果開始做卻發現不是那么回事,發現了很多的問題。

首先,課本上的知識還遠遠不夠,需要我借鑒別人的程序來提升自己對匯編語言的認識以及了解,並且很多復雜難懂的程序還無法讀懂。其次,在編寫的過程中,總會有各種各樣的問題出現,即使一個小小的標點符號錯誤也無法將程序運行出來,這就需要我們的耐心仔細去慢慢的調試並且發現錯誤在哪里。第三,我們對於匯編語言的認識還遠遠不夠,一學期的簡單學習,應用於編程還很吃力,dos調用、bios調用我們接觸的非常非常少。總之,費了九牛二虎之力,總算是解決這次的課程設計。
這次課程設計給我帶來的收獲很多。第一,它讓我更進一步的了解了匯編語言,並用其來做一些實踐性的東西。第二,我在編寫和調試程序的時候,也鍛煉了我的耐心和細心。第三,這次課程設計也鍛煉了我查閱資料的能力。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM