Erstes Programm, aber irgendwie klappts nicht.



  • Hi Leute,
    ich habe versucht, ein kleines Programm
    mit GoAsm zu schreiben, dass einen im Programmcode
    definierten Text ausgibt. Das ganze soll unter Win32 XP
    laufen. Ich habe versucht, das mit Interrupt 21h zu lösen.
    By the Way: Vielleicht könnte mir jemand noch mal kurz erläutern
    was das ist, ein Interrupt, habe ich nämlich noch nicht so richtig
    verstanden.
    Hier mal den Code mit dem ich es versucht habe:

    .data
    MyString db "Huhu"
    .code
    mov ax,09h
    mov dx,OFFSET MyString
    int 21h
    

    Einen Fehler gibt es in der Zeile mit OFFSET,
    sorry kann den genauen Fehler jetzt nicht posten,
    weil ich nicht zuhause bin.
    MfG Jonas 😃



  • Allgemein:
    http://de.wikipedia.org/wiki/Interrupt
    und hier zB. der Software-Interrupt 21h:
    http://de.wikipedia.org/wiki/Softwareinterrupt
    Die deutschen Artikel sagen zwar das Wesentliche, sind aber sonst IMHO eher schlecht. Vielleicht bringen die englischen mehr, sonst nochmal fragen.

    Dein Code ist MASM/TASM-Syntax. Das versteht zwar der NASM (wenn der TASM-Modus aktiviert wird), der GoAsm aber AFAIK nicht. Lies mal die Doku zum GoAsm, um herauszufinden, wie du den Code umschreiben musst oder besorge die die Assembler, mit denen im Tutorial/Buch (oder wo auch immer du den Code her hast) gearbeitet wird (TASM ist nicht Freeware).

    Dir ist uebrigens klar, dass das ein 16Bit DOS-Programm werden muss, was du da schreibst? Beendet so natuerlich auch nicht korrekt.



  • Hi Nobuo T.,
    Danke für deine schnelle Antwort.
    Diesem Code liegt folgendenes Tutorial zugrunde:
    http://andremueller.gmxhome.de/toc.html
    Ich wusste nicht, dass sich die Syntax so grundlegend
    unterscheidet. Werde mir mal die Syntax von GoAsm
    reinziehen.
    Könntest du mir bitte nochmal erläutern, wie ich das
    Programm ändern muss für Win32?
    Ich würde das dann gerne über eine Konsole ("cmd") aufrufen.
    By The Way: Wie beende ich den Aufruf denn richtig?
    MfG Jonas 😃



  • So wesentlich unterscheiden sich die Intel-Syntax-Assembler nun auch nicht. Sind Kleinigkeiten, deshalb sollte das nach kurzem Studium der Doku auch grob ueberschaubar sein.

    Der Code seines ersten Programms sieht aber irgendwie anders aus... Na auch egal.
    Der beendet sein Programm dort mit dem TASM-Macro "Exitcode".
    Allgemein beendet man DOS-Programme durch Aufruf von int 21h, Fkt. 4ch (Fkt.Nr. steht in ah).

    Windows-Programme verwenden die WinAPI und keine Interrupts. Von daher musst du dein kurzes Programm fuer Win32 komplett neu schreiben.
    Grob laeuft das dann so, dass du dir mit GetStdHandle den Handle des Konsolenfensters holst (Programm muss dazu als Konsolenprogramm gelinkt werden - dann bekommt es automatisch ein Konsolenfenster), und damit kannst du dann normal mit zB. WriteFile Text in die Konsole schreiben.

    Wie die Syntax im GoAsm im Detail aussieht, weiss ich nicht, aber prinzipiell laufen WinAPI-Aufrufe ohne Macro-Schnickschnack so:

    ; Konstante STD_OUTPUT_HANDLE muss nat. vorher definiert werden, evtl.
    ; muessen WinAPI-Funktionen irgendwie importiert werden.
    	push	STD_OUTPUT_HANDLE
    	call	GetStdHandle
    ; Rueckgabe in eax
    
    	push	NULL
    	push	lpretVal     ; das ist eine Variable - siehe MSDN fuer Parameter etc.
    	push    10    ; string laenge
    	push    SourceBuffer  ; offset des Puffers
            push    eax           ; file-handle
            call    WriteFile
    


  • Und mal so nebenbei, um die WinAPI zu verstehen, sind C Kenntisse von Vorteil oder sogar eine Voraussetzung...



  • Tja, koennte das subtilerweise evtl. daran liegen, dass oft viele Beispiele in (Pseudo-)C sind, oder wie kommst du auf diese Erkenntnis? Um die zu verstehen, braucht man allerdings iaR. sicher kein C-Genie sein (ich habe bisher auch so verstanden, was die mir zB. in der msdn sagen wollten). 😃



  • Nun, als Erkenntnis würde ich es nicht bezeichnen, ehe ein "Gefühl", dass viele Leute versuchen, eine scharfe Trennlinie zwischen Assembler und sagen wir mal C zu ziehen. Irgendwann möchte man Ausgabe auf dem Bildschirm haben, oder eine Datei öffnen, irgendeine Eingabe realisieren und, und, und... Sobald man WinAPI oder irgendwelche C Funktionen (und es ist ja nicht gerade wenig Software und Bibliotheken in C geschrieben) benutzen möchte, hat man ja sofort eine gravierende Auswirkung auf das Layout des Programms: Parameter müssen in einer bestimmten Reihenfolge auf dem Stack sein, manche Funktionen haben Rückgabewerte, manche nicht, Rückgabewerte stehen in speziell dafür reservierten Registern, manche Register darf man anfassen, manche muss man erst zwischenspeichern und nach Benutzung wiederherstellen. Das muss man als Anfänger alles wissen und berücksichtigen und so gesehen hat man keine "Freiheit" mehr und das Assemblerprogramm ist dann ehe im Layout eines C-Programms geschrieben.
    Ich würde mich hier noch mehr austoben, aber keiner liest ja Postings länger als ein Paar Zeilen 😉



  • Hi,

    @abc.w:
    Sehr interessanter Post!

    @all:
    Frohes Neues!
    Mit C-Funktion, also in Dll's habe ich mich
    mal kurz auseinander gesetzt, aber mit C-Programmierung
    selbst nicht.
    By The Way:
    Habe einen geeigneten Quelltext in Assembler in der
    Doku gefunden, der das tut, was ich will aber ich
    verstehe ihn irgendwie nicht so ganz:

    DATA SECTION
    
    KEEP DD 0
    
    CODE SECTION
    
    START:
    
    PUSH -11             	;STD_OUTPUT_HANDLE
    CALL GetStdHandle       ;get, in eax, handle to active screen buffer
    PUSH 0,ADDR KEEP        ;KEEP receives output from API
    PUSH 4,'Huhu'    	;4=length of string
    PUSH EAX                ;handle to active screen buffer
    CALL WriteFile
    XOR EAX,EAX             ;return eax=0 as preferred by Windows
    RET
    

    Eine kleine Erklärung wär gut, wenns nicht zu viel Mühe macht.
    Vor allem die Sache mit dem "push -11"
    MfG Jonas
    PS: Noch mal frohes Neues Jahr! :xmas1: :xmas2:



  • Wenn's um WinAPI geht, ist die msdn dein Freund:
    http://msdn.microsoft.com/en-us/library/ms683231(VS.85).aspx
    Oder was verstehst du daran nicht?
    Das Programm entspricht ansonsten genau der Skizze, die ich zuletzt gepostet hatte.



  • Hi Nobuo T.,
    Dank dir für die Antwort!
    Dein Link hat meine Frage bestens beantwortet 😉
    MfG Jonas


Anmelden zum Antworten