Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; prime.asm
- ; sample program to demonstrate procedures
- ; calulates and prints prime numbers from 1 to 20
- include 'emu8086.inc'
- org 100h; set location counter to 100h
- jmp CodeStart
- DataStart:
- max dw 20
- space db " ", 0
- CodeStart:
- mov bx, 2;set this value to the number you want to start at I used 2 because 1 is not a prime.
- LoopStart:
- ;call procedure IsPrime to test whether the number is
- ;prime or not
- call IsPrime
- cmp dx, 0
- ;if dx is equal to 0 jump
- je Equal
- mov ax, bx
- call print_num
- ; print a space
- mov si, offset space
- call print_string
- Equal:
- add bx, 1
- cmp bx, max
- jle LoopStart
- ret
- IsPrime PROC
- ; uses a loop to determine if number in bx is prime
- ; upon return if bx not prime dx will be 0, otherwise dx > 0
- ; we only have to test divisors from 2 to bx/2
- ; prepare to divide dx:ax / 2
- mov ax, bx
- mov dx, 0
- mov cx, 2
- div cx
- ; move result into si for loop
- mov si, ax
- ; assume the value is prime
- mov dx, 1
- ; start loop count at 2
- mov cx, 2
- PrimeLoop:
- ; compare loop count(in cx) and max loop value (in si)
- cmp cx, si
- ; jump out of loop if count(cx) > si
- ja StopLabel
- ; divide test value (in bx) by loop count (in cx)
- mov ax, bx
- mov dx, 0
- div cx
- ; check remainder (in dx), if zero then we found a divisor
- ; and the number cannot be prime
- cmp dx, 0
- ; if dx = 0 then we found a divisor and can stop looking
- je StopLabel
- ; increment count
- add cx, 1
- jmp PrimeLoop
- StopLabel:
- ret
- IsPrime ENDP
- DEFINE_PRINT_STRING
- DEFINE_SCAN_NUM
- DEFINE_PRINT_NUM
- DEFINE_PRINT_NUM_UNS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement