发布于 2016-07-07 19:59:28
EIP是x86体系结构(32位)中的寄存器。它保存堆栈的“扩展指令指针”。换句话说,它告诉计算机下一步执行下一个命令的位置,并控制程序的流。
研究汇编语言,以便更好地理解寄存器是如何工作的。颅骨安全具有良好的引物。
发布于 2016-07-08 08:46:54
计算机需要跟踪的基本事情之一是内存中的位置,当前正在执行的指令。
这通常由CPU使用通常称为Instruction Pointer或Program counter 寄存器的工具来完成。确切的名称取决于体系结构,但该概念在所有体系结构中都具有普遍性。它被称为Intel CPU上的指令指针,这是我将在这个答案中使用的术语。
指令指针在从内存执行指令时不断增加,并且在执行某种类型的跳转指令(jmp、jle等)时也会更新。具有多个并行执行管道和多个核的现代CPU体系结构使得CPU内部实际发生的事情更加复杂,但是对于外部观察者来说,简单的解释就足以理解正在发生的事情以及相关寄存器的用途。
由于旧的Intel 8086/8088、80186和80286是16位处理器,指令指针通常表示为称为Code Segment ( 80286中的代码选择器)和指令指针的一对16位值,但保护模式选择器的功能非常类似。
在汇编程序会馆中,冒号表示段和偏移量成对的配对以形成内存地址的CS:IP。这里的CS和IP是CPU寄存器-- CPU芯片内部的微小内存位置--在这种特殊情况下,每个16位的大小。
您也有类似于DS:DX这样的东西,它通常是在内存中读取或写入数据的位置;DS是数据段,DX是一个通用寄存器,在这种情况下,它保存数据段偏移量。最初有四个寄存器打算用于一般用途,分别称为AX、BX、CX和DX,每个寄存器都可以用高半部(例如AH )或低半部AL来处理,再加上少量具有特定用途的通用寄存器。现代CPU有更多的寄存器,几十个寄存器是通用的,超过100个不是闻所未闻的。
上世纪80年代末,英特尔在制造80386 CPU时做了很多修改,包括将地址空间扩展到32位,同时保持选择器的概念。由于这个原因,旧的16位值不再足够,指令指针被扩展到32位。为了保持完全的向后兼容性(在这一点上,英特尔可能已经吸取了80286的教训,它更多的是单向兼容的;从8086/8088's真正的模式到80286's的保护模式很容易,但是回去要困难得多,这在实践中是一个问题),这需要一个新的寄存器为CPU在32位模式下操作时保持指令指针。
在80386中,扩展(32位)寄存器被命名为Exx,而相应的16位寄存器被称为xx。例如,您将得到旧的16位累加器寄存器AX加上扩展的32位累加器寄存器EAX ( AX是低16位的一半)。按照这个命名约定,扩展指令指针寄存器被称为EIP**.**
顺便说一句,最常见的情况是,正确的值不仅仅是EIP,而是CS:EIP,因为EIP的值仍然与代码选择器定义的某个起始位置相距。
https://security.stackexchange.com/questions/129499
复制相似问题