jmp
在流行的 x86 架构上,可以使用-type 指令之一以及指令来控制执行流程call
。但两者都是基本的,还是另一种“语法糖”?
例如,该push
指令是语法糖:push eax
相当于mov [esp], eax
后面跟着sub esp, 4
. mov
唯一的基本数据操作也是如此。
但这也是这种情况call
吗?是否有其他一些指令可以达到同样的效果?
在伪代码中,如果我可以访问指令指针,我可以编写一个函数调用:jmp
bar:
push eip ;; pseudo-code! ;; call foo
jmp foo
foo:
pop eax ;; ret
jmp [eax]
这不是有效的 x86,因为eip
不能直接读取指令指针寄存器。到目前为止,我所见过的所有获得eip
all use价值的“技巧” call
。或者call
实际上是在 x86 上读取指令指针的规范方式?作为一个额外的问题,可以实现 C 的每个架构是否都需要一种读取指令指针的方法,以便可以实现函数指针?
int main(int argc, char * argv[])
{
int (*p)() = strtoul(argv[1]);
return p(); // how to implement without
// accessing the instruction pointer?
}
[这不是一个深奥的问题;知道函数不仅是高级编程语言引入的抽象,而且实际上是硬件固有的,我只是觉得在情感上很令人满意。]