【问题标题】:Program proccessing程序处理
【发布时间】:2013-09-19 02:06:43
【问题描述】:

于是我发现当程序执行时,EIP指针被设置为代码段中的第一条指令,处理器做了一个执行循环:

  1. 将 EIP 指向第一条指令
  2. 将指令的字节长度添加到 EIP
  3. 执行在步骤 1 中读取的指令
  4. 返回 1

我的问题是,第 2 步会发生什么?

请回复 谢谢

【问题讨论】:

    标签: c memory assembly processor


    【解决方案1】:

    EIP 获取下一条指令的地址。

    【讨论】:

      【解决方案2】:

      如果您有这样的说明:

      0x1000 INSTR_1
      0x1004 INSTR_2
      0x1007 INSTR_3 /* instructions can have different size */
      

      EIP 包含0x1000,您需要更新EIP 使其指向第二条指令(0x1004),以便它可以在下一次迭代中执行它。如果您不这样做,您将始终执行第一条指令。

      因为指令可以有不同的大小,你不能只添加常量(如果所有指令都具有相同的大小,你可以这样做,就像在 RISC 中一样),但你需要添加你的指令的长度刚读。所以,在第一条之后,你将添加 4,使其指向第二条,在第二条指令之后,你将在 EIP 中添加 3,它将指向第三条指令。

      【讨论】:

      • 感谢您的回答。但是您能否也向我解释一下指令长度?我在网上搜索过,这些东西太技术性了,我对此有点“新”。谢谢。
      • @EvgenyDanilenko 指令长度只是指令在存储它的内存中占用的字节数。在我的示例中,INSTR_1 的长度为 4,INSTR_2 的长度为 3。
      • 嗯我现在有点困惑,在我的书中它说 0x00fc45c7 是 4 个字节(字); 00[1]fc[2]45[3]c7[4]。在您的示例中,0x1000 是 4 个字节,但为什么 0x1004 不是 4 个字节长?是因为当您添加指令长度时,它会减少-1?我猜这就是 INSTR_3 为 0x1007 的原因:4-​​1=3 4+3=7 >>> 0x1007。我对吗?谢谢你的回复:))
      • @EvgenyDanilenko 0x1000 只是存储 INSTR_1 的内存地址。想象一下 INSTR_1 是 0x00fc45c7 并且它从地址 0x1000 开始存储。知道指令的地址很重要,因为EIP不包含指令数据,而是指令的地址(因此Instruction POINTER
      • 谢谢,我明白了,我要问的是为什么指向这个内存地址 0x1004 的指针增加了 3 而不是 4?我的意思是 0x1000 和 0x1004 的大小是 4 个字节。是不是因为在添加指令长度之后它会减少-1? 0x1000(4 个字节因此向 EIP 添加 4 个字节) 0x1004(大小 4 个字节。减 -1 > 字节长度为 3。EIP(0x1004+3))0x1007 等
      【解决方案3】:

      "2. 将指令的字节长度添加到 EIP"

      递增 EIP 以指向下一条指令,它递增编号。当前指令占用的字节数

      【讨论】:

        【解决方案4】:

        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   
        

        【讨论】:

          猜你喜欢
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-21
          • 2019-09-16
          • 1970-01-01
          • 2011-07-15
          • 1970-01-01
          相关资源
          最近更新 更多