57 lines
4.3 KiB
Text
57 lines
4.3 KiB
Text
(notonline)-->
|
|
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span> <span style="color: #000080;font-style:italic;">-- 1=failure, 0=success</span>
|
|
<span style="color: #004080;">atom</span> <span style="color: #000000;">rint</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- random 32-bit int</span>
|
|
|
|
#ilASM{
|
|
mov eax,1
|
|
cpuid
|
|
bt ecx,30
|
|
mov edi,1 -- exit code: failure
|
|
jnc :exit
|
|
|
|
-- rdrand sets CF=0 if no random number
|
|
-- was available. Intel documentation
|
|
-- recommends 10 retries in a tight loop
|
|
mov ecx,11
|
|
::loop1
|
|
sub ecx, 1
|
|
jz :exit -- exit code is set already
|
|
rdrand eax
|
|
-- (the above generates exception #C000001D if not supported)
|
|
-- rdtsc
|
|
jnc :loop1
|
|
|
|
lea edi,[rint]
|
|
call :%pStoreMint
|
|
xor edi,edi
|
|
|
|
::exit
|
|
mov [res],edi
|
|
xor ebx,ebx -- important!
|
|
}
|
|
|
|
<span style="color: #0000FF;">?{</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rint</span><span style="color: #0000FF;">}</span>
|
|
|
|
<span style="color: #008080;">if</span> <span style="color: #000000;">res</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000080;font-style:italic;">-- (success)
|
|
|
|
--
|
|
-- To convert a signed 32-bit int to an unsigned one:
|
|
--
|
|
-- method 1
|
|
-- atom urint1 = rint
|
|
-- if urint1<0 then urint1+=#100000000 end if</span>
|
|
<span style="color: #004080;">atom</span> <span style="color: #000000;">urint1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rint</span><span style="color: #0000FF;">+</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rint</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span><span style="color: #0000FF;">?</span><span style="color: #000000;">#100000000</span><span style="color: #0000FF;">:</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
|
|
|
<span style="color: #000080;font-style:italic;">-- method 2</span>
|
|
<span style="color: #004080;">atom</span> <span style="color: #000000;">pMem</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">allocate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">4</span><span style="color: #0000FF;">)</span>
|
|
<span style="color: #7060A8;">poke4</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pMem</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rint</span><span style="color: #0000FF;">)</span>
|
|
<span style="color: #004080;">atom</span> <span style="color: #000000;">urint2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">peek4u</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pMem</span><span style="color: #0000FF;">)</span>
|
|
<span style="color: #7060A8;">free</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pMem</span><span style="color: #0000FF;">)</span>
|
|
|
|
<span style="color: #000080;font-style:italic;">-- method 3</span>
|
|
<span style="color: #004080;">atom</span> <span style="color: #000000;">urint3</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">bytes_to_int</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">int_to_bytes</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rint</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">),</span><span style="color: #000000;">signed</span><span style="color: #0000FF;">:=</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
|
|
|
|
<span style="color: #0000FF;">?{</span><span style="color: #000000;">urint1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">urint2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">urint3</span><span style="color: #0000FF;">}</span>
|
|
|
|
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
|
<!--
|