最近看到rpcs3中用到了asmjit,就去其官方项目上看了一下,根据描述是个即时生成目标平台汇编代码的库,但是看了一下样例之后发现有些东西还是没法完全理解。其中之一就是ret指令。在样例代码中是这么写的:

  ...
  x86::Assembler a(&code);
  a.mov(x86::eax, 2);
  a.add(x86::eax, -3);
  a.ret();
  ...

然后就想,既然Assembler模拟的是汇编指令,那么ret指令返回EAX的值会不会是某种约定呢? 然后打算查阅Intel的汇编指令手册,官方名叫Intel® 64 and IA-32 Architectures Software Developer’s Manual,里面有对指令的详细介绍。看到ret指令对应的伪代码有整整几页,有点慌啊。。 其中有这么几句:

IF top 4 bytes of stack not within stack limits
    THEN #SS(0); FI;
EIP ← Pop();

当时就对这个#SS(0);有点迷惑。然后在谷歌上查到了相似的使用方法,但是仍然没看到正式的定义。但是在一个网站上可能看到了类似的定义(http://www.scs.stanford.edu/05au-cs240c/lab/i386/RET.htm,惊了,是斯坦福):

Protected Mode Exceptions #GP, #NP, or #SS, as described under "Operation" above; #PF(fault-code) for a page fault

然后便开始猜测#<abbr>(<val>)的用法为带返回码的异常抛出:其中PF对应page fault的话,根据搜索,SS对应的为stack smashing,即栈溢出;GP对应general peotection,该机制旨在确保程序访问有效的地址区域;但是NP这个not present就有点搞不懂了。。似乎是指什么不存在?

虽然还是有对不上的。。但是大部分意义都是可以对上的,因而认为猜测正确。

总而言之,这个格式的意义是明白了:Intel使用的伪代码中的异常抛出语句。

标签: none

添加新评论