访问MASM汇编程序中的命令行参数(x86)

时间:2017-08-15 20:39:43

标签: assembly x86 dos masm

我在x86 MASM汇编程序中编写程序,我需要访问启动程序时提供的命令行参数。我在多个网站上看到我可以在Program Segment Prefix或PSP上访问这些参数。

作为测试,我尝试打印提供的参数的第一个字符。我的问题是(取决于我如何尝试访问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上的命令行参数,或者我如何访问特定内存位置的内容?

2 个答案:

答案 0 :(得分:8)

async function modelStuff() {
    for (let i = 0; i < 5; i++) {
        try {
            await apiCall(i);
        } catch (err) {
            // do we keep going?
            // do we drop the rest?
            // do we maybe need to relogin and retry last request?
        }
        await sleep(500);
    }
}

async function apiCall(ix) {
    console.log(`call: ${ix}`);
}

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

// test it
modelStuff();

当启动实模式程序(EXE或COM)时,段寄存器DS和ES都加载了PSP的段地址。 Pm中的Cmdline参数位于偏移81h。所以是的,您可以使用

将第一个字符加载到AL
; 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.

但不是

mov al,ds:[81h]  

因为你希望地址DS的字节的内容:[81h]而不是偏移(数字81h)加载到AL。

答案 1 :(得分:1)

获取命令行内容http://www.fysnet.net/cmndline.htm