2016-06-11 56 views
5

Ho un programma per Windows (exe) che è stato scritto in Delphi (Delphi 7 credo) diversi anni fa e quel programma è ancora usato occasionalmente. Contiene una variabile di tipo Singolo che viene moltiplicata per 0,9 ad un certo punto nel codice.Modifica del valore in virgola mobile in exe

Vorrei cambiare da 0,9 a 0,8 proprio nel file exe utilizzando un editor esadecimale e ho bisogno di aiuto per trovare la parte rilevante del codice da modificare.

La variabile è dichiarata come

private myValue: Single; 

e quando un pulsante viene premuto il valore di modifica di un componente viene impostato su Round (myValue * 0,9)

procedure MyForm.buttonClick(Sender: TObject); 
begin 
    if button.Down then 
    myEditComponent.EditValue := Round(myValue * 0.9); 
end; 

Il valore 0,9 viene utilizzato solo una volta in l'intero codice quindi ho pensato che fosse facile trovarlo. Ho appreso che la rappresentazione esadecimale di 0.9 come DWORD dovrebbe essere 0x3f666666 ma non ho trovato quel valore nel file exe.

Quindi è uno che ho torto e 0,9 è rappresentato con una stringa esadecimale diverso o il compilatore formulato questo calcolo in un modo diverso (come myValue * 9/10 o qualche altro modo) o ..

Prima suggerisci di ricompilare il progetto: ho il codice sorgente ma è un progetto grande con diverse dipendenze. Il codice si basa su librerie di componenti multipli e dozzine di componenti di terze parti. Potrebbero essere necessari un paio di giorni solo per ottenere e installare una vecchia versione di Delhi e registrare tutti i componenti per ricompilare il codice. Non qualcosa che mi piacerebbe fare per un piccolo cambiamento di un programma usato raramente.

Se avessi installato Delphi, scriverò semplicemente queste poche righe di codice e lo disassemblerò/eseguirò il debug per vedere il codice assembly. Avendo l'assemblea ho potuto capire cosa deve essere cambiato nel exe. Spero che qualcuno possa indicarmi la direzione giusta, quindi non devo installare una vecchia versione di Delphi.

+3

hai fatto ricerca di esso come 66 66 66 3f nel file? –

+0

0.9 non può essere rappresentato esattamente. Il singolo più vicino è infatti '0x3f666666'. Ma come puoi sapere che la costante è memorizzata come un singolo. Il modo più ovvio per risolvere questo problema è compilare il codice da soli e vedere cosa viene omesso. Prova questo. –

+0

@SamiKuhmonen Ho provato anche in questo modo perché non ero sicuro riguardo l'ordine dei byte. – tinform

risposta

9

Le costanti letterali del punto mobile vengono memorizzate come estese a 80 bit nelle versioni a 32 bit di Delphi.

Un valore 0,9 è memorizzato come 66 66 66 66 66 66 66 E6 FE 3F

Per 0,8 sostituirlo con CD CC CC CC CC CC CC CC FE 3F

+0

OK, ho trovato quella sequenza. Stranamente ho trovato due casi. Li cambierò uno per uno per vedere cosa succede. Devo connettere il programma al server del database per testare le modifiche e potrebbe volerci del tempo prima che avessi la possibilità di farlo. Se funziona (credo che accadrà) accetterò la tua risposta. – tinform