Skip to content

Instantly share code, notes, and snippets.

@gorakhargosh
Last active October 8, 2015 13:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gorakhargosh/9c85052be1d4c5e11142 to your computer and use it in GitHub Desktop.
Save gorakhargosh/9c85052be1d4c5e11142 to your computer and use it in GitHub Desktop.
; 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