So I'm learning assembly, and I found this code:
; Initialized seed value
xor [myseed], esp
; Generate random string
call randletter
mov [message], al ; Write 1st letter
; myrand gives a pseudo-random number in range 0..max
; inputs:
; edi - max value
; outputs:
; eax - generated value
myrand: mov eax, [myseed] ; Load state of generator
mov ecx, 4000000001
mul ecx ; Multiply state var by a constant
add eax, 3333333333 ; Add another constant
mov [myseed], eax ; And save the result
xor edx, edx
inc edi
div edi ; Divide state var in edx:eax by (max+1) in edi
mov eax, edx ; div instruction writes remainder into edx, so copy to eax
ret
; randletter gives a random lowercase letter
; inputs: no
; outputs:
; al - random lowercase letter (ASCII code)
randletter:
mov edi, 25
call myrand
add al, 'a'
ret
section .data
myseed: dd 123456789
Now I know that, this is linear congruential generator in the method myrand.
My question is how the number from myrand can cause the number from 97 to 122 in ASCII in randletter? And why they have add al, a in myrand. How can that help?
UPDATE 1: I added more to the code for clearer view
Aucun commentaire:
Enregistrer un commentaire