【汇编算法】小白求助~~~关于用汇编求100以内素数
要求:(1)求出这些素数。
(2)在屏幕上显示出求素数的动态过程(在屏幕上先显示出100以内的所有数,再动态地删去不符合要求的数,删除的过程要明显。)
(3计算这些素数的平均值(四舍五入取整),以十进制形式输出,并让该值以红色显示。
(4)数据的输入和结果的输出都要有必要的提示,且提示独占一行。
(5)要使用到子程序。
各位大神,拜托了,最好 后面有点注释。跪求~
下面是我网上找的程序,运行不成功,不知道该怎么改:
assume cs:code,ss:sty,es:data
data segment
dw "02","03","05","07","11","13","17","19","23","29","31","37","41","43","47","53","59","61","67","71","73","79","83","89","97"
data ends
sty segment
db 16 dup (0)
sty ends
code segment
ks:mov ax,0b800h
mov ds,ax
mov bx,0 ;显存基址跟偏移
mov ax,sty
mov ss,ax
mov sp,32 ;栈基址跟偏移
mov ax,data
mov es,ax ;素数
mov ax,1
mov cx,100
xxx:push cx ;保护寄存器
call acw
call delay ;延时子程序
pop cx ;这里是30行
inc ax
loop xxx
;*************************************************以上是转换ASCII码并显示***************************************************
mov bp,0 ;指向数据
mov cx,100
mov bx,0 ;指向显存
y1:mov dx,es:[bp] ;取出数据
mov ah,ds:[bx]
mov al,ds:[bx+2] ;取出显存
cmp ax,dx ;比较
je yy
mov byte ptr ds:[bx],0 ;不等,则删除显存,跳过显存
mov byte ptr ds:[bx+2],0
add bx,6
jmp short aet
yy:add bx,6 ;相等则跳过数据与显存
add bp,2
aet:call delay
loop y1
mov byte ptr ds:[bx-2],0 ;删除一百那个0
;**************************************************以上是在显存显示并删除多余************************************************
mov bx,0
mov bp,160*7 ;显存偏移指向第七行
mov byte ptr ds:[bp],40 ;括号(
add bp,2
mov cx,25
e:mov ax,es:[bx] ;取素数
mov ds:[bp],ah
mov ds:[bp+2],al ;将素数放入显存
mov byte ptr ds:[bp+4],43 ;将+号放入显存
add bp,6
add bx,2 ;80行
call delay
loop e
mov byte ptr ds:[bp-2],41 ;括号)
mov byte ptr ds:[bp],47 ;除以号"/"
add bp,2
mov byte ptr ds:[bp],32h ;数值2
add bp,2
mov byte ptr ds:[bp],35h ;数值5
add bp,2
mov byte ptr ds:[bp],61 ;等于号"="
add bp,2
mov cx,10
is:call delay
loop is ;调用延时
call jsq ;调用子程序,得出总和,和在SI中
mov dx,0
mov bx,0
mov ax,si
mov bl,25
div bl ;得出平均值
mov ah,0
mov bl,10
div bl
add ah,30h ;余加30H
add al,30h ;懒的判断来判断去,直接弄把,反正知道结果
mov ds:[bp],al
mov byte ptr ds:[bp+1],4h ;红色。。
mov ds:[bp+2],ah
mov byte ptr ds:[bp+3],4h
mov cx,20
pq:call delay
loop pq
mov ax,4c00h
int 21h
;**************************************************以下是子程序的区域*******************************************************
acw:
push ax ;保护寄存器
mov di,0 ;di用于记录循环多少次
h1:mov cx,0
mov dx,0
mov dl,10
div dl
add ah,30h ;得出ASCII码
mov cl,ah
push cx ;将ascii码放入栈
inc di ;di发挥
mov ah,0
mov cl,al ;刚才除法的商放入CX
jcxz h2 ;如果商为0就跳到标号h2处
jmp far ptr h1 ;如果不为0就跳回去继续执行
h2:mov cx,di
cmp di,1
jne h3
mov byte ptr [bx],30h
add bx,2
h3:mov dx,0
pop dx ;刚才放入栈的ASCII码拿出来
mov [bx],dl ;ASCII码放入显存
add bx,2
loop h3
mov byte ptr [bx],0
add bx,2
pop ax ;ax还原
ret
;******************************************************以上是转换ASCII码子程序***********************************************
delay:push ax
push dx
mov dx,1000h
mov ax,0
s11:sub ax,1
sbb dx,0
cmp ax,0
jne s11
cmp dx,0
jne s11
pop dx
pop ax
ret
;***************************************************以上是延时子程序*********************************************************
jsq:push dx
push ax
push bx
mov bx,0
mov di,0
mov cx,25
qs:mov ax,es:[di] ;取素数
mov dx,0
sub al,30h
mov bl,al ;数字放入BL
mov al,ah
mov ah,0
sub al,30h
mov dl,10
mul dl ;还原数字
add bl,al ;得回数字
add si,bx ;数值相加
add di,2
loop qs
pop bx
pop ax
pop dx
ret
code ends
end ks