鱼C论坛

 找回密码
 立即注册
查看: 1837|回复: 0

[技术交流] 本人新手写的一个小程序:用最笨的算法,在屏幕显示1-n的自然数串中的所有的质数。

[复制链接]
发表于 2012-7-12 14:28:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
;功能:从屏幕第一行开始显示1-n的自然数串中的所有的质数,并用空格隔开;n<10000h,n的上下限用bx设置。

assume cs:code

data segment
        db 16 dup (0)
data ends


code segment
  start:  mov ax,data                    ;获取数据段段地址
            mov ds,ax                        ;把数据段地址送入数据段寄存器

            mov ax,0b800h                ;将显示缓冲区段地址送入通用寄存器
            mov es,ax                        ;从通用寄存器将显示缓冲区段地址传入附加段寄存器
     
            mov di,0                          ;初始化显示缓冲区偏移地址,用于数字加空格的连续输入
            mov bx,1                         ;初始化变量的下限值
            cmp bx,1                         ;将变量和1比较大小
            je s4                                ;等于1跳转到非质数的处理段s4
   s3:    mov si,0                           ;初始化一个标记,里面用来装被整除的次数
           mov cx,bx                         ;将变量传入放除数的寄存器
   s6:    dec cx                              ;将除数减1作为除数
           mov ax,bx                        ;将变量作为被除数
           mov dx,0                         ;将放余数的寄存器清零
           div cx                               ;做16位除法
           cmp dx,0                         ;将结果的余数和零比较
           jne s6                               ;不等于0则跳转到s6,即把除数减1继续做除法,直到除数等于1为止
           inc si                                ;如果余数等于0,将标记加1
           cmp si,2                           ;将标记中的数和2比较
           je s4                                 ;如果等于2,表示被除数是质数,跳转到非质数的处理段s4
           cmp cx,1                          ;将除数与1比较
           je s5                                 ;如果等于1跳转到判断标记段s5
           jmp short s6                    ;如果不等于1,跳转到将除数减1继续做除法的段s6

   s5:   cmp si,1                            ;将标记中的数和1比较
           jne s4                               ;不等于1表述被除数不是质数,跳转到非质数的处理段s4
           mov ax,bx                        ;将变量作为被除数
           mov si,0                           ;将记录余数个数的标记清零
    s:    mov cx,10                        ;将除数设为10
          mov dx,0                          ;将放余数的寄存器清零
          div cx                               ;做除法
          add dx,30h                      ;将余数加30h得到ASCII码
          push dx                           ;将ASCII码入栈
          inc si                                ;计数器加1
          cmp ax,0                         ;将商和0比较
          jnz s                                 ;不等于0,则跳转到s继续用10除

          mov cx,si                         ;将上面的标记中的数传入计数器
          mov si,0                          ;将目标地址的偏移地址初始化为0
  s7:    pop ax                            ;将ASCII码出栈
          mov ds:[si],al                  ;将ASCII码送入数据段
           inc si                              ;数据段偏移地址加1
           loop s7                          ;循环之前计数器中的次数

          mov cx,si                        ;si中的数表示有几个ASCII码进入数据段,可以作为循环次数
          mov si,0                          ;将数据地址的偏移地址初始化为0
          mov ah,2                        ;将颜色属性放入通用寄存器的高8位
  s1:    mov al,[si]                      ;将数据段中的ASCII码传入通用寄存器的低8位
          mov es:[di+160],ax        ;将颜色属性和ASCII码一次性传入显示缓冲区
          add di,2                         ;将显示缓冲区偏移地址加2
          inc si                              ;将数据段偏移地址加1
          loop s1                          ;循环之前计数器中的次数


         mov cx,8                         ;将计数器设为8
          sub cx,si                        ;用8减去si中的数,表示要补多少个空格
          mov ax,0                       ;将颜色属性0和空格的ASCII码一次性送入通用寄存器
   s2:  mov es:[di+160],ax       ;将颜色属性0和空格的ASCII码一次性送入显示缓冲区
          add di,2                        ;显示缓冲区偏移地址加2
          loop s2                         ;循环之前计数器中的次数
      
   s4:   inc bx                           ;变量加1
          cmp bx,1500                ;用变量和上限值比较
          jna s3                           ;不大于则跳转到s3处继续执行

          mov ax,4c00h              ;设置中断号
          int 21h                         ;进行21中断

code ends

end start     

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 06:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表