isPrime() number example:
// isprime.d
/+
' A assembly example for returning whether any
' number between 0 to 4294967295 is prime number.
+/
module primeutil;
private import std.stdio;
// comment out the below statement to hide the main() function.
debug = isprime;
bool isPrime( in uint uiNum )
{
uint uiIsPrime = false;
asm
{
// load in the uint number to check
mov EAX,[ uiNum ];
// 0 and 1 are valid values,
// but neither are a prime number.
mov EDX,EAX;
cmp EDX,1;
jbe _notprime; // if 0 or 1 return false
// since 2 will be used as the divisor below
cmp EDX,2;
je _prime; // if EDX == 2 then goto _prime (true)
mov EDX,0; // reset EDX = 0
// setup the loop counter
mov ECX,EAX; // ECX = EAX
shr ECX,1; // ECX = ECX / 2
mov EBX,2; // first divisor is EDX = 2
_next:
// start block, is EAX divisible by EBX?
push EAX;
push EDX;
mov EDX,0;
div EBX;
cmp EDX,0;
pop EDX;
pop EAX;
// end block, is EAX divisible by EBX?
jz _notprime; // if EDX == 0 then (EAX is divisible by EBX) goto _notprime
inc EBX; // next divisor equals EBX = EBX + 1
// start loopd block
dec ECX; // ECX = ECX - 1
cmp ECX,0;
jnz _next; // if ECX (counter) <> 0 the loop back to _next
// end loopd block
_prime: // is a prime, so set EAX to true (1).
mov EAX,1;
jmp _exit;
_notprime: // is not a prime, so set EAX to false (0).
mov EAX,0;
jmp _exit;
_exit:
mov [ uiIsPrime ],EAX;
}
return ( uiIsPrime == 0U ? false : true );
}
debug( isprime )
{
int main()
{
uint uiy = 0U;
writefln( "All the numbers listed below between 0 to 1000 are Primes!" );
for ( uint uix = 0U; uix <= 1000U; uix++ )
{
if ( isPrime( uix ) == true )
{
writef( "%4d, ", uix );
uiy++;
if ( ( uiy % 10U ) == 0U )
{
uiy = 0U;
writefln();
}
}
}
return 0;
} // end int main()
}
C:\dmd\MKOD_ex>..\bin\dmd isprime.d
C:\dmd\bin\..\..\dm\bin\link.exe isprime,,,user32+kernel32/noi;
C:\dmd\MKOD_ex>isprime
All the numbers listed below between 0 to 1000 are Primes!
2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
73, 79, 83, 89, 97, 101, 103, 107, 109, 113,
127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
467, 479, 487, 491, 499, 503, 509, 521, 523, 541,
547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
607, 613, 617, 619, 631, 641, 643, 647, 653, 659,
661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
739, 743, 751, 757, 761, 769, 773, 787, 797, 809,
811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
947, 953, 967, 971, 977, 983, 991, 997,
C:\dmd\MKOD_ex>