Visual C++ Inline Assembly 简介
2005-04-01 21:13
525 查看
(注:本文章摘抄自不知名处,很久之前的了,非本人所著)
如果你想编写出极高性能的游戏代码,那么使用汇编语言无疑将会是你的最佳选择。不过,眼看着编程技术已经发展到了今天这种格局,你再去直接用汇编语言来进行编程也未免太不合时宜了吧。作为一个高性能游戏程序的编写者,你应该用的是 Inline Assembly。
什么是 Inline Assembly
Inline Assembly 就是我们通常所说的在线汇编,即直接在你的 C/C++ 代码里加入汇编语言代码。
在线汇编的好处
那些习惯了在线汇编的人都觉得它用起来很方便。
同传统的汇编方式相比,我们可以完全避免那些烦琐的汇编和链接步骤,可以直接在汇编代码中使用 C 变量名和函数名。这样一来,我们的汇编代码就能够很容易地同我们的 C 语言程序紧密而自然地结合在一起了。另外,由于是把汇编语句和 C 或者 C++ 语句混合在一起进行编程,我们还将能实现许多原来光凭 C 或者 C++ 语句无法办到的事。
在线汇编的用处
通常,在线汇编被用来写某些特殊函数,例如优化代码中对速度有极高要求的部分,直接访问硬件和设备驱动程序和为一段调用代码编写进入和退出时用到的保护性代码等等。
在线汇编的限制
一方面,在线汇编是一种专用工具,它不支持宏汇编中的宏和其它一些功能。另一方面,当你想往不同的平台移植程序代码时,这些机器相关的代码会比较难于处理。
如何在 Visual C++ 环境中使用在线汇编
在 Visual C++ 环境下,使用在线汇编是一件非常容易的事情:你只要用一条“_asm { }”把你的汇编代码括起来就行了。
下面给大家看一个简单例子,这个例子是要实现一个叫 Mycode() 的 C 函数。这个函数的功能很简单,它把两个输入参数的值相加,结果存放到另外一个全局变量中。
long result;
void Mycode(long a, long *b)
那么在 inline asm 里就多了两个常量:
MYSTRUCT.x 是 0
MYSTURCT.y 是 4
它们表示了 x,y 在结构中的偏移量。所以你就可以用:
MYSTURCT *a;
mov ebx,a;
mov eax,[ebx]MYSTRUCT.x;
(eax 里就是 a->x)
上面一行也可以写成
mov eax,[ebx+MYSTRUCT.x];
另外,VC 中你也可以创建一个函数不帮你做栈处理的,需要你自己来取输入参数、保护寄存器、甚至自己写 ret 等等。这可以看做一个“纯粹”的 asm 函数了。方法是在函数定义前加入:
__declspec(naked)
就可以了。
VC inline asm 里可以用 ALIGN n 来对齐代码。如果需要填入数据,VC 将填入一些不改变任何寄存器和标志位的指令(不一定是 nop),不过小心 VC 在这方面有 bug,我的主页(cloudwu.yeah.net)上曾详细讲解。
另外,在 VC 的 inline asm 里不象我们在 BC 的 inline asm 里那样简洁的用 db 来插入一些非代码的数据,它要用 _emit n 插入一个字节。这有时很有用,比如 Pentium 的 cpuid 指令 VC 就不支持,我们可以用:
#define cpuid __asm _emit 0x0F __asm _emit 0xA2
来代替就可以了。
如果你想编写出极高性能的游戏代码,那么使用汇编语言无疑将会是你的最佳选择。不过,眼看着编程技术已经发展到了今天这种格局,你再去直接用汇编语言来进行编程也未免太不合时宜了吧。作为一个高性能游戏程序的编写者,你应该用的是 Inline Assembly。
什么是 Inline Assembly
Inline Assembly 就是我们通常所说的在线汇编,即直接在你的 C/C++ 代码里加入汇编语言代码。
在线汇编的好处
那些习惯了在线汇编的人都觉得它用起来很方便。
同传统的汇编方式相比,我们可以完全避免那些烦琐的汇编和链接步骤,可以直接在汇编代码中使用 C 变量名和函数名。这样一来,我们的汇编代码就能够很容易地同我们的 C 语言程序紧密而自然地结合在一起了。另外,由于是把汇编语句和 C 或者 C++ 语句混合在一起进行编程,我们还将能实现许多原来光凭 C 或者 C++ 语句无法办到的事。
在线汇编的用处
通常,在线汇编被用来写某些特殊函数,例如优化代码中对速度有极高要求的部分,直接访问硬件和设备驱动程序和为一段调用代码编写进入和退出时用到的保护性代码等等。
在线汇编的限制
一方面,在线汇编是一种专用工具,它不支持宏汇编中的宏和其它一些功能。另一方面,当你想往不同的平台移植程序代码时,这些机器相关的代码会比较难于处理。
如何在 Visual C++ 环境中使用在线汇编
在 Visual C++ 环境下,使用在线汇编是一件非常容易的事情:你只要用一条“_asm { }”把你的汇编代码括起来就行了。
下面给大家看一个简单例子,这个例子是要实现一个叫 Mycode() 的 C 函数。这个函数的功能很简单,它把两个输入参数的值相加,结果存放到另外一个全局变量中。
long result;
void Mycode(long a, long *b)
那么在 inline asm 里就多了两个常量:
MYSTRUCT.x 是 0
MYSTURCT.y 是 4
它们表示了 x,y 在结构中的偏移量。所以你就可以用:
MYSTURCT *a;
mov ebx,a;
mov eax,[ebx]MYSTRUCT.x;
(eax 里就是 a->x)
上面一行也可以写成
mov eax,[ebx+MYSTRUCT.x];
另外,VC 中你也可以创建一个函数不帮你做栈处理的,需要你自己来取输入参数、保护寄存器、甚至自己写 ret 等等。这可以看做一个“纯粹”的 asm 函数了。方法是在函数定义前加入:
__declspec(naked)
就可以了。
VC inline asm 里可以用 ALIGN n 来对齐代码。如果需要填入数据,VC 将填入一些不改变任何寄存器和标志位的指令(不一定是 nop),不过小心 VC 在这方面有 bug,我的主页(cloudwu.yeah.net)上曾详细讲解。
另外,在 VC 的 inline asm 里不象我们在 BC 的 inline asm 里那样简洁的用 db 来插入一些非代码的数据,它要用 _emit n 插入一个字节。这有时很有用,比如 Pentium 的 cpuid 指令 VC 就不支持,我们可以用:
#define cpuid __asm _emit 0x0F __asm _emit 0xA2
来代替就可以了。
相关文章推荐
- Visual C++ Inline Assembly 简介
- [转]Visual C++ Inline Assembly 简介
- Visual C++ Inline Assembly 简介
- Visual C++ Inline Assembly 简介
- Using Inline Assembly in C/C++
- Command Line Applications with Visual Studio 2008 and C++ Posted by omniplex in Errors
- Assembly-Line scheduling------code in c++
- Defining Bytes in GCC Inline Assembly in Dev-C++(.
- Programming with ADO in Visual C++
- 专题 18 Inline Assembly(在C语言中嵌套使用汇编)
- Exporting a function in a DLL using Microsoft Visual C++ 6.0
- MATLAB编译c++出错的解决办法(Error in compile (line 439) mex(args{:});)
- Command Line Arguments in C++
- Highlight Current Line in Visual Studio 2010
- C++ inline 函数
- Inline Assembly in VC++ and gcc
- How to create a resizeable dialog box with scroll bars in Visual C++
- New Features in Visual c++ 2008
- A LNK2005 error occurs when the CRT library and MFC libraries are linked in the wrong order in Visual C++
- C++ inline