4

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

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

在前面的代码中,指令指针在每行之后递增,我想知道它如何知道接下来要执行哪条指令(即,,,,...mov等)?当我们第一次运行程序时,所有先前的指令是否都首先加载到 RAM 中,并且第一条指令的地址(在这种情况下)被自动加载到中,然后它只是一个接一个地遍历它们?还是我错过了什么?subpushnopeip

任何帮助表示赞赏。

4

1 回答 1

4

EIP每次检索和解码指令以执行时,都会由 CPU 本身中的微代码(固件)更新。我不相信您甚至可以按通常的方式访问它。但是,它可以使用jmp指令进行修改,该指令在功能上(不包括流水线问题等)与mov %eip,address. 它还在条件跳转call、 和ret指令上进行了更新。

一旦您的程序被加载到内存中(在此过程中,您可以将您的程序视为像任何其他文件一样的简单数据),操作系统(或其他一些加载程序)将执行程序jmp开始。当然,您作为示例代码显示的代码是程序的真正开始,而只是一个maincall编辑的函数。

于 2014-09-18T23:20:32.837 回答