Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

Dubbio float
(Questo messaggio è stato modificato l'ultima volta il: 18/11/2013, 15:10 da Cyanstack.)

Iscritto
Messaggi: 270
Discussioni: 40
Registrato: 10-2013
Reputazione:
0

Mix: 0
Ciao a tutti , oggi praticamente mi capita di vedere su ollydbg due programmi che non fanno niente e sono scritti così

    C++ Programming
  1. int main()
  2. {
  3. }


esce così : [Immagine: 03b11-cb8b7885-4d7a-4e96-b317-8e83976adbcf.png]
e l'altro

    C++ Programming
  1. float main()
  2. {
  3. }



[Immagine: 03b11-f18fa7ec-3695-41d3-9768-9e753ee4967f.png]

ora, su olly noto che in int c'è questa : XOR EAX , EAX invece scritta con il float non c'è, qualcuno sa il perché?
Ah poi ho provato anche con 1 byte(char) a fare la stessa cosa, e mi azzera lo stesso 1 registro però da 16 bit, perché con float non lo fa? Dovrebbe farlo, dovrebbe azzerare 1 registro da 32 bit?


17/11/2013, 18:47
#1
Cerca

1 Life, 1 Avatar <3
Messaggi: 9,074
Discussioni: 271
Registrato: 08-2011
Reputazione:
77

Mix: 0
Non ci capisco niente di assembly :C mi dispiace. digger ti saprà rispondere spero

17/11/2013, 21:05
#2
Cerca

Iscritto
Messaggi: 270
Discussioni: 40
Registrato: 10-2013
Reputazione:
0

Mix: 0
Girando nel web ho letto :

Codice:
Valori di tipo float sono restituiti nel registro ST0 del
coprocessore matematico


centra qualcosa con il mio problema?

18/11/2013, 13:22
#3
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 19/11/2013, 22:34 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Reputazione:
106

Mix: 3,737
certo che c'entra con il tuo problema.
Come hai giustamente trovato in internet nel caso di restituzione di float il valore viene messo (se già non ci sta in seguito a calcoli precedenti) nel registro ST0 (vedi anche lui in OllyDbg), è facile fare una verifica, invece di tornare float nel main (che in teoria dovrebbe tornare int) crea una nuova funzione, chessò, "funz1" che prende un float e torna un float e fagli fare un'operazione stupida, chessò raddoppia il parametro che gli passi.
Poi nel main chiama la funzione passandogli 10.0 e somma al risultato un 20.0 (tanto per fare un esempio) e quindi carica sto programma in ollydbg e metti un breakpoint sul return di funz1 e runnalo.
Vedrai che appena sei al breakpoint in ST0 ci sarà 20 (ovvero il 10 che gli passi moltiplicato per 2) se poi steppi per tornare al main e guardi cosa fa step by step vedrai che userà delle istruzioni tipo FADD per aggiungere a ST0 il 20 che hai nel main, a dimostrazione che ST0 contiene proprio il valore tornato dalla funzione funz1


digger
19/11/2013, 22:34
#4
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 20/11/2013, 13:04 da Cyanstack.)

Iscritto
Messaggi: 270
Discussioni: 40
Registrato: 10-2013
Reputazione:
0

Mix: 0
Grazie per la risposta digger Smile
Solo una cosa , ho fatto il programma come mi hai detto :
    C++ Programming
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. float Funzione ( float param )
  5. {
  6. return (param*2);
  7. }
  8. int main ( )
  9. {
  10. float var1 = Funzione(10.0);
  11. var1 = var1 + 20.0;
  12. //cout << var1 << endl;
  13. //system("pause");
  14. }



Su olly , come hai detto tu , vedo che il registro ST viene usato da FADD etc.. e fin qui ci siamo, ora una cosa che non c'entra quasi nulla , quando provo a mettere un breakpoint e lo runno mi porta sempre in un altro modulo, precisamente qui : [Immagine: 03b14-abfcbbb2-1cbe-4d09-9602-e880e3b71868.png]
ho provato anche con altri programmi..

20/11/2013, 12:58
#5
Cerca


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Piccolo Dubbio Cyanstack 3 502 29/10/2013, 0:25
Ultimo messaggio: digger
  [Guida] Conversione float<->int (UNION) digger 9 1,082 23/06/2012, 15:02
Ultimo messaggio: Marchrius
  [Guida] C/C++ Conversione INT->FLOAT (puntatori) digger 18 2,714 26/07/2011, 13:57
Ultimo messaggio: [email protected]



Utenti che stanno guardando questa discussione: 1 Ospite(i)