Archiv verlassen und diese Seite im Standarddesign anzeigen : [Pascal/Delphi] Einbinden in Hochsprachen [Assembler]
Sebastian.J 20-05-2006, 23:38 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
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.
Sebastian.J 21-05-2006, 01:02 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 :D
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.
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
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.
procedure TForm1.FormCreate(Sender: TObject);
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...
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 ...
Zitat mein alter Chef: Wo Echtzeit gefordert wird kommt 'ne SPS und kein PC hin.
[auch edit...]
OK, im BMW vielleicht nicht...
Tja ... Dein Chef ist eben alt ... und scheinbar nicht sonderlich klug ... :dontknow:
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... :dontknow:
|
-
- |