<div dir="ltr">today I did an experiment that gave me surprising results (due to my ignorance,<br>of course).<br><br>I have an application written in Lazarus and I need to do one fix only.<br><br>This line<br><br>   result:=EncodeDate(<br>   cmbYear.ItemIndex+2005,<br>   cmbMonth.ItemIndex+1,<br>   1);<br><br><br>needs to be changed into<br><br><br>   result:=EncodeDate(<br>   cmbYear.ItemIndex+2006,<br>   cmbMonth.ItemIndex+1,<br>   1);<br><br><br>I thought it would be easy to use an hex editor like PSPad hex, find the number<br>2005 as 07D5 then fix it (maybe after the right guess in case of multiple hits).<br><br>To my surprise, I could not find the word 07D5. As I vaguely remember the<br>big endian/little endian question, I tried to look for D507: no hit.<br><br>In order to dig into the question, I created a Lazarus windows application<br>made of a TCombobox and a TButton. I used v. 2.0.6 on windows 7.<br><br>I added the following code:<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>   a:string;<br>   i:integer;<br>begin<br>   cmbYear.Items.Add('2020');<br>   cmbYear.Items.Add('2021');<br>   Caption:='peppe';<br>   i:=cmbYear.ItemIndex+2005;<br>   Caption:=inttostr(i);<br>end;<br><br>I compiled/linked that application then opened the EXE using PsPad Hex.<br><br>Looking for string 'peppe', I can easily spot the part that contains<br>the code of interest.<br><br>Please see here for a screenshot of PsPad Hex:<br><a href="https://i.ibb.co/2M054Qx/1.jpg">https://i.ibb.co/2M054Qx/1.jpg</a><br><br>(I encircled a few familiar names).<br><br>I cannot understand how this instruction<br><br>   i:=cmbYear.ItemIndex+2005;<br><br>is coded here.<br><br>I am no assembly expert, but I expect that the compiler would translate the instruction into something like<br><br>move 2005 to register X<br>add register X to register Y     (where register Y represents cmbYear.ItemIndex)<br>move register Y to register Z    (where register Z represents var i)<br><br>In any case I would expect that the figure 2005 (07D5) be written somewhere,<br>but facts prove me wrong.<br><br>I am very curious: what really happens in the EXE?<br><br>In which form gets this instruction compiled?<br>   i:=cmbYear.ItemIndex+2005;<br><br>Could someone explain?<br><br>Thank you<br><br>Peppe<br><br></div>