在内核模式或其他模式下,可以直接读取Intel CPU上的程序计数器(即没有"技巧")吗?
我使用Linux与x86(准确地说是64位).有没有办法可以得到当前指令的地址.其实我想写自己的简化版本的setjmp/longjmp.在这里,R ..发布了longjmp的简化版本.知道如何实现setjmp.一个简化的版本,没有考虑异常和信号等...
对于32位Windows应用程序,使用ESP下面的堆栈内存进行临时交换空间而不显式减少ESP是有效的吗?
考虑一个返回浮点值的函数ST(0).如果我们的价值目前在EAX,我们会,例如,
PUSH EAX
FLD [ESP]
ADD ESP,4 // or POP EAX, etc
// return...
Run Code Online (Sandbox Code Playgroud)
或者不修改ESP寄存器,我们可以:
MOV [ESP-4], EAX
FLD [ESP-4]
// return...
Run Code Online (Sandbox Code Playgroud)
在这两种情况下都会发生同样的事情,除了在第一种情况下我们注意在使用内存之前递减堆栈指针,然后在之后递增它.在后一种情况下,我们没有.
尽管有任何实际需要在堆栈上持久保存这个值(重入问题,在PUSH返回值和读取值之间的函数调用等),有没有任何根本原因,为什么写入ESP下面的堆栈这样会无效?
我想写一个C程序,它会打印程序计数器的内容PC.可以从用户空间或程序集中完成,还是使用某些特定的内核例程?