Home

8086 Assembler (MS-DOS):
Parameteranzeige aus Programmsegmentpräfix (PSP)


Zurück zur Assemblerauswahlseite
Der in Programmsegmentpräfix (PSP) ab Adresse 81h gespeicherte Text ist mit einigen Ausnahmen eine exakte Kopie der Befehszeile beginnend hinter dem Namen des aufgerufenen Programms. Einige der Angaben werden jedoch verschluckt:
  • Eingegebene Zwischenräume am Ende der Befehlszeile werden abgeschnitten
  • Ein- und Ausgabeumleitungen (sie beginnen mit < oder >) und die dazugehörigen Datei- oder Gerätenamen werden entfernt
  • Befehlsanhänge hinter dem Pipe-Symbol (|) und das Pipe-Symbol werden entfernt.
Es ist zu bemängeln, dass der Programmaufruf nicht mit übernommen wird. Es wäre schon nützlich, ihn abfragen zu können. Man könnte so bestimmen, ob das Programm im gleichen Verzeichnis residiert wie die als Parametern mitgegebenen Dateinamen.
Mit dem folgenden kleinen Programm lässt sich ausprobieren, wie Aufrufparameter im PSP dargestellt werden. Damit lassen sich mögliche Unklarheiten klären - als da sind -
Wie sieht der Bereich aus,
  • wenn das Programm ohne Parameter aufgerufen wird?
  • wenn hinter dem Programmnamen mehr als ein Zwischenraum eingetippt wurde?
  • wenn kleine oder große Buchstaben eingetippt wurden? Wird vielleicht alles in Großschrift gewandelt?
  • wenn Umleitungs- oder Verkettungssymbole eingetippt wurden? Es handelt sich um die Zeichen <, > und |.
  • wenn keine Parameter, aber nur Zwischenräume hinter dem Programmnamen eingetippt wurden?
  • wenn nach dem letzen Parameter noch ein oder mehrere Zwischenräume eingetippt wurden?

Ausprobieren ist angesagt! Ein rasch zusammengestelltes Programm dazu ist weiter unten dargestellt.

Test der Parameterübernahme in den Progrtammsegmentpräfix (PSP) unter COMMAND.COMBild links: Der Bildschirmabdruck mit schwarzem Hintergrund beantwortet fast alle gestellten Fragen. Allerdings geht aus dem Bildschirmabdruck die Beantwortung der letzten Frage (Eingabe von Blanks hinter dem letzten Parameter) nicht hervor: Die hinter dem letzten Parameter eingetippten Blanks werden unter COMMAND.COM in den PSP kopiert. Verwendet man 4DOS als Kommandointerpreter, werden sie abgeschnitten. Außerdem räumt 4dos im PSP besser auf (vergleiche nächstes Bild).
Test der Parameterübernahme in den Progrtammsegmentpräfix (PSP) unter 4DOS.COM
comment #
dies programm zeigt die eintragungen der programmaufrufparameter
aus der kommndozeile in den psp ab adresse 80h
#
.model small
.stack  128

spc     equ     ' '
cr      equ     0dh
lf      equ     0ah

int21   macro   intnr
        ifnb    <intnr>
        mov     ah,intnr
        endif
        int     21h
endm

print_crlf macro
        mov     dl,cr
        int21   2
        mov     dl,lf
        int21   2
endm

;testhilfe: minidump, aufruf mit: adresse, anzahl bytes
;angezeigt wird das extra-segment
mdump   macro   adresse,anzahl
        local   mdump11,mdump22,mdump33,mdump44,mdump99
        mov   bx,adresse
        mov   cx,anzahl
mdump11:                ;;ausgabe adresse
        call    mdump44

mdump22:                ;;ausgabe wert
        mov     al,bl
        and     al,0fh  ;;ausgabe neue zeile?
        jnz     mdump33 ;;nein
        call    mdump44 ;;ja


mdump33:                 ;;ausgabe hexa byte
        push    cx
        mov     dl,spc
        int21   2
        mov     al,es:[bx]
        inc     bx
        call    hex_out
        pop     cx
        dec     cx
        jnz     mdump22
        print_crlf
        jmp     mdump99

mdump44:                ;;ausgabe neue zeile mit adresse
        push    cx
        print_crlf
        mov     al,bh
        call    hex_out
        mov     al,bl
        call    hex_out
        mov     dl,':'
        int21   2
        pop     cx
        ret

mdump99:
        endm

.code
_start: xor     ch,ch
        mov     bx,80h          ;hier anzahl parameterzeichen
        mov     cl,es:[bx]
        jcxz    dump            ;wenn keine parameter
        inc     bx

lese:   mov     dl,es:[bx]
        cmp     dl,cr           ;cr = ende der kommandozeile
        je      dump
        inc     bx
        int21   2               ;anzeige 1 zeichen in dl
        jmp     lese

dump:   mdump   80h,20h

        xor     al,al           ;programmende
        int21   4ch

;unterprogramm hexadezimale anzeige
;----------------------------------
;ausgabe 8 bit zahl (in al) in hexa
hex_out: push   ax
        shr     al,1
        shr     al,1
        shr     al,1
        shr     al,1
        call    conv
        pop     ax
conv:   and     al,0fh
        daa
        add     al,0f0h
        adc     al,40h

;ausgabe zeichen in al zum bildschirm
printchr:
        cmp     al,cr   ;cr?
        je      printchr8
printchr1:
        push    dx
        push    cx
        push    bx

        mov     dl,al
        int21   2

        pop     bx
        pop     cx
        pop     dx
        ret

printchr8:
        print_crlf
        ret

        end     _start