Home

8086 Assembler,
Programmbeispiel: Frage-Programm


Zurück zur Assemblerauswahlseite
Usage: FRAGE "prompt",[key-list]

Für Abfragen in Batch-Files. Das Programm hat einen kleinen logischen Fehler im Bereich um "antw6:". Die Wandlung des eingegebenen Zeichens in Großschrift ist falsch, denn im Bereich "byte ptr[si]" steht das Zeichen unverändert so, wie es im Parameter mitgegeben wurde!

"FRAGE" zeigt den Prompt und wartet auf eine Eingabetaste aus der key-list. Der zurückgegebene Errorlevel zeigt an, die wievielte Taste der key-list betätigt wurde.

Beispiel (als .bat-Datei auszuführen):

Frage "Bitte "J" zur Antwort Ja",nj
if errorlevel 2 goto ja
if errorlevel 1 goto nein
:ja
echo Die Antwort war "Ja"
goto raus
:nein
echo Die Antwort war "Nein""
:raus

Download des ausführbaren Programmes FRAGE.COM

        page        65,132
;FRAGE, wie ASK aus den NORTON UTILITIES, nur kuerzer
;Matthaei, 16.6.90 / 2.1.2004
print_chr macro char         ;;1 Zeichen zum
        mov        dl,char   ;;Bildschirm
        mov        ah,2
        int        dos
        endm

jmps    macro      to        ;kurzer Sprung
        jmp        short to
        endm

cr      equ        0dh
lf      equ        0ah

dos     equ        21h
lparm   equ        0080h     ;Parameterlaenge
fcb     equ        5ch       ;FCB aus Parameter
code    segment
        assume     cs:code, ds:code, es:code

        org        100h
start:  jmp        start1
;-----------------------------------------
;Unterprogrammsammlung
;-----------------------------------------
;PRINT MESSAGE FOLLOWING CALL PRMSG AND ENDING WITH 0
PRMSG:  mov        word ptr PRMSG2,di   ;di sichern
        POP        di
;PRINT MESSAGE ADRESSED BY di, ENDING WITH 0
;cr wird als cr lf ausgegeben
PSTR:   mov        dl,[di]
        INC        di
        cmp        dl,0
        jz         pstr99     ;wenn fertig
        cmp        dl,cr
        jnz        prstr2
        call       print_crlf
        jmp        short PSTR
prstr2: mov        ah,02
        int        21h
        jmp        short PSTR

pstr99: PUSH       di         ;Returnadresse
        mov        di,0       ;modifiziert. di wieder herstellen
PRMSG2  EQU        $-2
        RET

prstr   MACRO      TEXT       ;;print string
        CALL       PRMSG
        DB         TEXT,0
        ENDM

;-----------------------------------------
print_crlf:
        push       ax         ;Ausgabe cr lf
        print_chr cr
        print_chr lf
        pop        ax
        ret
;-----------------------------------------

start1: mov        si,lparm    ;Laenge des Parameters
        xor        ch,ch
        mov        cl,[si]
        cmp        cx,0
        je         hilfe       ;Ausstieg, wenn keine Parameterangabe
start2: inc        si          ;ueberlesen fuehrende Spaces
        cmp        byte ptr[si],' '
        jne        start3
        loop       start2


;Hilfstextanzeige wenn Aufruf ohne Parameter oder nur Spaces als Parameter
hilfe:  prstr      <'FRAGE prompt[,key-list]'>
        jmp        ret1

;Ausgabe des Prompts
;Die Ausgabe endet beim Komma im Parameter, es sei denn, das Komma steht
;nach einer ungeraden Anzahl Gaensefuesschen
m_gsf   db         0

start3: mov        m_gsf,0      ;setzen Anzahl Gaensefuesschen auf gerade
        dec        si

start5: inc        si
        mov        al,[si]

        cmp        al,'"'       ;umsetzen ?
        je         start9
        cmp        al,','
        jne        start10      ;Ausgabe
        cmp        m_gsf,0
        jne        start10      ;Ausgabe wegen Merker Schluss-Komma

        jmps       antw1

start9: xor        byte ptr m_gsf,1        ;Merker Schluss-Komma umsetzen
        jmps       start99

start10: print_chr al                      ;Zeichen ausgeben
        jmps       start99

start99: loop      start5

;diverse Programmbeendigungen
ret0:   xor        al,al                   ;Returncode=0
        jmps       raus

ret1:   mov        al,1                    ;Returncode=1

;Programmende
raus:   call       print_crlf
        mov        ah,4ch
        int        dos

antw1:  dec        cx
        jz         antw3          ;Programmende, wenn hier abgearbeitet
antw2:  inc        si             ;ueberlesen fuehrende Spaces
        cmp        byte ptr[si],' '
        jne        antw4
        loop       antw2

antw3:  jmp        ret0           ;Programmende, wenn hier abgearbeitet

antw4:  push       si             ;fuer Wiederholungen
        push        cx
        mov        bl,1
antw5:  print_chr '>'
        mov        ah,0           ;Zeicheneingabe
        int        16h            ;per Tastatur

antw6:  cmp        al,cr
        je         antw5          ;cr wird ignoriert
        mov        ah,al
        and        ah,5fh         ;ah enth. das Zeichen in Grossschrift
        cmp        byte ptr[si],al
        je         antw9
        cmp        byte ptr[si],ah
        je         antw9
        inc        si
        inc        bl
        loop       antw6

        pop        cx        ;war nicht dabei - neue Eingabe anfordern!
        pop        si
        jmps       antw4

antw9:  mov        al,bl     ;Returncode übergeben
        jmp        raus
code    ends
        end        start