AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Inline Asm Problem

Ein Thema von JnZn558 · begonnen am 8. Mär 2010 · letzter Beitrag vom 10. Mär 2010
Antwort Antwort
Seite 1 von 3  1 23      
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#1

Inline Asm Problem

  Alt 8. Mär 2010, 01:52
das is mein code, compiliere tut es, nur es kratz ab, und ich weiss net was falsch is. uebrigens hab ich delphi 2009
Delphi-Quellcode:
unit inlineasm;

interface

type

  TAsm = class
    m_strAsm: string;

  public
    constructor Create;
    property Text: string read m_strAsm;
  end;

implementation

  constructor TAsm.Create;
  begin
    asm
      push edx
      @str: db 'Hello World', $0
      lea edx, @str
      mov TAsm[eax].m_strAsm, edx
      pop edx
    end;
  end;

end.
Peace on the world
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Inline Asm Problem

  Alt 8. Mär 2010, 04:44
Willste dir damit ne Medallie für die beste Fehlerbeschreibung 2010 verdienen?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Inline Asm Problem

  Alt 8. Mär 2010, 05:43
Hallo,

wo genau stürzt er ab ?

Ich schätze mal, hier

mov TAsm[eax].m_strAsm, edx

TAsm.m_strAsm gibt es so nicht.
Bei m_strAsm handelt es sich nicht um eine Klassen-Variable.

Entweder das TAsm ganz weglassen,
oder falls es geht, durch Self ersetzen.

Die Zeiten von Assembler sind übrigens (fast) vorbei,

Und so mit String zu hantieren.
ist eh gefährlich.
Du weisst schon, dass ein String ein Zeiger (PChar) ist,
der "initialisiert" werden muss (SetLength).

Und wenn jetzt einer sagt, dass muss man nicht in Delphi,
wir reden hier von Assembler ...


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#4

Re: Inline Asm Problem

  Alt 8. Mär 2010, 08:27
@str: db 'Hello World', $0 - ergibt einen AnsiText also PAnsiChar
- String ist aber seit D2009 ein UnicodeString
- ein String hat eine bestimmte intere Struktur, welche viel mehr besitzt, als nur den Teil, welche rpraktischer Weise fast wie ein PChar aussieht.
Und diese Struktur hast du nicht mit erstellt, sondern du trägst einfach nur den PChar-Zeiger in den "String" ein
- selbst wenn du die Stringstruktur ordnungsgemäß erstellt hättest und der Text auch noch als Unicode vorhanden wäre, gäbe es immernoch ein Speicherleck, da ein eventuell vorher in m_strAsm liegender String nicht freigegeben würde.
- in EAX ist an soeiner Stelle nicht immer der Self-Pointer, vorallem nicht, da hierbei davor noch die Klasseninitialisierung durchgeführt wird, so daß TAsm[eax] vermutlich nicht auf Self zeigt.
[add]
- jupp, das von Neutral General genannte kommt dann auch noch mit dazu

Fazit: solange du keine Ahnung hast, was du da überhaupt machst und wie gewisse Datentypen intern arbeiten ... laß die Finger von sowas,
dazumal es hierbei garkeinen Grund gibt, sowas via ASM lösen zu wollen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Inline Asm Problem

  Alt 8. Mär 2010, 08:34
Ich denke mal das größte Problem ist, dass die Zeile

@str: db 'Hello World', $0 Vom Prozessor als Code ausgeführt wird. Und was für ein AssemblerCode sich hinter 'Hello World' versteckt weiß erstmal niemand
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#6

Re: Inline Asm Problem

  Alt 8. Mär 2010, 15:07
Zitat von Neutral General:
Ich denke mal das größte Problem ist, dass die Zeile

@str: db 'Hello World', $0 Vom Prozessor als Code ausgeführt wird. Und was für ein AssemblerCode sich hinter 'Hello World' versteckt weiß erstmal niemand
ich hatte auch mal gedacht, das problem tritt vl bei unicode auf, also hatte ich auch so geaendert

@str: dw 'Hello World', $0 aber leider weigert der compiler hier die arbeit
Peace on the world
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#7

Re: Inline Asm Problem

  Alt 8. Mär 2010, 15:14
Zitat von JnZn558:
@str: dw 'Hello World', $0 aber leider weigert der compiler hier die arbeit
Tja, dann mag halt DW diese Parameter einfach nicht?
einfache Lösung: gibt die Buchstaben einzeln an und wandle sie notfalls in "Integer"/Word um.

Aber egal, da der Rest des Codes sowieso nicht funktionieren kann.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Inline Asm Problem

  Alt 8. Mär 2010, 15:15
Falls es daran liegt, hast du mal probiert, die entsprechende Stelle einfach mithilfe eines JMP-Befehls zu überspringen?
Delphi-Quellcode:
push edx
jmp @code
@str: db 'Hello World', $0
@code:
lea edx, @str
mov TAsm[eax].m_strAsm, edx
pop edx
Ansonsten würde es sicherlich helfen, einen Breakpoint zu setzen und im CPU-Fenster mit F7 durchzusteppen.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#9

Re: Inline Asm Problem

  Alt 8. Mär 2010, 15:16
Zitat von JnZn558:
Zitat von Neutral General:
Ich denke mal das größte Problem ist, dass die Zeile

@str: db 'Hello World', $0 Vom Prozessor als Code ausgeführt wird. Und was für ein AssemblerCode sich hinter 'Hello World' versteckt weiß erstmal niemand ;-)
ich hatte auch mal gedacht, das problem tritt vl bei unicode auf, also hatte ich auch so geaendert

@str: dw 'Hello World', $0 aber leider weigert der compiler hier die arbeit
Damit ist gemeint, daß die CPU die Bytes des Strings als OPCodes interpretiert. Die Mindestforderung für Nichtabsturz ist, daß Du einen Sprung über den String machst:
Delphi-Quellcode:
begin
    asm
      push edx
      jmp @@skip
      @str: db 'Hello World', $0
    @@skip:
      lea edx, @str
      mov TAsm[eax].m_strAsm, edx
      pop edx
    end;
end;
  Mit Zitat antworten Zitat
JnZn558

Registriert seit: 22. Aug 2004
98 Beiträge
 
#10

Re: Inline Asm Problem

  Alt 8. Mär 2010, 16:18
Delphi-Quellcode:
unit inlineasm;

interface

type

  TAsm = class
    m_strAsm: string;

    function ShowText: AnsiString;
  public
    constructor Create;
    property Text: AnsiString read ShowText;
  end;

implementation

  constructor TAsm.Create;
  begin
  end;

  function TAsm.ShowText;
  begin
    asm
      push edx
      jmp @@skip
      @str: db 'Hello World', $0
    @@skip:
      lea edx, @str
      mov TAsm[eax].m_strAsm, edx
      pop edx
    end;
  end;

end.
Delphi-Quellcode:
program Project;

uses SysUtils, Dialogs, inlineasm;

var
  Test: TAsm;
begin
  try
    Writeln('Text: ' + Test.Text); // hier soll der fehler sein, hier stopp debugger, und gibt mit I/O error 105
    Readln;
  except
    on E:Exception do
    Writeln(E.Classname, ': ', E.Message);
  end;
end.
Zitat:
Project Project.exe raised exception class EInOutError with message 'I/O error 105'.
Peace on the world
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 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