Доступ к префиксу сегмента программы
Я пытаюсь получить доступ к префиксу сегмента программы (PSP) в x86 MASM Assembler. В качестве теста я хотел бы напечатать заданные аргументы командной строки после запуска моей программы. Я попытался поместить адрес PSP в dx
регистр со смещением 81h
: позиция аргументов командной строки.
Однако после запуска программы я получаю это взамен. Я могу видеть данный аргумент командной строки, но ему предшествует много тарабарщины. Есть идеи, почему это происходит? Я полагаю, я не правильно получаю доступ к PSP в 81 час?
IDEAL
P386
MODEL FLAT, C
ASSUME cs:_TEXT,ds:FLAT,es:FLAT,fs:FLAT,gs:FLAT
CODESEG
start:
sti ; Set The Interrupt Flag
cld ; Clear The Direction Flag
push ds ; Put value of DS register on the stack
pop es ; And write this value to ES
mov ah, 09h
mov dx, ds:[81h]
int 21h
mov eax, 4c00h ; AH = 4Ch - Exit To DOS
int 21h ; DOS INT 21h
DATASEG
STACK 1000h
END start
1 ответ
Я подозреваю, что это потому, что подфункция 9 INT 21h требует '$' для завершения строки.
Также я думаю mov dx, ds:[81h]
должно быть mov dx, 81h
поскольку DS уже загружен в соответствии с требованиями прерывания.
Рассмотрим что-то вроде:
IDEAL
P386
MODEL FLAT, C
ASSUME cs:_TEXT,ds:FLAT,es:FLAT,fs:FLAT,gs:FLAT
CODESEG
start:
sti ; Set The Interrupt Flag
cld ; Clear The Direction Flag
push ds ; Put value of DS register on the stack
pop es ; And write this value to ES
; INT 21h subfunction 9 requires '$' to terminate string
xor bx, bx
mov bl, [80h]
cmp bl, 126
ja exit
mov byte [bx + 81h], '$'
; print the string
mov ah, 09h
mov dx, 81h
int 21h
exit:
mov eax, 4c00h ; AH = 4Ch - Exit To DOS
int 21h ; DOS INT 21h
DATASEG
STACK 1000h
END start
Это полезный ресурс для API прерываний: