Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Inline Asm Problem (https://www.delphipraxis.net/148776-inline-asm-problem.html)

Blup 8. Mär 2010 16:39

Re: Inline Asm Problem
 
Ist auch kein Wunder, eine Stringvariable ist ein Zeiger auf eine etwas kompliziertere Struktur.
Insbesonder gehören dazu Integer für Größe des reservierten Speicher, Referenzzähler, Länge und die Zeichen selbst.
Schreib einfach mal in Delphi was die Funktion machen soll und schau das Ergebnis im CPU-Fenster an.

DeddyH 8. Mär 2010 16:42

Re: Inline Asm Problem
 
Abgesehen davon wird Test überhaupt nicht instanziert.

guinnes 8. Mär 2010 17:13

Re: Inline Asm Problem
 
Dazu wird dein Functionsergebnis nicht ( wie sonst üblich ) in EAX zurückgegeben

gammatester 8. Mär 2010 17:16

Re: Inline Asm Problem
 
Zitat:

Zitat von JnZn558
Zitat:

Project Project.exe raised exception class EInOutError with message 'I/O error 105'.

{$apptype console} fehlt für writeln!

JnZn558 8. Mär 2010 20:50

Re: Inline Asm Problem
 
Zitat:

Zitat von gammatester
Zitat:

Zitat von JnZn558
Zitat:

Project Project.exe raised exception class EInOutError with message 'I/O error 105'.

{$apptype console} fehlt für writeln!

jo, das is es, was zum absturz macht, danke

Zitat:

Zitat von DeddyH
Abgesehen davon wird Test überhaupt nicht instanziert.

achja, Delphi, vergiss ich fast immer, komme von C++, so es is kein absturz mehr da, aber es zeigt auch nichts an.

Delphi-Quellcode:
program Project;

{$apptype console}

uses SysUtils, Dialogs;

function ShowText: string;
begin
  asm
      jmp @start
      //str = 'Hello World', 0
      // alle zeichen hab ich in ascii umgewandelt
      // und so word also 16 bit unicode zu erzeugen
      // dachte ich
      @str: dw 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 0
      @start:
      lea eax, @str
  end;
  ShowMessage(Result);
end;

begin
  try
    Writeln('Text: ' + (ShowText));
    Readln;
  except
    on E:Exception do
    Writeln(E.Classname, ': ', E.Message);
  end;
end.

himitsu 8. Mär 2010 21:20

Re: Inline Asm Problem
 
Zitat:

Zitat von JnZn558
aber es zeigt auch nichts an.

Dir wurde schon mehrmals gesagt, daß ein String eine komplexere interne Struktur besitzt ... das kann so einfach nichts werden.

Außerdem ist das EAX nur in Bezug auf das Funktionsende das Result, aber Strings und dynamiache Arrays sind kein Result, sondern werden als Parameter übergeben ... das Ganze ist also eine Prozedur mit einem VAR-Parameter für den String ... ergo, du kannst nicht einfach via EAX so das Result zuweisen, da
A) String ... also steckt Result wo anders und
B) liegt nach deinem ASM-Block nicht das Funktionsende.

Schau dir bitte erstmal genauer an, wie das mit den Funktionsparametern, dem Result, speziell auf Methoden bezogen und vorallem wie das mit dem String genau funktioniert, bevor hier noch mehr "gefährlicher Code entsteht.

eine eingache Lösung:
Delphi-Quellcode:
function ShowText: PWideChar;
asm
  lea eax, @str
  ret
  @str:
  dw 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 0
end;

JnZn558 8. Mär 2010 21:35

Re: Inline Asm Problem
 
ich hab nun endlich geschafft

Delphi-Quellcode:
program Project;

{$apptype console}

uses SysUtils, Dialogs;

function ShowText: PChar;
begin
  asm
      jmp @start
      @str: dw 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 0
      @start:
      lea eax, @str
      mov Result, eax;
  end;
end;

begin
  try
    Writeln('Text: ' + ShowText);
    Readln;
  except
    on E:Exception do
    Writeln(E.Classname, ': ', E.Message);
  end;
end.

JnZn558 8. Mär 2010 21:40

Re: Inline Asm Problem
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von JnZn558
aber es zeigt auch nichts an.

Dir wurde schon mehrmals gesagt, daß ein String eine komplexere interne Struktur besitzt ... das kann so einfach nichts werden.

Außerdem ist das EAX nur in Bezug auf das Funktionsende das Result, aber Strings und dynamiache Arrays sind kein Result, sondern werden als Parameter übergeben ... das Ganze ist also eine Prozedur mit einem VAR-Parameter für den String ... ergo, du kannst nicht einfach via EAX so das Result zuweisen, da
A) String ... also steckt Result wo anders und
B) liegt nach deinem ASM-Block nicht das Funktionsende.

Schau dir bitte erstmal genauer an, wie das mit den Funktionsparametern, dem Result, speziell auf Methoden bezogen und vorallem wie das mit dem String genau funktioniert, bevor hier noch mehr "gefährlicher Code entsteht.

eine eingache Lösung:
Delphi-Quellcode:
function ShowText: PWideChar;
asm
  lea eax, @str
  ret
  @str:
  dw 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 0
end;

danke sehr, dieser code gefaellt mir sehr gut. vielen dank fuer die muehe und hilfen an alle beteiligten

Namenloser 8. Mär 2010 21:50

Re: Inline Asm Problem
 
Darf man fragen, wozu das ganze?
Delphi-Quellcode:
function ShowText: PWideChar;
const
  str: WideString = 'Hello World!';
begin
  Result := PWideChar(str);
end;
Das sollte doch genau so funktionieren und ist deutlich lesbarer.

guinnes 9. Mär 2010 07:36

Re: Inline Asm Problem
 
Zitat:

Zitat von NamenLozer
Das sollte doch genau so funktionieren und ist deutlich lesbarer.

Und schneller


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 Uhr.
Seite 2 von 3     12 3      

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