Last active
October 8, 2015 13:05
-
-
Save gorakhargosh/9c85052be1d4c5e11142 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; PROGRAM TO GET FIRST N NO OF PRIMES | |
;including the macro file | |
include macros.inc | |
data segment | |
cr equ 0dh ;ASCII code for carriage return | |
lf equ 0ah ;ASCII code for line feed | |
msg1 DB 'HOW MANY PRIMES TO BE PRINTED:$' | |
MSG2 DB CR,LF,'PRIME SERIES:','$' | |
PRIME DW 100 DUP ( 0 ) ;PRIME ARRAY | |
NUM DB ? | |
NEWLINE DB CR,LF,'$' | |
RESULT DB 20 DUP ( '$' ) | |
data ends | |
CODE SEGMENT | |
ASSUME CS:CODE,DS:DATA | |
PRIMES: | |
MOV AX,DATA | |
MOV DS,AX | |
;READ PRIME COUNT | |
prints msg1 | |
readi num | |
;INITIALIZE PRIME(0)=1 , PRIME(1) =2 | |
MOV SI,OFFSET PRIME ;SI = TABLE ADDRESS | |
MOV DX,1 | |
MOV WORD PTR [SI],DX ;PRIME(0)=0 ;WE CHANGE HERE | |
ADD SI,02 ;SI POINTS TO WORD ARRAY | |
INC DX | |
MOV WORD PTR [SI],DX ;PRIME(1)=1 | |
;CX =NUMBER OF PRIMES | |
MOV CH,00 | |
MOV CL,NUM | |
;PRIME GENERATION COUNT | |
MOV BX,2 | |
;PRIME SERIES GENERATION | |
NEXTPRIME: | |
;TO DECIDE PRIME, DIVIDE BY 2..(N-1) | |
;IF ANY WHERE INTEGER DIVISION IS PERFORMED | |
;THEN NUMBER IS NOT PRIME | |
MOV DH,02H ;DIVIDED NUMBER=2 | |
INC DL ;NEXT NUMBER | |
NEXTCHECK: | |
MOV AH,00 | |
MOV AL,DL | |
DIV DH ;NUMBER/DH | |
CMP AH,00 ;IF REMINDER = O THEN NOT PRIME | |
JE NOTPRIME | |
INC DH ;NEXT DIVIDED TERM | |
CMP DH,DL ;CHECK WHETHER TERM < NUMBER | |
JL NEXTCHECK ;IF YES THEN NEXTCHECK | |
;NUMBER IS PRIME SO STORE THAT IN A PRIME TABLE | |
MOV AH,00 | |
MOV AL,DL | |
ADD SI,02 ;ADJUST SI FOR PRIME(I) | |
MOV WORD PTR [SI],AX | |
INC BX ;INCREMENT PRIME COUNT | |
NOTPRIME: | |
CMP BX,CX ;COMPARE I AND COUNT | |
JL NEXTPRIME ;IF I<COUNT GOTO REPEAT | |
;PRINT THE PRIME SERIES | |
prints MSG2 | |
MOV BX,00 ;BX=INDEX | |
MOV SI,OFFSET RESULT ;SI = STORAGE FOR ASCII STRING | |
NEXTPRN: | |
lea bx,prime | |
mov ax,[bx] | |
printi ax | |
prints NEWLINE | |
prints RESULT ;DISPLAY PRIME | |
ADD BX,02 ;ADJUST BX | |
LOOP NEXTPRN ;REPEAT FOR ALL THE TERMS | |
exit | |
;FUNCTION TO CONVERT HEXA DECIMAL NUMBER TO ASCII STRING | |
;AX - INPUT NUMBER | |
;SI - POINTER TO RESULT STORAGE AREA | |
HEX2ASC PROC NEAR | |
PUSH AX ;SAVE REGISTER | |
PUSH BX | |
PUSH CX | |
PUSH DX | |
PUSH SI | |
MOV CX,00H ;COUNTER FOR INTERMEDIATE DATA PUSHED | |
MOV BX,0AH ;LOAD 10 IN BL | |
RPT1: | |
MOV DX,00 | |
DIV BX ;DIVIDED NUM BY 10 | |
ADD DL,'0' ;CONVERT REMINDER TO ASCII | |
PUSH DX ;STORE ASCII DIGIT ON TO THE STACK | |
INC CX ;UPDATE COUNTER | |
CMP AX,0AH ;IS NUM LESS THAN OR EQUAL TO 10 | |
JGE RPT1 ;IF YES, PERFORM CONVERSION | |
ADD AL,'0' ;CONVERT LAST DIGIT TO ASCII | |
MOV [SI],AL ;STORE LAST DIGIT | |
;POP ALL INTERMEDIATE DATA FROM STACK AND STORE RESULT | |
RPT2: | |
POP AX ;POP DATA | |
INC SI ;ADVANCE RESULT STRING POINTER | |
MOV [SI],AL ;STORE IN RESULT | |
LOOP RPT2 | |
INC SI | |
MOV AL,'$' | |
MOV [SI],AL ;APPEND END OF STRING | |
POP SI ;RESTORE THE REGISTERS | |
POP DX | |
POP CX | |
POP BX | |
POP AX | |
RET | |
HEX2ASC ENDP | |
CODE ENDS | |
END PRIMES | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment