Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 读取程序集中的命令行_Parsing_Assembly_Command Line Arguments_Nasm - Fatal编程技术网

Parsing 读取程序集中的命令行

Parsing 读取程序集中的命令行,parsing,assembly,command-line-arguments,nasm,Parsing,Assembly,Command Line Arguments,Nasm,我第一次在汇编中使用ds、si和字符串相关指令。我正在尝试逐字符读取命令行参数,这就是我的代码现在的样子: GetCommandLine: push ebp mov ebp, esp push edi push esi call GetCommandLineW mov edi, eax mov esi, ebp

我第一次在汇编中使用ds、si和字符串相关指令。我正在尝试逐字符读取命令行参数,这就是我的代码现在的样子:

GetCommandLine:
    push                    ebp
    mov                     ebp,    esp
    push edi
    push esi
    call                    GetCommandLineW
    mov edi, eax
    mov esi, ebp
    Parse:
        lodsw
        cmp                 ax,     0dh ; until return is found
        jne                 Parse
    pop esi
    pop edi
    pop ebp
    ret

因此,
GetCommandLineW
函数返回指向字符串的正确指针。问题是,
Parse
部分永远循环,我看不到AX寄存器加载了字符串中正确的下一个字节。我认为EDI:ESI没有正确加载,或者ESI和EDI是不同的指针
ebp
用于保存旧堆栈指针,以及保存/加载局部变量
GetCommandLineW
将返回
eax
中的指针,然后将其放入
esi
。由于您只使用
lodsw
(而不是
stos*
),因此不需要触摸
edi

为什么您认为命令行中使用0x0d?返回一个正常的C字符串,因此您应该查找0字节。

Done。现在我可以看到esi是如何正确递增的(逐字递增)。lodsw是否加载AX寄存器中字节地址的字节?我使用OllyDbg来调试它,我没有看到EAX寄存器中填充了每个循环的字符
lodsw
加载
esi
当前指向的字(而不是字节),并将其存储到
ax
,然后将
esi
增加2。如果您在调试器中查看它,则需要忽略
eax
的上半部分,因为您只修改下半部分(aka
ax
)。谢谢。所以是“\0”终止符标志着结束,对吗?是的。我只是用一个简单的程序测试了它,没有0x0d。普通旧C字符串。:)