【发布时间】:2013-09-19 02:06:43
【问题描述】:
于是我发现当程序执行时,EIP指针被设置为代码段中的第一条指令,处理器做了一个执行循环:
- 将 EIP 指向第一条指令
- 将指令的字节长度添加到 EIP
- 执行在步骤 1 中读取的指令
- 返回 1
我的问题是,第 2 步会发生什么?
请回复 谢谢
【问题讨论】:
标签: c memory assembly processor
于是我发现当程序执行时,EIP指针被设置为代码段中的第一条指令,处理器做了一个执行循环:
我的问题是,第 2 步会发生什么?
请回复 谢谢
【问题讨论】:
标签: c memory assembly processor
EIP 获取下一条指令的地址。
【讨论】:
如果您有这样的说明:
0x1000 INSTR_1
0x1004 INSTR_2
0x1007 INSTR_3 /* instructions can have different size */
而EIP 包含0x1000,您需要更新EIP 使其指向第二条指令(0x1004),以便它可以在下一次迭代中执行它。如果您不这样做,您将始终执行第一条指令。
因为指令可以有不同的大小,你不能只添加常量(如果所有指令都具有相同的大小,你可以这样做,就像在 RISC 中一样),但你需要添加你的指令的长度刚读。所以,在第一条之后,你将添加 4,使其指向第二条,在第二条指令之后,你将在 EIP 中添加 3,它将指向第三条指令。
【讨论】:
0x1000 只是存储 INSTR_1 的内存地址。想象一下 INSTR_1 是 0x00fc45c7 并且它从地址 0x1000 开始存储。知道指令的地址很重要,因为EIP不包含指令数据,而是指令的地址(因此Instruction POINTER)
"2. 将指令的字节长度添加到 EIP"
递增 EIP 以指向下一条指令,它递增编号。当前指令占用的字节数
【讨论】:
EIP 移动到下一条指令。
Points the EIP to the first instruction
EIP--> 1.instruction 1 with 2 bytes
2.instruction 1 with 5 bytes
3.instruction 1 with 3 bytes
Adds the byte length of the instruction to EIP(move 2 bytes ahead)
1.instruction 1 with 2 bytes
EIP--> 2.instruction 1 with 5 bytes
3.instruction 1 with 3 bytes
将指令的字节长度添加到 EIP(前移 5 个字节)
1.instruction 1 with 2 bytes
2.instruction 1 with 5 bytes
EIP--> 3.instruction 1 with 3 bytes
【讨论】: