[Pascal/Delphi] Einbinden in Hochsprachen [Assembler]

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Pascal/Delphi] Einbinden in Hochsprachen [Assembler]

    Abend,

    Also ich brauche ein bissel Hilfe... Muss ein Präsentation über Einbinden von Assembler in Hochsprachen halten. Da ich nur PHP und MySQL liebe, natürllich fremdes Land


    Hier habe ich Pascal Code (ohjeee)


    {Es folgen die externen Funktionen und Prozeduren:}
    PROCEDURE Cursor_Setzen; EXTERNAL;
    PROCEDURE Bildschirm_Loeschen(Loeschzeichen: Char; Farbe: Byte); EXTERNAL;
    FUNCTION Hole_Taste:Char; EXTERNAL;
    PROCEDURE Schreib(X, Y, Farbe: BYTE; Str: STRING); EXTERNAL;
    {$L ASTEST.OBJ} {Anweisung an Compiler: Hier sind die Prozeduren zu finden.}
    Also es werden prozeduren aufgerufen, die in der ASTEST.OBJ sind!
    An EXTRERNAL sehe ich, dass es sich um Extere Prozeduren handelt


    Aber dann auf einmal wird statt Procedure ne Function verwendet warum? (wäre der Assembler code hilfreich?)

    Dann wird in die Funktionen auch noch was übergeben

    Schreib(X, Y, Farbe: BYTE; Str: STRING);
    Wie genau ist da die Syntax? Und die Wörter Farbe und Str, woher kommen die her? und ist das eine übergabe an den Stapel oder an ein Register?


    Danke gruss Sebastian

  • #2
    Aber dann auf einmal wird statt Procedure ne Function verwendet warum?
    Procedures sind Funktionen ohne Rückgabewert. Functions sind Funktionen mit Rückgabewert - und müssen deshalb auch gleich deklariert werden (In deinem Fall ein 1-Byte-Char).

    Procedures und Functions ohne Parameter brauchen - anders als in PHP - kein angehängtes ().

    Die Übergabewerte in der Schreib-Funktion sind ganz normale Parameter-Deklarationen, wie in PHP auch - nur, wie es sich für eine anständige Hochsprache gehört, eben mit Typdeklaration. Drei Bytes und ein String.

    Mit Assember, Stapeln und Registern hat das erstmal gar nix zu tun. In der .OBJ-Datei liegt halt die implementation der hier angekündigten Funktionen.

    Kommentar


    • #3
      Original geschrieben von pekka
      Procedures sind Funktionen ohne Rückgabewert. Functions sind Funktionen mit Rückgabewert - und müssen deshalb auch gleich deklariert werden (In deinem Fall ein 1-Byte-Char).

      Procedures und Functions ohne Parameter brauchen - anders als in PHP - kein angehängtes ().

      Die Übergabewerte in der Schreib-Funktion sind ganz normale Parameter-Deklarationen, wie in PHP auch - nur, wie es sich für eine anständige Hochsprache gehört, eben mit Typdeklaration. Drei Bytes und ein String.

      Mit Assember, Stapeln und Registern hat das erstmal gar nix zu tun. In der .OBJ-Datei liegt halt die implementation der hier angekündigten Funktionen.
      wow danke, das hat mir schon gut geholfen

      Das die deklariert werden, hab ich mir gedacht, da ich Grundketnisse in C, VB und Delphi hab (aber nur Grund grund grund) *G*

      aber wenn ich mir mal anschaue

      Bildschirm_Loeschen(Loeschzeichen: Char; Farbe: Byte);
      Dann wird Loeschzeichen als Char und Farbe als Byte deklariert richtig? aber wieso wird das gemacht, das taucht nirgends mehr auf dieses "Loeschzeichen"

      hab mal die Funktion zum Bildschirm Löschen

      BILDSCHIRM_LOESCHEN:
      ; schreibt den Bildschirm (25 Zeilen zu 80 Zeichen)
      ; mit dem bergebenen Löschzeichen in bergebener Farbe.
      push BP ; BP sichern
      mov BP,SP ; Basiszeiger "verankern"
      mov AX,0B800 ; ES auf Bildschirmsegment
      mov ES,AX ; einstellen
      mov AL,[BP+6] ; bergebenes Lösch-Zeichen nach AL einlesen
      mov AH,[BP+4] ; bergebene Farbe nach AH einlesen
      mov CX,80*25 ; Zahl der Bildschirmzeichen
      cld ; Richtung auf "Vorwärts"
      xor DI,DI ; beim ersten Bildschirmzeichen anfangen
      rep stosw ; alles berscheiben
      pop BP ; BP restaurieren
      ret 4
      Ist dieser BP (Basepointer oder so?) eigentlich wichtig für die Implementierung in Pascal?

      Dankööö für die gute Hilfe

      Kommentar


      • #4
        Original geschrieben von Sebastian.J
        Dann wird Loeschzeichen als Char und Farbe als Byte deklariert richtig? aber wieso wird das gemacht, das taucht nirgends mehr auf dieses "Loeschzeichen"
        Jedenfalls nicht mehr mit dem namen. Auf assembler ebene
        existieren diese namen nicht. Variablennamen sind nur vor
        dem kompilieren für den programmierer interessant. Das kompilierte
        programm enthält nicht einen dieser namen. Im mnemocode
        steht doch wie die parameter verarbeitet werden. Man muss
        halt nur wissen wie die aufrufkonventionen sind. Stichwort std_call.

        Code:
        mov AL,[BP+6] ; übergebenes Lösch-Zeichen nach AL einlesen
        mov AH,[BP+4] ; übergebene Farbe nach AH einlesen
        Hier werden noch 16bit register (AX) benutzt. Standardmäßig sind die
        heute 32bit und heissen EAX. Das (E)AX register ist der akkumulator.
        Hier wird der parameter Löschzeichen in die niederen 8 bit des registers
        kopiert. Das L in AL steht für Low. Danach wird der Farbwert in
        die hohen 8 bit des Registers kopiert. Genau das ist die parameter
        übergabe. Was danach folgt ist das neu zeichnen des bildschirms
        und die rückgabe. Und ja BP steht für basepointer. Der wird
        unter anderem für stringoperation benutzt. Die klammerung
        ist eine art der addressierung. Wie das genau funkioniert, kannst
        du dir leicht ergooglen. Ich bin zu lange raus, was assembler angeht.

        greets
        (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

        Kommentar


        • #5
          Hallo Sebastian.J
          Die Einbindung von OBJ-ASMs ist ja nicht gerade der einfachste Weg.
          Hier der wohl einfachste:

          Assembler kann direkt im Code geschrieben werden, die Übergabe wird compiliert.
          Beispiel: X in EAX, eins dazu, zurück nach X und fertig.
          Bei neueren Delphi-Versionen siehst Du übrigends allen kompilierten Code über
          Ansicht / Debug-Fenster / CPU (auch wenn Du kein asm verwendest).
          Einfach Stopmarke setzen.

          PHP-Code:
          procedure TForm1.FormCreate(SenderTObject);
          var 
          x:integer;
          begin
           x
          :=5;
           
          asm
             MOV EAX
          ,x
             INC EAX
             MOV x
          ,EAX
           end
          ;
           
          showmessage(inttostr(x));
          end
          PS:
          Sinn macht das IMO nicht.
          ASM mag für einen Compiler-Anbieter sinvoll sein,
          zum "normalen" Programmieren für den PC ist es total out.
          Hab' mit ASM nur mit PIC-Proz. zu tun, und das auch nur,
          weil der C-Compiler von Microchip verdammt teuer ist.

          PPS:
          Hab' gehört, die neuen Miele-WAMAs sind inzwischen alle in C programmiert...

          Kommentar


          • #6
            Blödsinn ... ASM ist bis heute in zeitkritischen Bereichen Stichwort z.B. "Echtzeit" sinnvoll ...

            PS.: Die meisten Miele WaMa's waren auch schon vor 10 Jahren in C Programmiert ... warum auch nicht ... gab auch damals schon nette Compiler für Microcontroller (z.B. von Keil für Siemens x51er) ... und das Waschprogramm einer WaMa würde ich nicht gerade als Zeitkritisch definieren ... Selbst weite Teile der Automobilen Steuerelektronik werden in C entwickelt (ich hatte mal obj-Files und C-Sym's von nem 7er BMW auf den Rechner ... allerdings von 10 Jahren) ... warum auch nicht ... hochsprachen vermeiden durchaus auch Fehler ...
            Zuletzt geändert von goth; 23.05.2006, 17:36.
            carpe noctem

            [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
            [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

            Kommentar


            • #7
              Zitat mein alter Chef: Wo Echtzeit gefordert wird kommt 'ne SPS und kein PC hin.

              [auch edit...]
              OK, im BMW vielleicht nicht...

              Kommentar


              • #8
                Tja ... Dein Chef ist eben alt ... und scheinbar nicht sonderlich klug ...
                carpe noctem

                [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                Kommentar


                • #9
                  Original geschrieben von Sebastian.J
                  [...]Ist dieser BP (Basepointer oder so?) eigentlich wichtig für die Implementierung in Pascal?[...]
                  Ja, manche Funktionen laufen nur mit bestimmten Registern.
                  Du darfst auch nicht alle Register einfach so verwenden,
                  da sie auch vom kompilierten Programm verwendet werden.
                  Das betrifft (bei 32 Bit) alle Register ausser EAX, ECX und EDX.
                  Wenn man sie doch verwenden will, müssen sie halt auf dem Stack "zwischengeparkt" werden.
                  Daher auch PUSH & POP BP
                  Welche Register bei 16 Bit frei verfügbar sind...

                  Kommentar

                  Lädt...
                  X