Assembly 访问程序段前缀
我正在尝试访问x86 MASM汇编程序中的程序段前缀(PSP)。作为测试,我想在运行程序后打印给定的命令行参数。我尝试将PSP的地址放入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
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扩展器。