|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3210 [º¹»ç]
;Amount of double words (32 bits each) that we will reserve
%define RESSIZE 10000000
;Uninitialized data goes in bss segment
segment .bss
;Reserve plenty of space for primes (38MB)
Primes resd RESSIZE
;Reserve space for answer
RetVal resd 1
;Code goes in the text section
segment .text
;global <procedure name>
global _asm_main lets C program "see" the procedure
;procedure start
_asm_main:
;setup routine
enter 0,0
;save register states for when we return to C
pusha
;indexer for prime number array
mov esi,0
;ebp-1 points to last found prime
mov ebp,0
;first prime given free
mov [Primes], DWORD 3
;set up to hold next prime
inc ebp
;find primes from 3 to X
mov ecx, DWORD 3
;outer loop
i:
;check that we haven't gone past max
cmp ecx,10000000
ja end
;clear "j" (inner loop)
mov esi,0
j:
;if we've gone past our current list of primes, we're prime
cmp esi,ebp
ja prime
;divide by previous prime
mov edx, 0
mov eax, ecx
div DWORD [Primes + (esi-1)*4]
;if we have no remainder, skip
cmp edx, 0
je next
;go to next prime
inc esi
jmp j
;Add new prime to list
prime:
mov [Primes + ebp * 4], ecx
inc ebp
next:
add ecx,2
jmp i
end:
mov eax,[Primes + (ebp-1)*4]
mov [RetVal],eax
;Get register states from before we ran procedure
popa
;return back to C
mov eax, [RetVal]
leave
ret
----------------------------------------------------------------------------
¿©±â±îÁö±¸¿ä. namsÀü¿ëÀ¸·Î ¸¸µå¾îÁø Äڵ絥 masmÀ¸·ÎÁ» ¹Ù²ãÁÖ¼¼¿ä~ºÎʵ右´Ï´Ù ¤Ì
ÁÖ¼®Àº ÇÊ¿ä¾ø¾î¿ä |
Hit : 4634 Date : 2011/11/15 08:23
|