V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
silva
V2EX  ›  问与答

[求助] 如何在 x86 实模式下获取当前的 PC 的位置

  •  1
     
  •   silva · 2017-03-09 15:21:55 +08:00 · 1498 次点击
    这是一个创建于 2611 天前的主题,其中的信息可能已经有所发展或是发生改变。

    CPU 刚唤醒在实模式时,我打算获取当前 PC 位置来计算程序内的指令跳转位置偏移。但是由于此时栈还没有设置,函数调用读栈的方式恐怕没法用

    请问有没有哪位大侠有方法?

    或者有不通过固定地址内存传参的方式也可以

    8 条回复    2017-03-10 17:35:36 +08:00
    MiguelValentine
        1
    MiguelValentine  
       2017-03-09 15:48:40 +08:00
    当前的 pc 位置是指什么?你这个需要改引导扇区到自己的代码段,执行完再跳回去。
    实模式的起点是 0x7c00
    wevsty
        2
    wevsty  
       2017-03-09 16:04:54 +08:00
    跳转不是直接 jmp 不就得了?一般汇编里面不是直接都有标签来解决这个问题么?指令跳转位置偏移我不太清楚是指的什么。
    如果是说:
    下一条要执行的指令的地址-要跳转到的目标指令地址=offset (偏移)
    那所谓指令跳转位置偏移,就是 EIP-目标指令的地址。
    silva
        3
    silva  
    OP
       2017-03-09 19:38:19 +08:00
    @MiguelValentine
    谢谢回复,指的就是当前 EIP 的位置,我这里的情况是运行地址是可变的,因此想获取是从哪里开始的
    @wevsty
    谢谢回复,我需要知道的是 EIP 位置用来进行计算,跟跳转没有关系的。
    wevsty
        4
    wevsty  
       2017-03-09 21:37:49 +08:00
    @silva
    我的理解是这样的, CPU 上电以后初始化,那么 SS 和 SP 就会被初始化( SS 和 SP 都被置 0 ),这个实际上就是已经初始化了栈空间,这样才能保证 PUSH 指令能使用,所以不存在栈还没有设置这种情况。
    IP 不能直接被读取,只能通过 PUSH 的方法间接读取。
    MiguelValentine
        5
    MiguelValentine  
       2017-03-10 09:19:59 +08:00
    mov ax,1
    mov ss,ax
    push ip
    pop bx

    实模式有 eip 吗?不是 CS:IP 吗
    misaka19000
        6
    misaka19000  
       2017-03-10 11:17:17 +08:00
    这玩意不是应该在写代码的时候自己计算好吗,也就是应该在汇编中计算得到然后写死
    silva
        7
    silva  
    OP
       2017-03-10 17:28:37 +08:00
    @misaka19000
    但是起始地址不定的情况下就很麻烦了

    @MiguelValentine
    嗯,谢谢,实模式下是 IP 。
    你那种方法会破坏堆栈地址处的内容,只能算是函数调用查看堆栈的变体

    @wevsty
    我的场景是系统已经起来了,后续再在其他 CPU 上搞事。由于前面的空间已经被使用了,如果代码没有自己定位自己位置的能力。任何使用栈来获取的方式都是有潜在风险的。

    如果没有其他方法,就只能让外面改框架了
    wevsty
        8
    wevsty  
       2017-03-10 17:35:36 +08:00
    @silva

    IP 没有办法直接读,应该是没有其他方法了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   940 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:30 · PVG 07:30 · LAX 16:30 · JFK 19:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.