gpt4 book ai didi

assembly - 这个组件是如何工作的?

转载 作者:行者123 更新时间:2023-12-02 16:27:31 30 4
gpt4 key购买 nike

我最近需要在汇编级别调试程序。我没有太多的汇编经验,所以我想我应该编写一些简单的 C 程序并单步执行它们,以便在开始调试其他人的代码之前对这种语言有一个感觉。然而,我真的不明白 gcc 对这两行做了什么(用 -ggdb -O0 编译):

items[tail] = i;
tail = (tail+1) % MAX_SIZE;

其中 MAX_SIZE #define 为 5,i 是一个局部变量(我猜存储在 0x8(%ebp) 中)。根据 gdb,这变成:

0x08048394 <queue+17>:  mov    0x8049634,%edx
0x0804839a <queue+23>: mov 0x8(%ebp),%eax
0x0804839d <queue+26>: mov %eax,0x804963c(,%edx,4)
0x080483a4 <queue+33>: mov 0x8049634,%eax
0x080483a9 <queue+38>: lea 0x1(%eax),%ecx
0x080483ac <queue+41>: movl $0x66666667,-0xc(%ebp)
0x080483b3 <queue+48>: mov -0xc(%ebp),%eax
0x080483b6 <queue+51>: imul %ecx
0x080483b8 <queue+53>: sar %edx
0x080483ba <queue+55>: mov %ecx,%eax
0x080483bc <queue+57>: sar $0x1f,%eax
0x080483bf <queue+60>: mov %edx,%ebx
0x080483c1 <queue+62>: sub %eax,%ebx
0x080483c3 <queue+64>: mov %ebx,-0x8(%ebp)
0x080483c6 <queue+67>: mov -0x8(%ebp),%eax
0x080483c9 <queue+70>: shl $0x2,%eax
0x080483cc <queue+73>: add -0x8(%ebp),%eax
0x080483cf <queue+76>: mov %ecx,%edx
0x080483d1 <queue+78>: sub %eax,%edx
0x080483d3 <queue+80>: mov %edx,-0x8(%ebp)
0x080483d6 <queue+83>: mov -0x8(%ebp),%ebx
0x080483d9 <queue+86>: mov %ebx,0x804963

由于 0x804963c 是项目的地址,因此我可以看到第一行 C 代码是如何工作的。另外,0x8049634是tail的地址,所以我猜queue+33和queue+38相当于%ecx = tail+1...但我不知道之后发生了什么。谁会想到一个简单的模数会如此复杂?

最佳答案

这是一种避免执行更昂贵的除法指令的方法。我第一次遇到这个问题的时候也很困惑。有趣的是,搜索用于此技巧的魔数(Magic Number)(在本例中为 0x66666667)通常会给出解释此技巧的结果。 (我相信当时这是我必须继续做的唯一具体事情,因为我没有消息来源。)

快速搜索给了我这篇博文:http://blog.dkbza.org/2007/09/reverse-engineering-compiler-produced.html它的底部有一些有用的链接(包括指向有关此技巧的论文的间接链接)。

关于assembly - 这个组件是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/984292/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com