Why can't you set the instruction pointer directly?

前端 未结 4 1730
陌清茗
陌清茗 2020-11-27 06:09

The Wikipedia article about x86 assembly says that \"the IP register cannot be accessed by the programmer directly.\"

Directly means with instructions like mov and a

4条回答
  •  执笔经年
    2020-11-27 06:22

    You can't access it directly because there's no legitimate use case. Having any arbitrary instruction change eip would make branch prediction very difficult, and would probably open up a whole host of security issues.

    You can edit eip using jmp, call or ret. You just can't directly read from or write to eip using normal operations

    Setting eip to a register is as simple as jmp eax. You can also do push eax; ret, which pushes the value of eax to the stack and then returns (i.e. pops and jumps). The third option is call eax which does a call to the address in eax.

    Reading can be done like this:

    call get_eip
      get_eip:
    pop eax ; eax now contains the address of this instruction
    

提交回复
热议问题