Доступ к префиксу сегмента программы

Я пытаюсь получить доступ к префиксу сегмента программы (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 прерываний:

http://spike.scu.edu.au/~barry/interrupts.html

Другие вопросы по тегам