Electronic Joint Business

Solution for E-Business

masm

在 Visual C++ 中使用嵌入汇编

文章评价:
如果你的应用对性能要求十分严苛,使用汇编语言来进行编程无疑是最佳选择。不过,编程技术发展到今天,代码动辄百万行,直接用汇编语言来进行编程,成本实在太高了。作为一种折中方案,你可以选择在部分代码里使用汇编语言 — Inline Assembly 以达到改善性能的目的。
 
所谓嵌入汇编 — Inline Assembly 也叫做内联汇编,即直接在 C/C++ 代码里加入汇编语言代码。同传统的汇编方式相比,我们可以完全避免那些烦琐的汇编和链接步骤,可以直接在汇编代码中使用 C 变量名和函数名 。这样一来汇编代码就能够很容易地 C 语言程序紧密而自然地结合在一起了。另外,由于是把汇编语句和 C 或者 C++ 语句混合在一起进行编程,我们还将可以实现许多原来光凭 C 或者 C++ 语句无法办到的事。GCC, Visual C++ 等都提供了各自的嵌入汇编的实现。在 Visual C++ 中使用嵌入汇编不需要额外的编译器和联接器,十分的方便。

在 VC++ 中,嵌入汇编主要用于如下场合:

  • 使用汇编语言写函数;
  • 实现那些对速度要求非常高的代码;
  • 设备驱动程序中用于直接访问硬件;
  • “Naked” 函数的 prolog 和 epilog。

所谓 Naked 的函数,VC++ 不帮着做栈处理,需要用户自己取输入参数、保护寄存器、甚至自己写 ret 等等,因此称为 “纯粹”的函数(asm 函数)。有关 Naked 函数可以参考: Rules and Limitations for Naked Functions

嵌入汇编代码的缺点也很明显:代码不易于移植,如果你的程序打算在不同类型的机器(比如 x86 和 ARM)上运行,应当尽量避免使用嵌入汇编。特别要注意,微软在 64 位 VC++ 上已经不再支持嵌入汇编。这时候你应该使用 MASM,因为 MASM 支持更方便的的宏指令和数据指示符。

嵌入汇编关键字
在 Visual C++ 中加入嵌入汇编是只需要使用 __asm 关键字,这点和 C++ 标准不同,VC 不支持 C++ 中的 asm 关键字,所以你需要使用 __asm(两个下划线)关键字来编写你的嵌入汇编代码。这个关键字有两种使用方法:

>>> 阅读全文

 

, , , ,

将嵌入汇编迁移到Windows 64位平台

文章评价:
在 X86 平台上的 Visual C++ 有一个很有用的特性就是,你可以在 C++ 代码中,直接编写汇编语句,而无需外部的汇编工具(如 MASM )。不幸的是,在 X64 和 IA64 平台上,这项特性为微软所抛弃。如果你需要将手上的 32位代码迁移到 X64 或者 IA64 上来,你不得不寻找一些替代的方法,这些方法包括:

  • 将既有的汇编代码修改并保存到独立的文件中,然后用 MASM64 来编译
  • 使用微软的 Compiler intrinsics,它提供了一些类似汇编的功能。
  • 用 C++ 和 Windows API 重写

将汇编代码提出到独立的文件中。
这里有个很简单的嵌入汇编的例子,我们在 C 函数中调用 FPU 指令来完成开方函数的功能。在 C 函数出口处,VC++ 编译器会自动添加复栈指令,所以不必自己编写。那反而会使系统混乱。

int quick_sqrt(__int64 params)
{
        int result=-1;
        __asm
        {
                fild params
                fsqrt
                fistp result
        }
        return result;
}

这个函数等同于下面这个 Naked 函数

__declspec(naked) int quick_sqrt(__int64 params)
{
        int result;
        __asm
        {
                push ebp
                mov ebp, esp
                sub esp, __LOCAL_SIZE

                fild params
                fsqrt
                fistp result
                mov eax, result

>>> 阅读全文

 

, , ,