| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 600 人关注过本帖
标题:請前輩們幫我看看這個源程序代碼。100以內的素數
只看楼主 加入收藏
syrah
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-12-28
收藏
 问题点数:0 回复次数:0 
請前輩們幫我看看這個源程序代碼。100以內的素數
這個代碼可以運行,但是不知道怎麼顯示結果……剛學彙編語言,所以很多地方都不精通。
希望有前輩能指點一下。浪費您一點時間幫我看看這個代碼。

另有,裏面的子程序怎麼調用呢?謝謝!

源程序代碼:

Code   Segment
   Assume  CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output  MACRO Str_Addr
   push  ax
   lea  dx,Str_Addr
   mov  ah,9
   int  21h
   pop  ax
   EndM
; -------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr  proc  Near
   push  ax
   mov   ah,02h
   int   21h
   pop   ax
   ret
Output_Chr  endp
; -------------------------------------
; 功能:输出回车换行
Output_CTLF proc  Near
   push  ax
   push  dx
   mov   ah,02h
   mov   dl,0dh
   int   21h
   mov   dl,0ah
   int   21h
   pop   dx
   pop   ax
   ret
Output_CTLF endp
; -------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII  Proc  Near
   push  dx
   push  bx
   push  di
   mov   bx,10
   lea   di,@@Temp_Save[6]
   mov   BYTE ptr [di],'$'
   dec   di
@@Divide:  xor   dx,dx
   div   bx
   or   dl,30h
   mov   [di],dl
   dec   di
   test  ax,0ffffh
   jnz   @@Divide
   inc   di
   push  di
   pop   dx
   mov   ah,9
   int   21h
   pop   di
   pop   bx
   pop   dx
   ret
@@Temp_Save  db   7 dup(?)
Dec_ASCII  EndP
; -------------------------------------
; 功能:延时指定的时钟嘀嗒数
; 入口:
; Didas=时钟嘀嗒数(1秒钟约嘀嗒18.2次,10秒钟嘀嗒182次。若延时不是秒的10数次倍,误差稍微大点)
Delay   Proc  Near
   push  dx
   push  cx
   xor  ax,ax
   int  1ah
   mov  cs:@@Times,dx
   mov  cs:@@Times[2],cx
Read_Time: xor  ax,ax
   int  1ah
   sub  dx,cs:@@Times
   sbb  cx,cs:@@Times[2]
   cmp  dx,Didas
   jb  Read_Time
   pop  cx
   pop  dx
   ret
@@Times  dw  0,0
Delay   EndP
; -------------------------------------
; 判断素数
; 入口参数:AL=256以内无符号整数
; 返回参数:若AL是素数,进位标志置位;否则,清位
Estimation  Proc  Near
   push  si
      push  cx
      push  ax
      lea   si,PrimeLess
      cmp   al,1
      jz    @@Not_Prime ;1不是素数
      mov   cx,4
@@Less_Prime: cmp   al,[si]
      jz    @@Yes_Prime ;2、3、5、7是素数
      inc   si
      loop  @@Less_Prime
      test  al,1
      jz    @@Not_Prime ;除了2,其它偶数不是素数
      lea   si,PrimeLess[1]
            mov   cx,3
@@Divide357: push  ax
      div   BYTE ptr [si]
      test   ah,ah
      jnz    $+5
      pop  ax
      jmp  @@Not_Prime
      pop   ax
            inc   si
      loop  @@Divide357
      jmp   $+5
@@Not_Prime: clc ;不是素数,清进位标志
      jmp  $+3
@@Yes_Prime: stc ;是素数,置进位标志
   pop   ax
      pop   cx
      pop   si
      ret
PrimeLess   db    2,3,5,7
Estimation  EndP
; -------------------------------------
prompt_1  db  'These primes are:',13,10,'$'
prompt_2  db  13,10,13,10,'The primes: $'
prompt_3  db  13,10,13,10,'The sum of the primes: $'
Press_Key  db    13,10,13,10,'The complated. Press any key to exit...$'
Start:    push  cs
   pop  ds ;使数据段与代码段同段
   push  cs
   pop  es ;使附加段与代码段同段
Didas  =  36 ;延时2秒
; -------------------------------------
;(1)以十进制输出这些素数,每行10个,每输出一个素数都要有数秒的停顿
            Output prompt_1 ;提示显示素数
            mov   cx,99
            xor  bx,bx ;素数个数计数器
            xor  bp,bp ;素数之和初值
            cld
PrimeSum:   mov  ax,100
   sub  ax,cx ;100以内的自然数
   call  Estimation ;判断素数子程序
      jnc   Next_One ;不是素数
      inc  bx ;素数计数
      add  bp,ax ;累加素数
      call  Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
;      call  Delay ;延时2秒
      mov  dl,20h ;空一格
      call  Output_Chr ;显示输出一个字符
      mov  ax,bx
      mov  dl,10
      div  dl
      test  ah,ah
      jnz  $+5
            call  Output_CTLF ;显示输出一个回车、换行
Next_One:  loop  PrimeSum
; -------------------------------------
;(2)以十进制形式输出素数的个数
            Output prompt_2 ;提示显示素数个数
            mov  ax,bx
            call  Dec_ASCII
; -------------------------------------
;(3)以十进制形式输出素数之和,并让该和闪烁3 次。
            Output prompt_3 ;提示显示素数之和
            xor  bx,bx
            mov  ah,3 ;取光标位置
            int  10h
            mov  ax,160
            mul  dh
            shl  dl,1
            xor  dh,dh
            add  ax,dx
            inc  ax
            mov  di,ax ;字符显示方式当前光标位置显示属性在显示缓冲区中的偏移地址
            mov  ax,bp
            call  Dec_ASCII
            push  es
            mov  ax,0b800h ;字符显示方式屏幕显示缓冲区段地址
            mov  es,ax
            mov  al,8dh ;字符显示属性
            mov  cx,4
            cld
            push  di
Change_Attr1: stosb
   inc  di
   loop  Change_Attr1
Didas  =  48 ;延时3秒
      call  Delay ;延时
   pop  di
            mov  al,7 ;字符显示属性
            mov  cx,4
Change_Attr2: stosb
   inc  di
   loop  Change_Attr2
            pop  es
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
   mov  ah,1
   int  21h
   mov  ah,4ch ;结束程序
   int  21h
Code   ENDS
   END   Start ;编译到此结束
搜索更多相关主题的帖子: 数据 源程序 子程序 字符串 
2009-12-28 19:28
快速回复:請前輩們幫我看看這個源程序代碼。100以內的素數
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018860 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved