Parsing 读取程序集中的命令行
我第一次在汇编中使用ds、si和字符串相关指令。我正在尝试逐字符读取命令行参数,这就是我的代码现在的样子: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
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
的上半部分,因为您只修改下半部分(akaax
)。谢谢。所以是“\0”终止符标志着结束,对吗?是的。我只是用一个简单的程序测试了它,没有0x0d。普通旧C字符串。:)