目录
频道首页
内联汇编(一)——内联汇编之32位程序
收藏
0
背景
内联汇编是指在 C/C++ 代码中嵌入的汇编代码,与全部是汇编的汇编源文件不同,它们被嵌入到 C/C++ 的大环境中。内联汇编方式两个作用,一是程序的某些关键代码直接用汇编语言编写,可提高代码的执行效率;二是有些操作无法通过高级语言实现,或者实现起来很困难,必须借助汇编语言达到目的。
32 位程序和 64 位程序下使用内联汇编的方式,有很大的差别。现在,我们对此分别进行介绍。本篇文章主要介绍的是在 32 位程序中使用内联汇编。
实现过程
使用内联汇编要用到 __asm 关键字,它可以出现在任何允许 C/C++ 语句出现的地方。对 __asm 关键字的使用有两种方式:
__asm 块,要添加大括号。
__asm { // 汇编代码 }
__asm 语句,在每条汇编指令之前加 __asm 关键字。
__asm // 汇编代码
显然,第一种方法与 C/C++ 的风格很一致,并且把汇编代码和 C/C++ 代码清楚地分开,还避免了重复输入 __asm 关键字,因此推荐使用第一种方法。
不像在 C/C++ 中的“{ }”,__asm 块的“{ }”不会影响 C/C++ 变量的作用范围。同时,__asm 块可以嵌套,而且嵌套也不会影响变量的作用范围。
为了与低版本的 Visual C++ 兼容,_asm 和 __asm 具有相同的意义。另外,Visual C++ 支持标准 C++ 的 asm 关键字,但是它不会生成任何指令,它的作用仅限于使编译器不会出现编译错误。要使用内联汇编,必须使用 __asm 而不是 asm 关键字。
编码实现
void MyFunc(char *pszText)
{
printf("%s\n", pszText);
}
int _tmain(int argc, _TCHAR* argv[])
{
char str1[] = "__asm{ }";
char str2[] = "__asm";
// 32位程序内联汇编 第一种方式
__asm
{
lea eax, str1
push eax
mov eax, MyFunc
call eax
}
// 32位程序内联汇编 第二种方式
__asm lea eax, str2
__asm push eax
__asm mov eax, MyFunc
__asm call eax
system("pause");
return 0;
}
程序测试
我们直接运行程序,程序成功显示两行字符串,说明两种方式的内联汇编均使用成功。
总结
在 32 位程序中使用内联汇编比较方便,就两种形式,一种是有大括号的:
__asm
{
// 汇编代码
}
另一种是没有大括号的:
__asm // 汇编代码
这两种方式是等价的,大家可以根据自己的程序需要,自行选择使用哪种方式即可。
主页
会议室
Git管理
文章
看板
留言墙