Autor Beitrag
reQuiem
Hält's aus hier
Beiträge: 13

Ubuntu 8.04 Hardy, XP Pro (VM :P)
Turbo Delphi 2006, C++, C#, Java, Ruby, PHP, HTML, CSS, JS (Eclipse, Gedit)
BeitragVerfasst: Mi 26.11.08 00:12 
Der Titel sagt eigentlich schon alles. Folgendes will nicht funktionieren, ebensowenig wie Variationen von Writeln (WritLn, writeln etc.). Was muss ich tun?

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
begin
  a := 10;
  asm
      push a
      call @Writeln
  end;
  readln;
end.


Gruß,
Niklas
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 26.11.08 00:36 
Schau dir mal diesen Beitrag an, die ersten drei Parameter einer Funktion oder Prozedur werden nicht in den Stack gelegt sondern in EAX, EDX und ECX abgelegt, erst wenn es mehr als 3 sind landen die auf dem Stack.
www.delphipraxis.net...ic94005,0,asc,0.html
Du musst also statt push den Parameter in eax legen, allerdings ist Writeln glaube ich keine irgendwo definierte Funktion sondern Compilermagic, du müsstest das also wenn dem so ist außerhalb des Assemblercodes aufrufen glaube ich.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 26.11.08 13:54 
Man muss in diesem Fall die Compiler MAgic nachbilden. Hab ich letztens erst gesagt, welche Funktionen es da gibt (siehe Forensuche) und dann entsprechend machen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mi 26.11.08 20:13 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
... allerdings ist Writeln glaube ich keine irgendwo definierte Funktion sondern Compilermagic, du müsstest das also wenn dem so ist außerhalb des Assemblercodes aufrufen glaube ich.


Hallo,

falls es etwas nicht als linkbare Prozedur gibt, kann man ja immer so ähnlich kapseln:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure WriteLn4ASM (out : file; txt : string);
begin
Writeln (out,txt);
end;


und in Assembler dann WriteLn4ASM aufrufen.

Gruss Reinhard
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 26.11.08 20:34 
Man kann WriteLn durchaus mit ASM aufrufen, bedarf aber etwas mehraufwand, da man sich die benötigten Dinge erst selber zusammensuchen muss. Ggf. einfach mal schauen, wie das im CPU-Fenster aussieht und dass dann entsprechend so anpassen, dass es mit den Werten\Aufrufnahmen für die Compiler Magic Funktionen stimmt.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
reQuiem Threadstarter
Hält's aus hier
Beiträge: 13

Ubuntu 8.04 Hardy, XP Pro (VM :P)
Turbo Delphi 2006, C++, C#, Java, Ruby, PHP, HTML, CSS, JS (Eclipse, Gedit)
BeitragVerfasst: Mi 26.11.08 21:14 
Danke für eure Tipps und Infos! Habt mir sehr geholfen :)