Home |
8086 Assembler,
|
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 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
|