用汇编语言,编写程序输出100-200之间所有的素数,每行输出5个数,在线等,急求!!!!!!!!!!
;用汇编语言,编写程序输出100-200之间所有的素数,每行输出5个数,在线等,急求!!!!!!!!!!
data segment
n1 db 20 dup(0)
N DB 0
data ends
code segment
main proc far
assume cs:code,ds:data
start:
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
;
;MOV AX,20000
mov ax,100 ;起始数
AGAIN:
cmp ax,200 ;结束数
;cmp ax,300
ja exit
MOV BX,2
X1:
CMP BX,AX
JAe EXIT1 ;YES,DISP IT
PUSH AX
PUSH BX
MOV DX,0
DIV BX
CMP DX,0 ;YU=0
JE N11 ;NO
POP BX
POP AX
cmp bx,2 ;去掉偶数
ja add2
dec bx
add2:
inc bx
INC BX
JMP X1
N11:
POP BX
POP AX
JMP N22
EXIT1: ;YES,DISP IT
mov si,offset n1
mov dx,0
CALL DIV10
push ax
push bx
mov dx,offset n1
mov ah,9
int 21h
INC N
MOV AL,N
CMP AL,5 ;每行显示5个数
JNE DISP_K
MOV AL,0
MOV N,AL
JMP DISP_CR
DISP_K:
MOV AH,2
MOV DL,' '
INT 21H
JMP NEXT9
DISP_CR:
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
NEXT9:
pop bx
pop ax
N22:
inc ax
jmp again
exit:
RET
;INT 20H
main endp
;=====================
;=====================
;将32位16进制数(DX:AX)转换为10进制数子程序
;入口: DX:AX存32位16进制数, SI为存放转换后10进制数的首地址
;出口: 在SI中存放转换后10进制数的ASCII码
DIV10 PROC NEAR
push ax
PUSH BX ;保护现场
PUSH CX
PUSH DI
MOV CX,0 ;每位10进制数进栈计数器
MOV BX,10D ;除数10
RE_DIV:
PUSH AX ;低16位进栈
MOV AX,DX ;先除高16位
MOV DX,0 ;高位置0
DIV BX ;商在AX中,是下一轮除的高位;余数在DX中,它和已进栈的AX(低16位)组成新的32位数
MOV DI,AX ;将下一轮除的高位保存在DI
POP AX ;取回先前进栈的低16位
DIV BX ;除后,商AX是下一轮的低16位,即(DI:AX)组成新的32位被除数;
;余数DX是一位已转换的10进制数
ADD DX,30H ;将其转换成ASCII码
PUSH DX ;将其进栈
INC CX ;进栈计数器加1
MOV DX,DI ;将高位商返回DX
CMP AX,0 ;判断商是否为0, DX:AX均需为0,实际上就是(DI:AX)这个新组成的32位被除数是否为0
jz down1 ;商低位为0
JMP RE_DIV ;商低位不为0,继续除10取余
down1:
cmp dx,0
jz down ;商低位(AX)为0,高位(DX)也为0
JMP RE_DIV ;否则继续除10取余
DOWN: ;当DX和AX均为0时(商为0),转结束除
POP [SI] ;以CX的值(进栈计数器)依次出栈
INC SI ;由于出栈的数仅低8位有效(高位为0),所以SI每次只增1,
;使新出栈的低8位有效值覆盖前一次出栈的高位0
LOOP DOWN
MOV AL,'$' ;在字符串尾部加结束标志
MOV [SI],AL
POP DI ;恢复现场
POP CX
POP BX
pop ax
RET
DIV10 ENDP
;========================
;========================
code ends
end start