Challenge #20
Let’s do challenge #20, because #19 it’s quite tricky will have it as a WIP 😅. Challenge #20 can be found on the original website. Here is the assembly code to understand
f4:
.LFB40:
sub rsp, 8
call rand
;; convert rand generated number to int
cvtsi2ss xmm0, eax
mulss xmm0, DWORD PTR .LC0[rip]
add rsp, 8
ret
.LC0:
.long 805306368
According to the description we are dealing here with floating point numbers. Let’s start the analysis of it.
Analysis
We first have a call to rand to generate a random number, followed by an instruction cvtsi2ss which convert the generated random number into floating number. Later we compute the r * 4.656612873077392578125E-10, where r is our recently generated rand number. The code in C would be
float f(void)
{
return float()rand() * 4.656612873077392578125E-10;
}
Yes, you noticed right? I multiplied by 4.656612873077392578125E-10 instead of 805306368, for understanding that you should read Wikipedia IEEE_754 article. Also this online converter will help you, if you supply the hex representation of 805306368, which is 0x30000000 you will get 4.65661287308e-10.
Given that rand will give us a random number from [0, RAND_MAX], RAND_MAX in my OS has value 2147483647, this operation will give us values from [0, 0.9999999995348987]. One thing missing in this code is the seed of rand function, so it will be always evaluated with seed 1.
Formal description
Generate numbers from 0 to 1.