小编AK-*_*-33的帖子

K&R:第6章 - 为什么getword()函数不读取EOF?

这是我关于Stack Overflow的第一篇文章,所以我希望我不要踩到任何人的脚趾.

当然,所有的输入都是受欢迎和赞赏的,但那些最适合回答的人实际上会阅读C编程语言第二版.

我刚刚完成了练习6-4的编码,但我似乎无法解决问题.为什么getword()函数在按Ctrl + D(我在Arch Linux VM中使用C代码)之前不会读取EOF?

我之前的许多练习都需要从stdin中读取.我会做的一种方式是通过类似的东西

while ((c = getchar()) != EOF) {...}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我永远不必按Ctrl + D. 我在输入中输入,按Enter键,stdin缓冲区被刷新,并自动检测到EOF.getword()函数也依赖于它的基础上的getchar(),为什么它会挂起我的程序?

从main()调用getword()函数:

while (getword(word, MAX_WORD) != EOF) {
    if (isalpha(word[0])) {
        root = addtree(root, word);
    }
}
Run Code Online (Sandbox Code Playgroud)

getword()函数本身:

int getword(char *word, int lim) {

    char *w = word;
    int c;

    while (isspace(c = getch())) {
    }
    if (c != EOF) {
        *w++ = c;
    }
    // This point is reached
    if (!isalpha(c)) {
        // This point is never reached before …
Run Code Online (Sandbox Code Playgroud)

c eof

5
推荐指数
1
解决办法
2762
查看次数

调试器中观察到的ASM跳转指令不精确

我正在对OllyDbg中的应用程序进行一些内联​​修改,并注意到一些奇怪的行为.

这些是我写的指令,直接从调试器复制:

2005FE35   4C               DEC ESP
2005FE36   77 21            JA SHORT 2005FE59 ; 23 byte difference
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,我只修改了操作码(4C 77 21); 其他一切都由OllyDbg自动解释,这就是我的困惑.该指令应该递减ESP寄存器,然后执行21个十六进制字节的条件跳转.但是,地址0x2005FE59和0x2005FE36之间的差异不是21 - 它是23!

使用21个十六进制字节值,我观察到看似不稳定的结果.

2005FE36   77 20            JA SHORT 2005FE58 ; 22 byte difference
2005FE36   77 19            JA SHORT 2005FE51 ; 1B byte difference
2005FE36   77 17            JA SHORT 2005FE4F ; 19 byte difference
Run Code Online (Sandbox Code Playgroud)

我指示向前跳转的十六进制字节数与地址偏移量不匹配; 它似乎永远都是2.

这里发生了什么?

x86 assembly reverse-engineering machine-code ollydbg

0
推荐指数
1
解决办法
170
查看次数

标签 统计

assembly ×1

c ×1

eof ×1

machine-code ×1

ollydbg ×1

reverse-engineering ×1

x86 ×1