EIP寄存器如何获得其价值?

时间:2014-09-18 23:08:21

标签: pointers assembly x86 eip

我刚刚开始在学校学习装配,我们开始深入研究寄存器以及如何使用它们。 我似乎无法理解的一点是指令指针如何获得下一条指令的地址? 例如,请使用以下代码:

nop
pushl    %ebp
movl    %esp, %ebp
subl    $4, %esp

在前面的代码中,指令指针在每一行之后递增,并且我想知道它是如何知道下一步要做的指令(即movsub,{{ 1} ...等)?当我们第一次运行程序时,所有先前的指令是否首先被加载到RAM中,并且第一条指令的地址(在这种情况下为push)被自动加载到nop中,然后它只是将它们翻过来一?或者我错过了什么?

感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

每次检索并解码指令以执行时,

EIP由CPU本身中的微代码(固件)更新。我不相信你甚至可以通常访问它。但是,它可以使用jmp指令进行修改,该指令在功能上(不包括管道问题等)与mov %eip,address相同。它还会针对条件跳转,callret指令进行更新。

一旦你的程序被加载到内存中(在这个过程中,你可以把你的程序看作简单的数据,就像任何其他文件一样),操作系统(或其他一些加载程序)执行jmp到你的开始程序。当然,您作为示例代码显示的代码是程序的真正开始,但只是main具有call ed的函数。