Ein/Ausgabe von Zeichen



  • packman2013 schrieb:

    Als Assembler nutze ich MASM32 auf einem W7 Rechner. Das "Hallo Welt" programm läßt sich jedoch unter W7 64-Bit nicht starten.

    Wenn Du wirklich Hilfe willst, dann solltest Du etwas gesprächiger werden 😡
    Welches "Hallo Welt"-Programm? Was heißt "nicht starten"? Wie sieht die Fehlermeldung im Wortlaut aus?
    Weißt Du schon, wie man die "Eingabeaufforderung" (auch bekannt als: Konsole, Dosbox, Shell) startet und bedient?

    viele grüße
    ralph



  • Hallo Ralph!
    Hab ersteinmal Dank für Deine Hilfe. Ich habe folgendes Programm:

    assume cs:prog,ds:daten
    daten segment
    text db "Hallo Welt!$"
    daten ends
    prog segment
    a: mov ax,daten
    mov ds,ax
    mov ah,09h
    lea dx,text
    int 21h
    mov ah,4ch
    int 21h
    prog ends
    end a

    Bei starten der exe soll die Ausgabe "Hallo Welt" erfolgen.

    Das Kompelieren habe ich über die Eingabekonole "cmd" und den Befehl ml /c dateiname.obj gestartet. Ohne Fehler wurde die Datei erstellt.
    Dann wollte ich über den Befehl "link16" und eingabe des dateinamens Dateiname.obj eine exe mit dem Namen Dateiname.exe erstellen. Ich habe dort den Name der *.obj angegeben und die Abfragen
    run file
    list fole
    Libraries
    definitions file
    bestätigt.
    Anschließen habe ich die Meldung "LINK: warning L4021: no stack segment in der Eingabeaufforderung erhalten.
    Das starten der nun erstellten exe führte zu den Fehler, dass das Programm aufgrund einer Inkompatibilität mit 64-Bit-Version nicht gestartet werden kann.
    Das MASM32-Packages habe installiert.
    Ich hoffe, dass Du nun etwas damit anfangen kannst.

    viele Grüße
    Volker



  • packman2013 schrieb:

    Ich hoffe, dass Du nun etwas damit anfangen kannst.

    Ja, damit kann ich etwas anfangen. Das Programm ist ein DOS-Programm, was Du anhand der "int 21h" erkennen kannst. Also ein 16-Bit-Real-Mode-Programm und kein 32-Bit-Protected-Mode-Programm. Ein 64-Bit-Windows verweigert den Start eines DOS-Programms. Nicht weiter schlimm, da Du ja "Protected Mode" (etwas ältliche Ausdrucksweise für 32-Bit-Programm) programmieren sollst. Vergiss einfach alle Programme, die ein "int ..." beinhalten oder gar die Hardwareports direkt ansprechen (;)).

    Navigiere mal zum Ordner "\masm32\examples\exampl05\console\hello\" und starte aus der Konsole heraus das Programm "hello.exe". Das sollte funktionieren.

    Nun brauchst Du ein brauchbares Gerüst ("Skeleton") für Dein Programm. Guck Dir mal "\masm32\examples\exampl01\generic\generic.asm" an. Für Deine Zwecke reicht aber:

    .686P
    .model flat,stdcall
    option casemap:none
    
    .DATA    ; Datensegment
    
        ; Daten
    
    .CODE    ; Codesegment
    Start:   ; Einsprungpunkt
    
       ; Code
    
    END Start ; Programmende mit Einsprungpunkt
    

    Jetzt erst wird programmiert :). Es gibt verschiedene Möglichkeiten, Deine Aufgabe zu programmieren. Das MASM32-Paket ist (zu) sehr auf Makros konzentriert, so dass vom eigentlichen Assembler nicht mehr viel übrig bleibt. Das sollte wohl nicht der Sinn der Übung sein. Hast Du nicht ein Beispiel von vorigen Übungen?

    viele grüße
    ralph



  • 16Bit - Dos Programme kann man fast problemlos mit Dosbox im Protected Mode unter 64Bit laufen lassen.

    Zu Ein und Ausgaberoutingen mit masm32 haben hier schon etliche Neulinge ins Asmforum reingeposten, vielleicht kann man sich ja von denen etwas abgucken.
    Aber statt in unterschiedlichen Foren reinzuposten, mit den selben fehlenden Angaben, würde ich lieber den Aufgabensteller um genauere Angaben bitten.



  • in meinem Ordner gibt es kein Verzeichnis "\masm32\examples\exampl05\console" und somit auch kein Unterverzeichnis "hello" 😞
    Das Verzeichnis mit der Datei "\masm32\examples\exampl01\generic\generic.asm" ist vorhanden. Diese ist nur wesentlich komplexer als Dein Beispiel. In nehme mal an das sind die ganzen Makros.

    Soweit ich mir erinnere müßte eine Schleife ein Unterprogramm angestoßen welchen auf Eingaben wartet bis in meinem Fall 300 Eingaben oder ein <CR> erreicht sind.
    Ich schaue aber nochmal in meiner Unterlagen.
    Erfolgt das Einlesen über
    INS
    input string
    ??



  • WinAPI-Lösung:

    include \masm32\include\masm32rt.inc
    .code
    main proc
    LOCAL dwN:DWORD
    LOCAL hIn:HANDLE
    LOCAL hOut:HANDLE
    LOCAL sz[10+1]:BYTE
    
        print "Hello World",13,10
        print "Enter 10 char.: "
    
        mov hIn,rv(GetStdHandle,STD_INPUT_HANDLE)
        mov hOut,rv(GetStdHandle,STD_OUTPUT_HANDLE)
        invoke SetConsoleMode,hIn,0
    
        lea edi,sz
        xor esi,esi
    @@: invoke ReadConsole,hIn,ADDR sz[esi],1,ADDR dwN,0
        movzx eax,sz[esi]
        cmp eax,13
        je @F
        mov [edi+esi],al
        invoke WriteConsole,hOut,ADDR sz[esi],1,ADDR dwN,0
        lea esi,[esi+1]
        cmp esi,LENGTHOF sz - 1
        jb @B
    @@:
        mov BYTE ptr [edi+esi],0
    
        print chr$(13,10,"your string: ",13,10,"'")
        print ADDR sz
        print "'",13,10
        inkey
        exit
    
    main endp
    end main
    

    \masm32\qeditor.exe; code einfügen; speichern; Project->"Console Build All" ; Project->"Run Program" :schland:



  • "mov [edi+esi],al" ist überflüssig 🙄



  • packman2013 schrieb:

    in meinem Ordner gibt es kein Verzeichnis "\masm32\examples\exampl05\console" und somit auch kein Unterverzeichnis "hello" 😞

    Dann wirds Zeit für das neueste MASM32-Paket...

    Das Verzeichnis mit der Datei "\masm32\examples\exampl01\generic\generic.asm" ist vorhanden. Diese ist nur wesentlich komplexer als Dein Beispiel. In nehme mal an das sind die ganzen Makros.

    Es handelt sich um ein Skeleton für GUI-Anwendungen. Klick mal auf "generic.exe". Im Augenblick erstellst Du "nur" eine Console-Anwendung. Es ist aber eine gute Gedächtnisstütze, ob man in seinem eigenen Gerüst etwas vergessen haben könnte.

    Hier ein Beispiel mit den "Console Mode Makros":

    .686P
    .model flat,stdcall
    option casemap:none
    
    include \masm32\include\windows.inc
    include \masm32\include\masm32.inc
    include \masm32\include\kernel32.inc
    include \masm32\macros\macros.asm
    
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\msvcrt.lib
    
    .DATA
    	Feld1 db 301 dup(0)
    
    	msg db "Gib's mir bis zu 10 Mal: ", 0
    	crlf db 13, 10, 0
    
    .CODE
    
    main PROC USES edi ebx
    
    	print ADDR msg
    
    	lea edi, Feld1
    	mov ebx, 10
    	@@:
    		sub ebx, 1
    		jc @F
    		getkey
    		cmp al, 13
    		je @F
    		mov [edi], al
    		print edi
    		add edi, 1
    		jmp @B
    	@@:
    		mov BYTE PTR [edi], 13
    
    	print ADDR crlf
    	print ADDR Feld1
    
    	xor eax, eax
    	ret
    main ENDP
    
    END main
    

    viele grüße
    ralph



  • Hallo Ralph
    Hab vielen Dank für Deine Hilfe. Ich werde jetzt ein wenig probieren... darf ich mich nochmal bei Dir melden wenn ich nicht weiterkommen?

    Gruß
    Volker



  • packman2013 schrieb:

    Hallo Ralph
    Hab vielen Dank für Deine Hilfe.

    Bitte gern geschehen :).

    Ich werde jetzt ein wenig probieren...

    Das ist gut, so bekommst Du es in Dein Gehirn.

    darf ich mich nochmal bei Dir melden wenn ich nicht weiterkommen?

    Privatlehrer - obendrein unbezahlt - spiele ich nicht. Stelle Deine Fragen hier im Forum. Anhand der vielen Antworten, die Du hier und anderswo bekommen hast, kannst Du Dir überlegen, wie man in Zukunft Fragen so stellt, dass man so schnell wie möglich so sinnvolle Antworten wie möglich bekommt.

    viele grüße
    ralph


Anmelden zum Antworten