操作数宽度的内联汇编通用性

时间:2014-07-02 08:03:44

标签: c++ visual-c++ assembly x86 inline-assembly

我的目标是观察几个指令的输出(目标操作数和eflag寄存器),如add,or,xor,和sub等......

为此,我随机向他们输入输入,并记录输出。我将目标指令嵌入到C ++例程中,并且对操作数的widht / signedness有一些通用性:

/* generic operand.  
   W: width, S: signedness 
*/
templates<size_t W, bool S> gen_op { public: typedef size_t type;};

其次是专业化:

template<> gen_op<8U,true> { public: typedef int8_t type;};
...
template<> gen_op<16U,false> { public: typedef uint16_t type;};
...

然后:

template<size_t W, bool S>
gen_op<W,S>::type test_add(gen_op<W,S>::type i1, gen_op<W,S>::type i2)
{
    gen_op<W,S>::type o;
    {
        __asm movzx eax, i1
        __asm add eax, i2
        __asm mov o, eax
    }
    return o;
}

使用pushfd / pop测试eflag寄存器的另一个例程。我知道只使用一个例程并一次报告目标操作数和eflag寄存器会更有效(及时)。

由于我对内联汇编程序(以及汇编程序)都很陌生,所以我希望得到您对结果的方法/有效性的反馈。

在我这边,我看到一个问题:暂时,我将自己限制在8/16/32位操作数。但是当转移到64位操作数时,EAX是不够的。我怎样才能以简单的方式处理这个问题?

0 个答案:

没有答案