【问题标题】:Read command line in assembly在汇编中读取命令行
【发布时间】:2013-07-08 11:14:47
【问题描述】:

我第一次在汇编中使用 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 没有正确加载或什么的

【问题讨论】:

    标签: parsing assembly command-line-arguments nasm


    【解决方案1】:

    esiedi 是不同的指针。 ebp 用于保存旧堆栈指针,以及保存/加载局部变量。 GetCommandLineW 将返回eax 中的指针,然后您应该将其放入esi。由于您只使用lodsw(而不是stos*),因此您无需触摸edi

    【讨论】:

    • 完成。现在我可以看到 esi 如何正确递增(逐字)。 lodsw 是否加载 AX 寄存器中字节地址的字节?我使用 OllyDbg 来调试它,我没有看到 EAX 寄存器填充了每个循环的字符
    • lodsw 加载esi 当前指向的字(不是字节)并将其存储到ax 中,然后将esi 增加2。如果您在调试器中查看它,则需要忽略eax 的上半部分,因为您只修改了下半部分(又名ax)。
    【解决方案2】:

    为什么你认为命令行中使用了 0x0d?返回一个普通的 C 字符串,所以你应该寻找一个 0 字节。

    【讨论】:

    • 谢谢。所以是 '\0' 终止符标志着结束,对吧?
    • 是的。我只是用一个简单的程序测试了一下,没有0x0d。普通的旧 C 弦。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多