CPU 刚唤醒在实模式时,我打算获取当前 PC 位置来计算程序内的指令跳转位置偏移。但是由于此时栈还没有设置,函数调用读栈的方式恐怕没法用
请问有没有哪位大侠有方法?
或者有不通过固定地址内存传参的方式也可以
1
MiguelValentine 2017-03-09 15:48:40 +08:00
当前的 pc 位置是指什么?你这个需要改引导扇区到自己的代码段,执行完再跳回去。
实模式的起点是 0x7c00 |
2
wevsty 2017-03-09 16:04:54 +08:00
跳转不是直接 jmp 不就得了?一般汇编里面不是直接都有标签来解决这个问题么?指令跳转位置偏移我不太清楚是指的什么。
如果是说: 下一条要执行的指令的地址-要跳转到的目标指令地址=offset (偏移) 那所谓指令跳转位置偏移,就是 EIP-目标指令的地址。 |
3
silva OP @MiguelValentine
谢谢回复,指的就是当前 EIP 的位置,我这里的情况是运行地址是可变的,因此想获取是从哪里开始的 @wevsty 谢谢回复,我需要知道的是 EIP 位置用来进行计算,跟跳转没有关系的。 |
4
wevsty 2017-03-09 21:37:49 +08:00
@silva
我的理解是这样的, CPU 上电以后初始化,那么 SS 和 SP 就会被初始化( SS 和 SP 都被置 0 ),这个实际上就是已经初始化了栈空间,这样才能保证 PUSH 指令能使用,所以不存在栈还没有设置这种情况。 IP 不能直接被读取,只能通过 PUSH 的方法间接读取。 |
5
MiguelValentine 2017-03-10 09:19:59 +08:00
mov ax,1
mov ss,ax push ip pop bx 实模式有 eip 吗?不是 CS:IP 吗 |
6
misaka19000 2017-03-10 11:17:17 +08:00
这玩意不是应该在写代码的时候自己计算好吗,也就是应该在汇编中计算得到然后写死
|
7
silva OP @misaka19000
但是起始地址不定的情况下就很麻烦了 @MiguelValentine 嗯,谢谢,实模式下是 IP 。 你那种方法会破坏堆栈地址处的内容,只能算是函数调用查看堆栈的变体 @wevsty 我的场景是系统已经起来了,后续再在其他 CPU 上搞事。由于前面的空间已经被使用了,如果代码没有自己定位自己位置的能力。任何使用栈来获取的方式都是有潜在风险的。 如果没有其他方法,就只能让外面改框架了 |