witam!
mam taki oto programik:
format PE console
entry start
include 'include/win32a.inc'
section '.text' code executable
start:
push secondval
call GETRANDOMNUMBER ;wywołanie do funkcji 'losującej numer'- a tak naprawde niczego nie losuje tylko zwraca czas maszyny
add esp, 0x04;. a przynajmniej tak powinno byc
push [secondval]
push intbuff
call [printf]
call [scanf]
ret
GETRANDOMNUMBER:
push EBP
mov ebp, esp
sub esp, 0x04; oznaczam :)
call [time]
add esp, 0x04
mov EAX, [esp-0x04]
mov [ebp+8], eax
mov esp,ebp
pop EBP
ret
section '.data' data readable writeable
intbuff db '%d', 0
secondval dd 0
section '.idata' data readable import
library msvcrt, 'msvcrt.dll'
import msvcrt, scanf, 'scanf', printf, 'printf', time, 'time'
chcę, żeby to mi zwracało losową liczbę- bez przedziału, ale ma ja zwracać do zmiennej podanej w argumencie, tak naprawdę wcale liczby nie losuje ale pobiera czas maszyny
tu pytanie, czemu ta funkcja za każdym razem zwraca zero?
pewnie by to działało gdyby to nie była funkcja ale mam wrażenie że coś robię nie tak wywołując tę funkcję
wyobrażam sobie że stos wygląda tak po jej wywolaniu, w miejscu sub esp, 0x04 - oznaczylem to miejsce komentarzem w kodzie:
[ebp + 0x08] argument podany do funkcji
[ebp + 0x04] adres powrotu
[ebp ]początek ramki
[ebp - 0x04]pierwsza zmienna lokalna, rezerwowana przez sub esp, 0x04- oznaczone w kodzie powyżej, call [time] skorzysta z tego miejsca na stosie, tzn. weźmie ebp - 0x04 jako argument
czy dobrze wyobrażam sobeie wygląd tego stosu? może coś pomyliłem?
poza tym, dlaczego funkcja zawsze zwraca zero?
aha, nadmieniam że nie mogę w programie użyć przerwań bios bo piszę pod 32 bity