C++类---构造汇编操作

今天在atlaux2.h 里面发现一个类,很好奇。

因为他是下面的写法。。。

//ATLAUX2.h            -- COM/ATL Useful Helpers

#pragma pack(push, 1)

template <class T>
class CAuxThunk
{
  BYTE    m_mov;          // mov ecx, %pThis
  DWORD   m_this;         //
  BYTE    m_jmp;          // jmp func
  DWORD   m_relproc;      // relative jmp
public:
  typedef void (T::*TMFP)();
  void InitThunk(TMFP method, const T* pThis)
  {
    union {
      DWORD func;
      TMFP method;
    } addr;
    addr.method = method;
    m_mov = 0xB9;
    m_this = (DWORD)pThis;
    m_jmp = 0xE9;
    m_relproc = addr.func - (DWORD)(this+1);
    FlushInstructionCache(GetCurrentProcess(), this, sizeof(*this));
  }
  FARPROC GetThunk() const {
    _ASSERTE(m_mov == 0xB9);
    return (FARPROC)this; }
};

 

我们知道类在内存里面的结构。。

类名 -> (内存)也是变量 和函数地址存放的地方。

 

现在这个类是在模拟一个 汇编语言的操作。

BYTE 实际上是char 一个字节 

  1. m_mov ecx, %m_this
  2. jmp m_relproc
  3. 返回

0012FF58  B9 58 FF 12 00 E9 8B   筙...閶
0012FF5F  14 2D 00

 

 

我的模拟测试

 

 

 

 

 

看到同样 mov 操作,但是不同操作数就要用不同16进制代码。

这里 B9 地址  ecx是默认调用的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值