zoukankan      html  css  js  c++  java
  • 汇编课程设计---求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调用我们接触的非常非常少。总之,费了九牛二虎之力,总算是解决这次的课程设计。
    这次课程设计给我带来的收获很多。第一,它让我更进一步的了解了汇编语言,并用其来做一些实践性的东西。第二,我在编写和调试程序的时候,也锻炼了我的耐心和细心。第三,这次课程设计也锻炼了我查阅资料的能力。

  • 相关阅读:
    程序、进程、线程区别与联系
    SQL常用知识与必须掌握的面试常问SQL语句
    快速搭建一个基于react的项目
    原生js判断设备类型
    在vue项目中设置BASE_URL
    纯前端实现数据导出excel文件
    原生js实现拖拽功能
    使用Echarts实现折线图的一点总结
    在vue项目中显示实时时间(年月日时分秒)
    在vue项目中使用MD5.js
  • 原文地址:https://www.cnblogs.com/csushl/p/10765063.html
Copyright © 2011-2022 走看看