Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[FASM] funkcja losująca numer

Ostatnio zmodyfikowano 2016-07-17 16:53
Autor Wiadomość
Szustarol
Temat założony przez niniejszego użytkownika
[FASM] funkcja losująca numer
» 2016-07-16 23:55:54
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
P-150053
pekfos
» 2016-07-17 12:48:08
Niczego nie robisz ze zwróconą wartością.

sub esp, 0x04; oznaczam :)
call [time]
Niezdefiniowane zachowanie.
P-150056
Szustarol
Temat założony przez niniejszego użytkownika
» 2016-07-17 13:40:19
co masz na myśli pisząc niezdefiniowane zachowanie i niczego nie zrobisz ze zwróconą wartością. Nie powinna być w EAX?
P-150060
pekfos
» 2016-07-17 13:44:01
1. Dokumentacja time().
2. No eax. Jednak jakim sposobem możesz teraz nie wiedzieć, co mam na myśli..?
call [time]
add esp, 0x04
mov EAX, [esp-0x04] ; Wartość zwrócona w eax.. już nie. Poza tym esp-4 nie jest już na stosie
P-150061
Szustarol
Temat założony przez niniejszego użytkownika
» 2016-07-17 15:04:14
co do eax juz poprawilem

"Funkcja zwraca » Dokumentacja ♦ czas lokalny w postaci » standard C ♦ time_t lub -1 w przypadku gdy wystąpił błąd. Jeśli argument jest ustawiony (różny od NULL) to czas lokalny jest również zapisywany do argumentu funkcji. "
opis z tej strony
time_t to liczba 32 bitowa więc nie rozumiem?
funkcja zwraca czas w sekundach od 1970 jako time_t ktory ma postac 32 bitowa wiec moze bez problemu byc zaladowany do zmiennej o dlugości double word
a moze jednak cos mi sie źle wydaje? jak popycham eax po wywolaniu funkcji zamiast zmiennej secondval do printf to mi normalnie wszystko dziala czyli wnioskuje ze pewnie po prostu źle przesuwam do zmiennej tą wartość, ale nie wiem czemu
P-150069
pekfos
» 2016-07-17 16:53:28
Jesteś ślepy na wskazówki. sub esp, 4 wrzuca na stos nieokreśloną wartość. Przekazujesz więc do time() niezainicjalizowany wskaźnik.
P-150071
« 1 »
  Strona 1 z 1