X86_输入十进制,输出所有不大于该数的素数
百度知道 > 电脑/网络 > 程序设计 > 其他编程语言
急啊,汇编程序题目:输入一个十进制数(0-255)
悬赏分:5 - 离问题结束还有 10 天 12 小时
1)给出提示信息,要求独占一行。
2)求不大于该数的所有素数,并以二进制和十进制输出。
提问者: wucheng883 - 魔法学徒 一级
http://zhidao.baidu.com/question/95710774.html
;X86_输入十进制,输出所有不大于该数的素数
;以二进制和十进制输出
code segment
assume cs:code,ds:code
org 100h
start:
push cs
pop ds
push cs
pop es
cld ;造表
mov al,2 ;初值2
mov si,500h
mov di,si
mov cx,254
Save:stosb
inc al
loop Save
;表中非素数的,清0
inc si
mov cx,254
lo_p:
mov ah,0
mov al,[si]
call Prime
jc next
mov byte ptr [si],0
next:inc si
loop lo_p
;
;输入一个十进制数(0-255)
Again:lea dx,Tips
mov ah,9
int 21h ;显示提示
xor bp,bp ;BP清0
mov cx,3
@In:mov ah,0
int 16h ;无回显输入
cmp al,1bh ;Esc退出程序
jz quit
cmp al,0dh
jz OK ;回车结束输入
cmp al,'0'
jb @In
cmp al,'9';数据校验
ja @In
mov ah,0eh
int 10h ;显示有效输入
and al,0fh
shl bp,1
mov bx,bp
shl bp,1
shl bp,1
add bp,bx
mov ah,0
add bp,ax ;BP*10+AX
loop @In
OK:cmp bp,2
jb Err ;0,1,非素数
cmp bp,100h ;≥256,×
jb Show
Err:lea dx,Error
mov ah,9
int 21h
jmp Again
;
Show:;显示结果
Call Print
jmp Again
quit:
mov ah,0
int 16h
mov ah,4ch
int 21h
Tips db 0dh,0ah,' Input(0-255D),Esc to Quit: ',0dh,0ah,' $'
Error db 0dh,0ah,' Input Error[>255]or Not a Prime!',0dh,0ah,'$'
;
Prime:;判断是否素数
PUSH BX
PUSH CX
PUSH AX
POP CX
SHR CL,1
MOV CH,2
PRIME1:
PUSH AX
XOR AH,AH
DIV CH
AND AH,AH
JZ PRIME2
INC CH
CMP CH,CL
JAE PRIME3
POP AX
JMP PRIME1
PRIME2: CLC ;非素数,CF=0
POP AX
JMP PRIME4
PRIME3: STC ;是素数,CF=1
POP AX
PRIME4: POP CX
POP BX
RET
;
Print:;显示结果
call CRLF
mov bp,bp
sub bp,2
mov si,500h
add bp,si
@R1:mov al,[si]
or al,al
jz @R2
call ShowBin ;显示二进制
mov ax,0e20h
int 10h
call ShowDec ;显示十进制
call CRLF
@R2:inc si
cmp si,bp
jbe @R1
ret
;
ShowBin:;显示二进制
push ax
push cx
push dx
mov dl,al
mov ah,0eh
mov cx,8
Q1:mov al,'0'
rcl dl,1
jnc Q2
mov al,'1'
Q2:int 10h
loop Q1
mov al,'B'
int 10h
pop dx
pop cx
pop ax
ret
;
ShowDec:;显示十进制
push ax
push cx
push dx
push si
lea bx,Table
lea di,Deci
mov al,[si]
mov cx,3 ;二化十
W1:mov ah,0
div byte ptr [bx]
mov dl,ah
or al,'0'
mov [di],al ;存入Deci
mov al,dl
inc di
inc si
inc bx
loop W1
lea si,Deci ;清除前导0
mov cx,2
@E:mov al,[si]
cmp al,'0'
jnz @F
mov byte ptr [si],20h
inc si
loop @E
@F:
lea dx,Deci
mov ah,9
int 21h
pop si
pop dx
pop cx
pop ax
ret
Table db 100,10,1
Deci db '000 D$'
;
CRLF:
mov ax,0e0dh
int 10h
mov al,0ah
int 10h
mov al,20h
int 10h
ret
;
code ends
end start