Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Assemblerprogramm in Delphi 7 einbinden


rpatsch - Do 16.11.06 20:01
Titel: Assemblerprogramm in Delphi 7 einbinden
Hallo alle zusammen,

ich habe ein Problem mit einem Assemblerprogrammaufruf. Folgender Delphicode ist vorhanden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
var
  Form1: TForm1;

implementation

{$R *.dfm}
{$L uppinneu.obj}

// Das Programm soll anhand der Vorgaben W_PC, W_KPROM
// einen 4stelligen PIN berechnen
// Die Berechnung wird durch das Assemblerfile uppinneu.asm durchgeführt
// In diesem Assemblerfile wird das Unterprogramm Pinneu aufgerufen

procedure TForm1.BitBtn2Click(Sender: TObject);
var W_PC, W_KPROM, W_VAR, W_PINCODE, S_ME_FE, W_HAENDLER : String;


begin
  W_PC := MaskEdit1.Text+MaskEdit2.Text+MaskEdit3.Text;
  W_KPROM    := MaskEdit4.Text;
  W_VAR      := '5';           // Konstante
  W_PINCODE  := '0000';        // Rückgabewert
  S_ME_FE    := '0';           // Konstante
  W_HAENDLER := '0';           // Konstante
  pinneu(var w_pc,w_kprom,w_var,w_pincode,s_me_fe,w_haendler:string); external;
  edit1.Text := w_pincode;
end;


Nach dem kompilieren wird mir der Fehler 55 Undefinierter Bezeichner:'pinneu' ausgegeben. Im Assemblerfile wird aber mit:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
memory segment public 'code'

       assume cs:memory,ds:memory,es:memory,ss:nothing

        public  pinneu

pinneu  proc    far                  ;Beginn der Procedure.

; Hier steht jetzt der Code

memory  ends
        end

die Procedure pinneu gestartet.
Kann mir jemand bei der Problemlösung helfen?

Viele Grüße aus Unterschleißheim
Rolf

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


Jakob Schöttl - Do 16.11.06 20:49

Ist bisschen schwer anzusehen. Setze bitte erstmal allen Quellcode in delphi-Tags (
außerdem kannst du auch in delphi assemlbercode schreiben

muss weg


Reinhard Kern - Fr 17.11.06 03:30
Titel: Re: Assemblerprogramm in Delphi 7 einbinden
user profile iconrpatsch hat folgendes geschrieben:
Hallo alle zusammen,

ich habe ein Problem mit einem Assemblerprogrammaufruf. Folgender Delphicode ist vorhanden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
var
  Form1: TForm1;

implementation

{$R *.dfm}
{$L uppinneu.obj}

// Das Programm soll anhand der Vorgaben W_PC, W_KPROM
// einen 4stelligen PIN berechnen
// Die Berechnung wird durch das Assemblerfile uppinneu.asm durchgeführt
// In diesem Assemblerfile wird das Unterprogramm Pinneu aufgerufen

procedure TForm1.BitBtn2Click(Sender: TObject);
var W_PC, W_KPROM, W_VAR, W_PINCODE, S_ME_FE, W_HAENDLER : String;


begin
  W_PC := MaskEdit1.Text+MaskEdit2.Text+MaskEdit3.Text;
  W_KPROM    := MaskEdit4.Text;
  W_VAR      := '5';           // Konstante
  W_PINCODE  := '0000';        // Rückgabewert
  S_ME_FE    := '0';           // Konstante
  W_HAENDLER := '0';           // Konstante
  pinneu(var w_pc,w_kprom,w_var,w_pincode,s_me_fe,w_haendler:string); external;
  edit1.Text := w_pincode;
end;


Nach dem kompilieren wird mir der Fehler 55 Undefinierter Bezeichner:'pinneu' ausgegeben. Im Assemblerfile wird aber mit:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
memory segment public 'code'

       assume cs:memory,ds:memory,es:memory,ss:nothing

        public  pinneu

pinneu  proc    far                  ;Beginn der Procedure.

; Hier steht jetzt der Code

memory  ends
        end

die Procedure pinneu gestartet.
Kann mir jemand bei der Problemlösung helfen?

Viele Grüße aus Unterschleißheim
Rolf

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt


Hallo,

du musst natürlich pinneu deklarieren (wie jede andere Prozedur auch), dort kommt auch "external" hin.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
implementation

procedure  pinneu(var w_pc,w_kprom,w_var,w_pincode,s_me_fe,w_haendler:string); external;

procedure TForm1.BitBtn2Click(Sender: TObject);
     var W_PC, W_KPROM, W_VAR, W_PINCODE, S_ME_FE, W_HAENDLER : String;



Gruss Reinhard


BenBE - Fr 17.11.06 09:41

Du kannst bei Delphi ASM-Sources direkt in den Delphi-Programmsource einbinden ...

Mit folgendem Source geht die direkte Einbindung von ASM-Source:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Procedure WinPin(var w_pc,w_kprom,w_var,w_pincode,s_me_fe,w_haendler:string);
asm
//  EAX         ==> W_PC:       PString;
//  EDX         ==> W_kprom:    PString;
//  ECX         ==> w_var:      PString;
//  [EBP + $04] ==> w_pincode:  PString;
//  [EBP + $08] ==> s_me_fe:    PString;
//  [EBP + $0C] ==> w_haendler  PString;
////EAX \ ST(0) <== Result      (void) // Bei Funktionen der Rückgabewert ...

{Source hier}

end;


Die externe Einbindung ist wie gezeigt mit {$L ASM.obj} und der External-Deklaration ...


rpatsch - Fr 17.11.06 14:41

Ich danke euch recht herzlich für die Info. Werde die Sache in den nächsten Tagen mal weiter untersuchen. Falls weitere Fragen auftauchen, melde ich mich wieder.
Nochmals vielen Dank für die schnelle Hilfe.

Rolf