ASM + CALL

    • Hätte jemand ein kleines Beispiel, wie man in Inline-Assembler
      eine XProfan-Funktion bzw. eine selbstdefinierte Proc
      aufruft ?

      Da die Assembler-Schleifen ja logischerweise sehr viel schneller als XProfans
      WhileLoop - Schleifen sind, bietet es sich ja an, das eine oder andere per
      Asm-Schleife zu erledigen.

      Quellcode

      1. Cls
      2. Set("ASMMode", 0)
      3. Asm "Schleife", 1
      4. PUSH EAX
      5. PUSH EBX
      6. PUSH ECX
      7. PUSH ESI
      8. MOV ECX,par1 'Unser Parameter, also 100 Millionen
      9. schleife:
      10. CALL AddString(0, "Hello")
      11. DEC ECX 'ecx=ecx-1
      12. JNZ schleife 'verzweige, wenn das zuletzt benutze Register (also ECX) nicht 0 ist
      13. 'MOV EAX,EBX
      14. POP ESI
      15. POP ECX
      16. POP EBX
      17. POP EAX
      18. EndAsm
      19. Schleife(100000)
      20. Print "fertig, Taste für Ende drücken...."
      21. Waitkey
      Alles anzeigen
      Interessieren würde mich, wie ich das CALL verwenden muß, bzw. wie auch Parameter,
      die die aufzurufende Proc erhält, zu behandeln sind.
    • Das ist leider so nicht möglich. XProfan-Befehle oder -Funktionen können nicht direkt per Assembler aufgerufen werden.

      Eigene XProfan-Prozeduren kannst Du jedoch mittels ProcAddr aufrufen. ProcAddr liefert ja eine Adresse zurück, die mittels CALL aufgerufen werden kann.

      Gruß
      Roland
      Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD / ATI Radeon HD4770 512 MB / Windows 7(32) - XProfan X3
      AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X3


      http://www.xprofan.de
    • Wie sähe das denn konkret aus ?

      Quellcode

      1. Cls
      2. Proc Tuwas
      3. Parameters String a
      4. Print a
      5. EndProc
      6. Set("ASMMode", 0)
      7. Asm "Schleife", 2
      8. PUSH EAX
      9. PUSH EBX
      10. PUSH ECX
      11. PUSH ESI
      12. MOV ECX,par1 'Unser Parameter, also 100 Millionen
      13. schleife:
      14. CALL(@pTuwas, par2)
      15. DEC ECX 'ecx=ecx-1
      16. JNZ schleife 'verzweige, wenn das zuletzt benutze Register (also ECX) nicht 0 ist
      17. 'MOV EAX,EBX
      18. POP ESI
      19. POP ECX
      20. POP EBX
      21. POP EAX
      22. EndAsm
      23. Var Pointer pTuwas = ProcAddr(Tuwas, 1)
      24. Schleife(10, "Hello")
      25. Listbox$("", 2)
      26. Print "fertig, Taste für Ende drücken...."
      27. Waitkey
      Alles anzeigen
    • Hallo,
      so kann das nicht gehen.
      1. Du musst auch die Adresse der Prozedur (pTuwas) als Parameter an die Assemblerroutine übergeben. Es sind also insgesamt drei Parameter.
      2. Du kannst in Assembler keine Klammern mit Parametern verwenden, sondern musst diese auf den Stack legen (siehe Messagebox-Beispiele).
      3. CALL @name geht hier nicht, da es ja keine importierte Funktion ist, sondern Aufruf der als Parameter übergebenen Adresse.

      Gruß
      Roland
      Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD / ATI Radeon HD4770 512 MB / Windows 7(32) - XProfan X3
      AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X3


      http://www.xprofan.de