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
P186dataseg
;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
retEND Start