汇编那些事

问题

求100以内的素数。
要求:
(1)以十进制输出这些素数,每行10个,每输出一个素数都要有数秒的停顿。
(2)统计这些素数的个数,以十进制形式输出。
(3)计算这些素数之和,以十进制形式输出,并让该和闪烁3次。
(4)数据的输入和结果的输出都要有必要的提示,且提示独占一行。
(5)要使用到子程序。

代码

data segment
  count dw 0;存放素数个数
  sum   dw 0;存放素数的和
  prime dw 100 dup(?);存放素数
  primemsg db 'print prime',0ah,0dh,'$';输出素数的提示信息
  countmsg db 0ah,0dh,'print prime of count',0ah,0dh,'$';输出素数个数提示
  summsg   db 0ah,0dh,'print prime of sum',0ah,0dh,'$' ;输出素数和提示
  blank    db '    $' 
data ends

;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
stack segment
  dw 20 dup(?)
stack ends

;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------

code segment
  assume cs:code,ds:data,ss:stack
  main proc far;主程序
start:
  mov ax,data
  mov ds,ax
  
  mov ax,stack
  mov ss,ax

  call caculate
  call disprime
  call dispcount
  call dispsum
  mov ax,4c00h
  int 21h
  main endp


;------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------

 caculate proc near;判断素数的子程序
 

  lea di,prime;将prime的偏移地址送入di
  mov bh,0
  mov bl,2;bl从2到100递增
l1:
  cmp bl,100
  ja l2
  mov dl,2;dl从2到bl-1
l3:
  cmp dl,bl;j<i
  jae l4
  mov ax,bx
  div dl
  cmp ah,0
  jz l5;余数为0,则不是素数
  inc dl
  jmp l3
l4:
  inc count
  add sum,bx
  mov [di],bl
  inc di
l5:
  inc bl
  jmp l1

l2:
  ret
caculate endp
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------

disprime proc near

  lea dx,primemsg
  mov ah,09h
  int 21h

  lea si,prime
  mov cx,count
l21:
  mov ax,count
  sub ax,cx;loop一次,cx--,所以可以用ax和cx的差作为判断依据
  mov bl,10
  div bl
  cmp ah,0
  jnz l22;余数不为0说明不需要换行
  mov dl,0ah
  mov ah,02h
  int 21h
  mov dl,0dh
  mov ah,02h
  int 21h
l22:
  mov bl,[si];从si中取出数据
  mov bh,0;保证数据的稳定
  call disp10
  call delay
  inc si;si指向下一个素数
  loop l21
  ret
disprime endp
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------

dispcount proc near
  lea dx,countmsg
  mov ah,09h
  int 21h
  mov bx,count
  call disp10;
  call delay
  ret
dispcount endp

;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------

dispsum proc near
  lea dx,summsg
  mov ah,09h
  int 21h
  

  push cx
  mov cx,3
  
lp:
  mov bx,sum
  call disp10;十进制输出 
  call delay
  
  mov ah,02h;回车符
  mov dl,0dh
  int 21h

  lea dx,blank
  mov ah,09h
  int 21h

   mov ah,02h
  mov dl,0dh
  int 21h

  call delay;延时
  loop lp
  mov bx,sum
  call disp10
  pop cx
  ret
dispsum endp

;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------

disp10 proc near;该子程序的作用是将BX中的数以十进制形式输出 
   push cx
   push si
   mov cx,0
  mov ax,bx
disp10_l1:
   mov dx,0;余数在dx里
   mov si,10
   div si
   add dx,30h
   push dx;将商一个一个压栈
   inc cx
   cmp ax,0
   jnz disp10_l1
disp10_l2:
   pop dx;将每个十进制数字弹出
   mov ah,02h
   int 21h
   loop disp10_l2
   pop si
   pop cx
 
   mov ah,02h
   mov dl,20h
   int 21h
   ret
disp10 endp

;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------
delay proc near
  push cx
  push ax
  mov ax,1000d
ld1:
  mov cx,200d
ld2:
  loop ld2
  dec ax
  jnz ld1
  pop ax
  pop cx
  ret
delay endp
;------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------

code ends
end start
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值