我刚刚开始在学校学习装配,我们开始深入研究寄存器以及如何使用它们。 我似乎无法理解的一点是指令指针如何获得下一条指令的地址? 例如,请使用以下代码:
nop
pushl %ebp
movl %esp, %ebp
subl $4, %esp
在前面的代码中,指令指针在每一行之后递增,并且我想知道它是如何知道下一步要做的指令(即mov
,sub
,{{ 1} ...等)?当我们第一次运行程序时,所有先前的指令是否首先被加载到RAM中,并且第一条指令的地址(在这种情况下为push
)被自动加载到nop
中,然后它只是将它们翻过来一?或者我错过了什么?
感谢任何帮助。
答案 0 :(得分:4)
EIP
由CPU本身中的微代码(固件)更新。我不相信你甚至可以通常访问它。但是,它可以使用jmp
指令进行修改,该指令在功能上(不包括管道问题等)与mov %eip,address
相同。它还会针对条件跳转,call
和ret
指令进行更新。
一旦你的程序被加载到内存中(在这个过程中,你可以把你的程序看作简单的数据,就像任何其他文件一样),操作系统(或其他一些加载程序)执行jmp
到你的开始程序。当然,您作为示例代码显示的代码是程序的真正开始,但只是main
具有call
ed的函数。