eip寄存器的修改和执行当前指令谁先?

youqika 2012-08-24 08:00:12
也是别人问我的。。。
在群里问了,悲催,没人回。。。

我想到的可能的逻辑顺序:
cpu根据eip的值取指令->修改eip指向下一条指令->执行当前指令->......
or
cpu根据eip的值取指令->执行当前指令->修改eip指向下一条指令->......

个人倾向于前者,求大神解答,不是这两种的也行,谢谢!
...全文
393 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
youqika 2012-09-09
  • 打赏
  • 举报
回复
结贴了,当时也是根据call指令来判断的。

[Quote=引用 6 楼 的回复:]
恩 仔细想想也是 调试断点处 往往是执行先前的指令, 而eip却跳到了断点处,确没执行改断点的指令。我先前理解有误
[/Quote]
6L的说法无法区分这两种情况。
template_cplus 2012-08-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
当然是先修改EIP,否则call指令岂不是导致无限循环?
《Intel® 64 and IA-32 Architectures Software Developer's Manual》里面已经明确说了:
3.5 INSTRUCTION POINTER
The instruction pointer (EIP) register contains the offset in the curre……
[/Quote]

恩 仔细想想也是 调试断点处 往往是执行先前的指令, 而eip却跳到了断点处,确没执行改断点的指令。我先前理解有误
  • 打赏
  • 举报
回复
当然是先修改EIP,否则call指令岂不是导致无限循环?
《Intel® 64 and IA-32 Architectures Software Developer's Manual》里面已经明确说了:
3.5 INSTRUCTION POINTER
The instruction pointer (EIP) register contains the offset in the current code segment for the next instruction to be executed.
distogram 2012-08-25
  • 打赏
  • 举报
回复
第一种。首先修改指令指针。然后执行上一条在指令缓冲队列中的指令。这样安排是有严重意义的哦
template_cplus 2012-08-25
  • 打赏
  • 举报
回复
eip修改的值 是看 当前指令大小的 指行完当前指令后 修改eip值 然后继续执行 该eip所对应的指令
这是我的理解:)也就是 后者 呵呵
template_cplus 2012-08-25
  • 打赏
  • 举报
回复
eip修改的值 是看 当前指令大小的 指行完当前指令后 修改eip值 然后继续执行 该eip所对应的指令
这是我的理解:)也就是 后者 呵呵
WJN92 2012-08-24
  • 打赏
  • 举报
回复
一般现在的CPU都会有指令缓存的吧
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在计算机编程领域,尤其是低级语言如汇编语言中,掌握特定指令是至关重要的。本文将重点探讨两条关键的汇编指令:leave 和 ret,它们在程序流程控制中发挥着重要作用。 leave 指令是 Intel x86 架构汇编语言中用于清理栈帧的指令。栈帧是在函数调用时创建的,用于存储函数的参数、局部变量以及返回地址。当函数执行完成,需要恢复调用者的状态时,leave 指令就显得尤为重要。它的功能等同于以下两条指令的组合:首,MOV ESP, EBP,这条指令将基址指针寄存器(EBP)的值复制到栈指针寄存器(ESP)。这一操作撤销了函数调用时对栈指针的修改,将栈指针恢复到调用函数时的位置,从而清除了局部变量和参数。接着,leave 指令执行 POP EBP,将栈顶的值弹出到 EBP 寄存器中。这个值通常是函数入口时保存的上一个 EBP 值(或者是函数调用前的 ESP 值),从而恢复了调用者的 EBP 值。 接下来是 ret 指令,它是一条返回指令,用于结束当前函数的执行并返回到调用者。其操作过程如下:ret 指令执行 POP EIP,将指令指针寄存器EIP)设置为栈顶的值。栈顶的值通常是函数调用时保存的下一条指令的地址,即调用者函数在调用当前函数后应执行的下一条指令。通过弹出这个地址,ret 指令将程序控制权交还给调用者,使程序能够继续执行。 栈是内存管理的重要组成部分,其工作原理遵循“后进出”(LIFO, Last In, First Out)原则。堆栈通常位于堆栈段(Stack Segment,由 SS 寄存器标识)内,栈顶位置由 ESP 寄存器跟踪。每次函数调用或数据压栈时,ESP 会减小,指向新的栈顶位置;而每次数据弹出或函数返回时,ESP 会增加,恢复到原来的值。 总之,在 x8

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧