gpt4 book ai didi

assembly - 了解 EIP (RIP) 寄存器如何工作?

转载 作者:行者123 更新时间:2023-12-02 15:49:00 25 4
gpt4 key购买 nike

对于计算机体系结构和处理器/内存级别发生的低级内容,我完全是新手。我首先要说的是。我对计算机所做的工作几乎一直处于高级编程水平。 C++、Java等

话虽这么说,我目前正在读一本开始深入研究低级编程内容、汇编、寄存器、指针等的书。我很难理解 EIP 寄存器的工作原理。

从书上说,每个内存地址都有一个字节,每个字节都有一个内存地址。

从我读到的有关 EIP 寄存器的内容来看,它指向处理器要执行的下一组指令。在使用调试工具(GDB)按照本书进行操作时,如果您要检查特定位置的内存,请说:

x/8xb 据称它可以让你检查内存地址的前 8 个字节。但如果每个内存地址只有1个字节,我就不明白了。有人可以帮助我理解这一点吗?我已经寻找了有关该寄存器如何工作和功能的完整解释,但我找不到任何东西

最佳答案

让我们从一个具体的 x86 特定示例开始。

00000000000020b0 <foo>:
20b0: 89 d1 movl %edx, %ecx
20b2: 89 f8 movl %edi, %eax
20b4: 0f af c6 imull %esi, %eax
20b7: 31 d2 xorl %edx, %edx
20b9: f7 f1 divl %ecx
20bb: c3 ret

为了简单起见,在此示例中,将内存视为一个巨大的字节“数组”,并将内存地址视为此类“数组”的索引0。当某个东西位于给定的内存地址时,这本质上意味着它的第一个字节位于该地址,它的第二个字节(如果它不仅仅是一个字节大)位于下一个地址,依此类推。例如,foo 从地址 0x20B01 开始,跨越 12 个字节。这意味着从 0x20B00x20BB(含)的每个地址都指向函数中的一个字节。

x86 中的程序计数器称为 RIP(如果是 32 位,则为 EIP),指向下一条指令2。例如,如果当前正在执行的指令是 0x20B2 处的指令,则 RIP 将包含值 0x20B4。由于 x86 的 CISC 性质,指令大小不同,因此 RIP 不一定每次都会增加固定的量。

00000000000020b0 <foo>:
20b0: 89 d1 movl %edx, %ecx
EX->20b2: 89 f8 movl %edi, %eax
PC->20b4: 0f af c6 imull %esi, %eax
20b7: 31 d2 xorl %edx, %edx
20b9: f7 f1 divl %ecx
20bb: c3 ret

在下一个“迭代”中,EX(不是真正的寄存器,只是标记正在执行的内容的一种方式)将指向 imull 指令,而 PC(RIP) 将指向 xorl 指令,依此类推,直到 ret 指令,此时存储在堆栈上的返回地址将被加载到 RIP 以便在 foo 的调用者处继续执行。

<小时/>

0 正如 Peter Cordes 所提到的,有一些架构不适用这一点。出于问题的目的,此答案特定于 x86。
1 这实际上并不是运行时找到此函数的地址,但为了示例而假装它是。
2 在某些架构中,程序计数器指向当前指令(AArch64 执行此操作),甚至指向前面的两条指令(AArch32 执行此操作)。

关于assembly - 了解 EIP (RIP) 寄存器如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27429026/

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