访问MASM汇编器(x86)中的命令行参数
问题描述:
我在x86 MASM汇编程序中编写程序,并且需要访问启动程序时提供的命令行参数。我在多个网站上阅读,我可以在Program Segment Prefix或PSP*问这些参数。访问MASM汇编器(x86)中的命令行参数
作为一个测试,我尝试打印提供的参数的第一个字符。我的问题是(取决于我如何访问PSP),我得到了错误的字符(或者根本没有字符)。
...
mov ah, 21h
int 50h
mov ds, dx
mov ah, 0Ah
mov al, offset ds:[81h]
mov bh, 0
mov cx, 1
int 10h
...
这是访问命令行参数的正确方法吗?我错过了什么?我尝试以几种不同的方式访问参数,所以我确信我的问题是由于缺乏对如何在具有偏移量的特定内存地址访问信息的理解而导致的。
有人可以向我解释如何访问PSP上的命令行参数,或者我如何在一般的特定内存位置访问某些内容?
答
; mov ah, 21h ; Why?
; int 50h ; There is no such service defined in DOS.
; mov ds, dx ; Contents of dx is undefined, don't copy it to ds.
当实模式程序(EXE或COM)启动时,两个段寄存器DS和ES都加载了PSP的段地址。 Cmdline参数在偏移量为81h的PSP中可用。所以,是的,你可以第一个字符用
mov al,ds:[81h]
但与
mov al, offset ds:[81h]
,因为你想在地址DS字节的内容加载到AL:[81H],而不是其偏移(数字81h)加载到AL。
谢谢您的回答!我不小心写了50h,但意味着51h:中断返回寄存器BX中的PSP地址。一个问题:当我使用你的解决方案时,我所打印的只是“¶”字符。任何想法为什么? – pvdsp
您确定使用** INT 51h **吗?中断列表说有不同:http://www.ctyme.com/intr/int-51.htm 当您的程序已启动命令 ** YourPgm.com xy **, 在PSP:81的字节是在PSP中的字节:82h是x,在PSP处的字节:83h是y,在PSP处的字节:84h是0Dh(终止输入)并且PSP处的字节:80h具有cmdline参数(在这种情况下为03h)的长度。你应该学会使用调试器。 – vitsoft
不幸的是,当运行** MyProgram xy **时,'ds:[81h]'返回“¶”字符,ds:[82h]不返回,ds:[83h]返回“≡”字符,不管我的命令行参数是什么。 – pvdsp