Assembly 访问程序段前缀

Assembly 访问程序段前缀,assembly,x86,masm,Assembly,X86,Masm,我正在尝试访问x86 MASM汇编程序中的程序段前缀(PSP)。作为测试,我想在运行程序后打印给定的命令行参数。我尝试将PSP的地址放入dx寄存器,偏移量为81h:命令行参数的位置 然而,在运行程序之后,我得到了回报。我可以看到给定的命令行参数,但前面有很多胡言乱语。知道为什么会这样吗?我想我在81小时的时候没有正确使用PSP IDEAL P386 MODEL FLAT, C ASSUME cs:_TEXT,ds:FLAT,es:FLAT,fs:FLAT,gs:FLAT CODESEG st

我正在尝试访问x86 MASM汇编程序中的程序段前缀(PSP)。作为测试,我想在运行程序后打印给定的命令行参数。我尝试将PSP的地址放入
dx
寄存器,偏移量为
81h
:命令行参数的位置

然而,在运行程序之后,我得到了回报。我可以看到给定的命令行参数,但前面有很多胡言乱语。知道为什么会这样吗?我想我在81小时的时候没有正确使用PSP

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

我怀疑这是因为INT 21h子函数9需要“$”来终止字符串

另外,我认为
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的有用资源:


@zx485是的,这是我第一个问题的继续。我学到了一些新东西,在尝试访问这些命令行参数时,我又前进了一步,但偶然发现了一个新问题。给你输出的示例参数是什么(即,你用什么命令行运行你的程序?),我用参数
commandlineargument
运行我的程序。您可以在屏幕上看到作为最后一个字符串打印的参数。谢谢您的回答,@Donald_W。不幸的是,当使用命令行参数运行代码时,我没有得到任何回报。此外,它不想编译,因为它抱怨
mov
指令中的
byte
关键字。删除
字节后,它编译得很好。您使用的是什么编译器/环境?@pvdsp您正在尝试构建本机16位DOS可执行文件还是32位DOS扩展可执行文件?
MODEL FLAT
指令指示的是后者,在32位保护模式下访问PSP的方式会有很大不同。@pvdsp I dunno,这可能取决于您使用的特定DOS扩展器。