; Listing generated by Microsoft (R) Optimizing Compiler Version 13.10.3077 

	TITLE	prime.c
	.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
_DATA	SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA	ENDS
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
_BSS	SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS	ENDS
$$SYMBOLS	SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS	ENDS
_TLS	SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS	ENDS
FLAT	GROUP _DATA, CONST, _BSS
	ASSUME	CS: FLAT, DS: FLAT, SS: FLAT
endif

INCLUDELIB LIBC
INCLUDELIB OLDNAMES

_DATA	SEGMENT
$SG918	DB	'prime_count = %d ', 0aH, 00H
_DATA	ENDS
PUBLIC	_main
EXTRN	_printf:NEAR
EXTRN	_sqrt:NEAR
EXTRN	__ftol2:NEAR
EXTRN	__fltused:NEAR
; Function compile flags: /Odt
; File c:\work\prime.c
_TEXT	SEGMENT
_j$ = -20						; size = 4
_prime_flag$ = -16					; size = 4
_prime_count$ = -12					; size = 4
_i$ = -8						; size = 4
_test_val$ = -4						; size = 4
_main	PROC NEAR

; 9    : {

	push	ebp
	mov	ebp, esp
	sub	esp, 20					; 00000014H

; 10   :   int test_val;
; 11   :   int prime_flag;
; 12   :   int prime_count;
; 13   :   int i, j;
; 14   : 
; 15   :   prime_count = 1;  // init to 1 because 2 is prime

	mov	DWORD PTR _prime_count$[ebp], 1

; 16   :   for (i=3; i<MAX; i=i+2)

	mov	DWORD PTR _i$[ebp], 3
	jmp	SHORT $L908
$L909:
	mov	eax, DWORD PTR _i$[ebp]
	add	eax, 2
	mov	DWORD PTR _i$[ebp], eax
$L908:
	cmp	DWORD PTR _i$[ebp], 2000000		; 001e8480H
	jge	SHORT $L910

; 17   :   {
; 18   :     test_val = (int) sqrt((double) i);

	fild	DWORD PTR _i$[ebp]
	sub	esp, 8
	fstp	QWORD PTR [esp]
	call	_sqrt
	add	esp, 8
	call	__ftol2
	mov	DWORD PTR _test_val$[ebp], eax

; 19   :     prime_flag = 1;

	mov	DWORD PTR _prime_flag$[ebp], 1

; 20   :     for (j=3; j<=test_val; j=j+2)

	mov	DWORD PTR _j$[ebp], 3
	jmp	SHORT $L913
$L914:
	mov	ecx, DWORD PTR _j$[ebp]
	add	ecx, 2
	mov	DWORD PTR _j$[ebp], ecx
$L913:
	mov	edx, DWORD PTR _j$[ebp]
	cmp	edx, DWORD PTR _test_val$[ebp]
	jg	SHORT $L915

; 21   :       if ((i % j) == 0) prime_flag = 0;

	mov	eax, DWORD PTR _i$[ebp]
	cdq
	idiv	DWORD PTR _j$[ebp]
	test	edx, edx
	jne	SHORT $L916
	mov	DWORD PTR _prime_flag$[ebp], 0
$L916:

; 22   :     if (prime_flag == 1) prime_count++;

	jmp	SHORT $L914
$L915:
	cmp	DWORD PTR _prime_flag$[ebp], 1
	jne	SHORT $L917
	mov	eax, DWORD PTR _prime_count$[ebp]
	add	eax, 1
	mov	DWORD PTR _prime_count$[ebp], eax
$L917:

; 23   :   }

	jmp	SHORT $L909
$L910:

; 24   : 
; 25   :   printf("prime_count = %d \n", prime_count);

	mov	ecx, DWORD PTR _prime_count$[ebp]
	push	ecx
	push	OFFSET FLAT:$SG918
	call	_printf
	add	esp, 8

; 26   : }

	xor	eax, eax
	mov	esp, ebp
	pop	ebp
	ret	0
_main	ENDP
_TEXT	ENDS
END

