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

2017-03-09 15:21:55 +08:00
 silva

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

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

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

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

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

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

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

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

IP 没有办法直接读,应该是没有其他方法了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/346153

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX