Textausgabe unter Windows



  • Hallo,

    ich beschäftige mich gerade mit den Grundlagen von Assembler. Die Beispiele in meinem Lehrbuch laufen alle unter MS-DOS. Das Problem ist jedoch, dass ich nur einen PC mit Windows 7 habe, und darauf laufen die alten DOS-Programme leider nicht mehr.

    Darum möchte ich jetzt das folgende Windows-Programm als "Grundrahmen" verwenden. Auf diese Weise kann ich zumindest mit den Grundbefehlen von Assembler (mov, add, ...) arbeiten.

    ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
        include \masm32\include\masm32rt.inc
    ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    
    comment * -----------------------------------------------------
                         Build this console app with
                      "MAKEIT.BAT" on the PROJECT menu.
            ----------------------------------------------------- *
    
        .data?
          value dd ?
    
        .data
          item dd 0
          zahl db 5, 0
    
        .code
    
    start:
    
    ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    
        call main
        inkey
        exit
    
    ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    
    main proc
    
        cls
    
        mov al, 100
    
        mul zahl
    
        ; print zahl
    
        print "Hello World",13,10
    
        ret
    
    main endp
    
    ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    
    end start
    

    Der Code funktioniert auch, nur wenn ich versuche mit print eine Zahl auszugeben, Beispiel:

    print zahl
    

    , dann läuft das Programm nicht mehr.

    Könnt ihr mir sagen wie es richtig funktioniert ?

    Vielen Dank für eure Hilfe,
    MfG arenas



  • Guck Dir mal die Hilfedatei* \masm32\help\hlhelp.chm *an Dort steht, dass das Makro print nur Strings ausgibt. Wenn der String in einer Variable ist, dann muss print ein Pointer übergeben werden:

    ...
    zahl db "5", 0    ; Null-terminierter String
    ...
    print ADDR zahl
    ...
    

    Das wird aber nicht das sein, was Du wolltest. Du könntest nun zahl mithilfe eines anderen Makros zu einem String umformen:

    ...
    zahl dd 5    ; "dd" = "data dword", von str$ erwartet
    ...
    print str$(zahl)
    ...
    

    oder Du nimmst ein anderes Makro (wenn Dir C leichter von der Hand geht):

    ...
    zahl dd 5    ; "dd" = "data dword", von printf erwartet
    ...
    printf ("%d\n",zahl)
    ...
    

    viele grüße
    ralph



  • Ich habe es jetzt mit dem printf gemacht und es funktioniert super. Danke für deine Antwort.

    Jetzt habe ich aber noch eine Frage. Und zwar erwartet printf ja ein Doppelwort (dd), doch wie kann ich mit printf eine Byte-Variable (db) ausgeben ?

    Also wie kann ich zum Beispiel folgende Variable ausgeben:

    zahl db 5
    

    Vielen Dank,
    MfG arenas



  • Es gibt die Möglichkeit, ein Byte in ein 32-bit-Register zu laden:

    ...
    zahl db 5
    ...
    movzx eax, BYTE PTR zahl
    printf ("%d\n",eax)
    ...
    

    Wenn Du es mit Vorzeichen haben willst, dann muss das Vorzeichen "erweitert" werden:

    ...
    zahl db -5
    ...
    movsx eax, BYTE PTR zahl
    printf ("%d\n",eax)
    ...
    

Log in to reply