Externe Prozedur in Windowsanwendung einbinden und aufrufen



  • Hallo mal wieder,

    nach mehreren kläglichen Versuchen eine externe Prozedur einzubinden, benötige
    ich wiedermal etwas Hilfe.

    Hier die asm Datei "funk.asm" mit der Proc "PRINT"
    Diese wird als normale Win32.exe erstellt.

    .486
    .model flat, stdcall
    option casemap :none
    
    public PRINT
    
    .code
    
    start2:
    
    PRINT proc
    ;EAX enthält die Zahl zum anzeigen
    .data
    print_buffer db 20 dup (?)
    
    .code
    
    beg_print:
    
    	xor ebx, ebx
    	xor ecx, ecx
    
    	mov ecx, 10d			;ECX mit 10 laden
    	xor edx, edx			;EDX löschen
    	mov ebx, offset print_buffer	;EBX auf buffer Anfang
    	add ebx, 12d			;EBX ans Ende von buffer + 1
    schleife2:
    	dec ebx				;EBX ans Ende von buffer
    	div ecx				;EAX / 10
    	add dl, 30h			;DL + 30h = ASCII Zahl
    	mov byte ptr [ebx], dl		;ASCII Zahl nach EBX schreiben
    	xor edx, edx			;EDX löschen
    	;inc dword [print_zaehler]	;Zähler erhöhen
    	cmp eax, 0			;haben wir schon 0?
    	jne schleife2			;wenn nicht nächste Zahl
    
    	;# umgewandelte Zahl ausgeben
    	mov eax, ebx
    
    ret
    PRINT endp
    
    end start2
    

    Die Prozedur binde ich wie folgt in meiner Anwendung "programm2" ein:

    PRINT PROTO
    

    Kompilieren:

    ml.exe /c /Zd /Fl /coff programm2.asm
    link.exe /Subsystem:windows programm2.obj funk.obj
    

    Die Datei wird erstellt aber sie lässt sich nicht öffnen 😞
    Habe es auch schon mit extrn versucht aber das ist aus Beispielen für 16-Bite EXE
    Dateien. Da werde ich überhäuft mit Fehlermeldungen.

    Gruß, Nicky



  • Warum definiert dein Module einen Programmeintrittspunkt (=PRINT)? - da sollte der Linker eigentlich wegen mehrerer Startpunkte meckern.
    Ansonsten: die übliche Vorgehensweise ist eine Include mit entsprechenden PROTOs für Funktionen/Prozeduren und EXTERNDEFs für variablen zu erstellen.
    Diese Include wird in allen Modulen verwendet. Die Prozeduren und Variablen müssen dann in irgendeinem der Module angeltet werden.



  • Hallo masm,

    masm schrieb:

    Warum definiert dein Module einen Programmeintrittspunkt (=PRINT)? - da sollte der Linker eigentlich wegen mehrerer Startpunkte meckern.

    Oh, der hat gemeckert 😃 habe dein Eintrittspunkt beim ersten auf

    start:
    

    und beim zweiten auf

    start2:
    

    gesetzt.

    Ansonsten: die übliche Vorgehensweise ist eine Include mit entsprechenden PROTOs für Funktionen/Prozeduren und EXTERNDEFs für variablen zu erstellen.
    Diese Include wird in allen Modulen verwendet. Die Prozeduren und Variablen müssen dann in irgendeinem der Module angeltet werden.

    Wie gesagt, ich bin davon ausgegangen das ich beim Linken die Objektdatei mit den
    Funktionen mit angeben kann um diese zu nutzen... So wie in den Beispielen im
    Buch.

    Ich versuch es mal mit "include".

    Danke und Gruß

    Nicky


Anmelden zum Antworten