Program Segment Prefix ab 0x81



  • Bei com-Files lädt MS-DOS im Program Segment Prefix (0x00 bis 0xFF) ab 0x81 den hinter dem Programmnamen eingegebenen String (mit $ beenden, falls man ihn direkt ausgeben will). Das eigentliche com-File wird ab 0x100 geladen. Damit hätte man eigentlich Platz für 0x100 minus 0x81 = 127 (dezimal) Zeichen. Schreibt man folgendes einfaches Programm zur Stringausgabe:

    mov dx,0x81 ; an dieser Stelle beginnt der String im PSP
        mov ah,9
        int 0x21
        mov ah,0x4C
        int 0x21
    

    so kann man nun maximal 120 Zeichen ($ als nicht mitgezähltes Ende-Zeichen) hinter dem Programmnamen eingeben. Gibt man 121 Zeichen ein, so verweigert MS-DOS die Ausführung des com-Files.

    Frage: Warum ist das auf 120 Zeichen begrenzt, man hat doch 7 Bytes mehr Platz zur Verfügung, oder werden diese letzten Bytes vor 0x100 noch irgendwie anders verwendet? 😕

    PSP-Aufbau: http://members.tripod.com/~oldboard/assembly/program_segment_prefix.html

    com-Files: http://www.bridgewater.edu/~bhoward/cs335/asmtut11.html

    [ Dieser Beitrag wurde am 24.05.2003 um 08:29 Uhr von Erhard Henkes editiert. ]



  • Hi.

    Also irgendwas ist da schonmal falsch... Ich habe mir ein Programm geschrieben, das den gesamten Bereich von 0080 bis 0100 ausgibt und habe dort nirgends ein '$' gefunden. 🙄 (Der String wurde mit 0x0D abgeschlossen)

    KA, wie es bei dir ist, aber ich kann bei meiner DOS Version (Win98) maximal 126 Zeichen hintereinander eingeben.
    Praktisch ist es somit also unmoeglich, den gesamten Cmd-Line Bereich auszufuellen.



  • Damit das von mir geschriebene Programm den nachgestelltetn String als solchen erkennt, muss ich ein $ am Ende eintippen, sonst passiert nur Blödsinn. Bei 120 Zeichen ist Schluss (DOS-Box unter Win2000). Kannst Du Dein Progrämmchen hier mal posten, oder ist das geheim?

    [ Dieser Beitrag wurde am 24.05.2003 um 10:23 Uhr von Erhard Henkes editiert. ]



  • Noe, ist nicht geheim. Ist schliesslich nur eine 10Min-Arbeit 😉 :
    [code]
    ;PSP Cmd-Tail display
    ;2003 by Nobuo T.
    IDEAL
    model tiny
    P186

    dataseg
    ;Hex-letter table
    HexVals db "0123456789ABCDEF"

    codeseg
    org 100h
    Start:
    ;clear screen
    mov ax, 0003h
    int 10h
    mov ax, 0B800h
    mov es, ax
    ;draw memory contents as characters
    mov cx, 0080h
    mov di, 0036h
    mov si, cx
    mov ah, 07h
    cld
    @@Loop0:
    lodsb
    stosw
    dec cx
    jz short @@ExitLoop0
    ;next line after 8 byte read from cmd-line
    test cl, 07h
    jnz short @@Loop0
    add di, 0090h
    jmp short @@Loop0

    @@ExitLoop0:
    ;draw memory contents as hex values
    mov cx, 0080h
    mov di, 0000h
    mov si, cx
    mov ah, 02h
    mov bh, 00h
    @@Loop1:
    lodsb
    mov dl, al
    mov bl, al
    and dl, 0Fh
    shr bl, 04h
    mov al, [byte ptr HexVals+bx]
    stosw
    mov bl, dl
    mov al, [byte ptr HexVals+bx]
    stosw
    mov al, 20h
    stosw
    dec cx
    jz short @@ExitLoop1
    ;next line after 8 byte read from cmd-line
    test cl, 07h
    jnz short @@Loop1
    add di, 0070h
    jmp short @@Loop1

    @@ExitLoop1:
    ;set new cursor position: x=00h y=12h
    mov ah, 02h
    mov bh, 00h
    mov dx, 1200h
    int 10h
    ;exit
    ret

    END Start


Anmelden zum Antworten