前次已经为大家讲过了如何在 VC 中使用在线汇编,今次要讲的是专门针对 C++ 的一点技巧。
写这段文字的动机是因为自己最近开始由 C 改到用 C++ 了,所以自然就会去思考如何在 C++ 中使用在线汇编。经过一些尝试以后,有了那么一小点的心得,便顺手记下来以供大家参考。
要在 C++ 中使用在线汇编,同我们前面讲的在 C 中使用在线汇编并没有本质区别,唯一要考虑的问题是如何处理 C++ 中的 THIS 指针。
分析 VC 编译成的汇编代码可以看到,很明显是由 ECX 寄存器来把 THIS 指针的内容传递给 C++ 的类函数的。因此我们在类函数中引用类的数据时,就可以利用这点来完成我们所需要的操作。
在类函数中使用在线汇编时,假设该类有一个数据成员 Data,其类型是长整型(双字),我们就可以按照下面这种形式来访问它:
MOV EAX, [ECX] this.Data
但你也可能会担心,如果在类函数中使用在线汇编之前还有其它的指令,这时很可能 ECX 寄存器的内容已经被破坏了,其值根本不是 THIS 指针的内容了,这时该怎么办?
这个问题其实很好解决,VC 编译成的类函数汇编代码中,会自动把由 ECX 传递来的 THIS 的内容保存于堆栈中,你可以先取到寄存器,再做剩下的操作就可以了,示例如下:
MOV ECX, this MOV EAX, [ECX] this.Data
最后提醒大家注意的是,以上所讲的只是一种简单的示意性的处理方法,没有去考虑任何效率优化,所以实际上高效的处理代码根本不是这样写的。你如果有兴趣的话,可以在此基础上做进一步的研究,千万不要就此停滞不前哦。
|