Voici un problème concernant un programme tres simple utilisant l'Assembleur en ligne sous
Delphi 6.
Dans l'exemple n°1, "gogo" et "toto" sont incrémentés a chaque click, pas de problème !
dans l'exemple n°2, "gogo" est toujours incrémenté, mais "toto" ne l'est PLUS !!!
Pourquoi ????
Ce problème est plus compliqué qu'il n'y parrait. Les réponses simples ne suffiront pas ... dommage ! hi
Je passe l'adresse de "toto" a la procédure "Robby" et dans cette procédure, j'utilise bien entendu l'adressage indexé pour atteindre "toto" ... avec "indic" son adresse.
Allez voir le code résultat généré par le compilateur dans ces deux cas ... vous allez comprendre qu'il y a un problème. Dans le 2eme ca, le compilateur génère un code dans lequel l'adressage indexé ne fonctionne plus ... aucune erreur a la compilation, mais le programme ne fonctionne plus ! toto n'est plus incrémenté !!! Celui qui connait la syntaxe pour retrouver un code compilé correcte dans l'exemple 2, ... c'est un AS ! Je ne parle pas de "transformer" ... pour "y arriver quand meme" ... mais de conserver le prog . comme il est et de le faire fonctionner ... car ... ce prog. (exemple 2) est tout a fait correcte ! je prétend qu'il y a ici un réel soucis au niveau du compilateur ! amicalement a tous et toutes ...
------------------- Exemple n°1 -------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure buttonclick1(Sender: TObject);
procedure FormCreate (Sender: TObject);
end;
var
Form1: TForm1;
toto : byte ;
gogo : byte ;
implementation
{$R *.dfm}
{==================================================== Procédure Robby n°1 }
procedure robby (var indic:byte);
asm
inc byte [indic]
end;
{==================================================== Robby n°1 "end" }
procedure TForm1.FormCreate(Sender: TObject);
begin
toto := 0;
gogo := 0;
end;
procedure TForm1.buttonclick1(Sender: TObject);
begin
robby(toto);
gogo := gogo + 1 ;
Edit1.Text := IntToStr(toto)+' '+IntToStr(gogo);
end;
end.
----------- Exemple n° 2 ---------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure buttonclick1(Sender: TObject);
procedure FormCreate (Sender: TObject);
end;
var
Form1: TForm1;
toto : byte ;
gogo : byte ;
implementation
{$R *.dfm}
{==================================================== Procédure Robby n°2 }
procedure robby (var indic:byte);
begin
gogo := gogo + 1 ;
asm
inc byte [indic]
end;
end;
{==================================================== Robby n°2 "end" }
procedure TForm1.FormCreate(Sender: TObject);
begin
toto := 0;
gogo := 0;
end;
procedure TForm1.buttonclick1(Sender: TObject);
begin
robby(toto);
Edit1.Text := IntToStr(toto)+' '+IntToStr(gogo);
end;
end.