Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit "inline", "assembler" (https://www.delphipraxis.net/130606-problem-mit-inline-assembler.html)

Baeuerle 11. Mär 2009 07:48


Problem mit "inline", "assembler"
 
Hallo zusammen,

ich habe folgenden Code versucht unter Delphi2005 zu compilieren jedoch hängt der Compiler immer an der kommentierten Stelle mit der Fehlermeldung "E2029 Deklaration erwartet, aber ( gefunden". Ich habe leider keine Ahnung von Assembler in Delphi.

Vielleicht kann mir jemand sagen was ich umstellen muss damit die Befehlsfolgen funktionieren.

Thx
Baeuerle

Delphi-Quellcode:
unit UBlaBlub;

INTERFACE
uses Variants;

Const cArcTan=1;
      cCos  =2;
      cSin  =3;
      cLn   =4;
      cExp  =5;
      cSqr  =6;
      cSqrt =7;

var WriteErrorFlag:Boolean=true;
   
Type
 JumpRecord = record
               SpReg,            
               BpReg : Word;    
               JmpPt : Pointer;  
              end;

Var
 PCalcErrCode:Word;

Procedure SetJump (Var JumpDest: JumpRecord);
// Hier bleibt der Compiler mit der oben genannten Fehlermeldung hängen
inline($5F/                  {pop di          }
      $07/                   {pop es          }
      $26/$89/$25/           {mov es:[di],sp  }
      $26/$89/$6D/$02/       {mov es:[di+2],bp }
      $E8/$00/$00/           {call null       }
                             {null:           }
      $58/                   {pop ax          }
      $05/$0C/$00/           {add ax,12        }
      $26/$89/$45/$04/       {mov es:[di+4],ax }
      $26/$8C/$4D/$06);     {mov es:[di+6],cs }
                             {next:           }

Procedure LongJump (Var JumpDest: JumpRecord);
inline(
      $5F/                   {pop di          }
      $07/                   {pop es          }
      $26/$8B/$25/           {mov sp,es:[di]  }
      $26/$8B/$6D/$02/       {mov bp,es:[di+2] }
      $26/$FF/$6D/$04);     {jmp far es:[di+4]}

sirius 11. Mär 2009 07:58

Re: Problem mit "inline", "assembler"
 
Delphi-Quellcode:
Procedure SetJump (Var JumpDest: JumpRecord);
asm
  pop di
  pop es
  mov es:[di],sp
  mov es:[di+2],bp
  call @null
 @null:
  pop ax
  add ax,12
  ...
end;
Du kannst ASM ganz normal schreiben. Aber bedenke bitte, dass wir schon lange keinen 16bit-Prozessor mehr haben und zu dem einen linearen Addressraum. Dein code würde so nicht funktionieren.

Crashkurs

Hawkeye219 11. Mär 2009 10:19

Re: Problem mit "inline", "assembler"
 
Hallo,

wenn ich mich richtig erinnere, wurden SetJump und LongJump zu Zeiten von Turbo Pascal eingesetzt, um in der Fehlerbehandlung prozedurübergreifende Sprünge durchführen zu können. In modernen Sprachen würde man zu diesem Zweck Exceptions verwenden.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz