`
congfeng02
  • 浏览: 200024 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于内联汇编的几个技巧

阅读更多

关于内联汇编的几个技巧
作者:孙原

下载本文示例代码

有时我们的程序需要一些很高的执行效率或者执行系统底层的功能模块,这些关键的部分我们可以采用内联汇编直接插入汇编指令来达到我们的要求,以下是几个技巧与大家共同探讨.

1. 内联汇编嵌入VC语句:

在VC中内联汇编非常方便,只需要按照如下格式
__asm{

//汇编语句

}

请看如下示例代码

void CAlcmemDlg::OnButton3() 
{	
	DWORD d=(m_size*1024*1024)/sizeof(DWORD);
	DWORD*p=(DWORD*)m_p;
	DWORD s;

	m_pr.SetMin(0);
	m_pr.SetMax((float)d);
	m_pr.SetEnabled(TRUE);

	if(NULL!=m_p){
		__asm{
				mov ecx,d
				mov eax,0
L:				mov edx,DWORD ptr p
				mov [edx+eax],1		//随便写入数据,此处写入1
				inc eax
				mov s,eax
				pushad
		}

		m_pr.SetValue((float)s);

		__asm{
				popad
				loop L
		}
	}
}
请注意示例代码中两个__asm块中的pushad 和 popad 语句,pushad保存了寄存器环境,popad恢复了寄存器环境,使得m_pr.SetValue((float)s);语句对寄存器的影响被抵销,你还可以调用其他任何语句。但建议是尽量少打断内联汇编块,以减少运行时来回倒腾寄存器环境的时间。笔者的测试是,当删除m_pr.SetValue((float)s);并且合并两个__asm块,同时删除pushad,和popad后,速度明显提高。可见这种打断通常是得不偿失。
通常要保存的寄存器环境还有Flags寄存器等,这些视具体情况而定。

2. 自由使用FPU,MMX等指令
void CAlcmemDlg::OnButton4() 
{
	float f_t=.132;
	float f_s=0;
	__asm{
		fld f_s
		fld f_s
		fld f_s

		fld f_t
		fadd f_t
		fst f_t

//		fadd fs
	}
}
可以利用设置断点的方法来观察FPU寄存器的情况,通常你用VC写的代码,不会被编译为引用特殊指令集的代码,虽然微软号称编译器支持这些指令。所以你必须用内联汇编方法来调用这些指令以优化程序,充分利用资源。示例中的代码调用了FPU处理器的指令,使操作浮点数的能力被充分发挥。但当然你还可以调用3DNOW!指令,SSE,SSE2等指令,但笔者没有试过,如果你有什么新的发现,还望赐教,再此先谢了!
总的来说内联汇编提高了速度,尤其是游戏编程,更应该努力使用内联汇编,把CPU充分榨干,但坏处就是有些低端的机器无法运行,兼容性差。同时微软又号称,编译器不会去优化你写的汇编码,他只是简单的翻译为等价的机器码,优化的事情交给你自己来完成,所以你不但得是C++高手,同时还得是汇编高手。不过据我所知这种人十有八九是黑客。我是不鼓励你成为那类人的,撰写此文只为抛砖引玉。

作者信息:
姓名:孙原(2002-8-16于西安)
E-mail:rock.sun@163.net
QQ:41750362
分享到:
评论

相关推荐

    易语言置入代码内联汇编源码.7z

    内联汇编的基本结构通常包括以下几个部分: 1. `__asm`关键字:这是易语言中用来标记内联汇编开始的关键词。 2. 汇编指令:在这个区域内,你可以编写标准的汇编指令,如 MOV(数据传输)、ADD(加法)、SUB(减法)...

    GCC内联汇编, PDF 格式

    AT&T语法与Intel语法存在明显差异,具体表现在以下几个方面: - **操作数顺序**:在AT&T语法中,操作数的顺序是源操作数在前,目的操作数在后。而在Intel语法中,顺序相反,即目的操作数在前,源操作数在后。 - *...

    易语言置入代码内联汇编源码.rar

    易语言的内联汇编通常涉及以下几个方面: 1. **指令集兼容**:易语言内联汇编需要与特定的CPU指令集兼容,例如x86或x64架构下的Intel或AMD汇编指令。 2. **语法嵌入**:在易语言源代码中,内联汇编代码通常被包围...

    GCC内联汇编基础 V2 (修改版)

    ### GCC内联汇编基础详解 #### 一、引言 GCC(GNU Compiler Collection)作为一款功能强大的编译工具集合,支持多种编程语言,并且在系统级编程领域扮演着极其重要的角色。其中,GCC内联汇编是连接高级语言与低级...

    x64下实现内嵌汇编

    1. **汇编语法**:不同的编译器(如GCC、MSVC)可能有不同的内联汇编语法,例如GCC使用`asm`关键字,而MSVC使用`__asm`。 2. **兼容性**:内联汇编代码可能不跨平台,限制了代码的可移植性。尽量只在必要的地方使用...

    使用汇编优化程序的技巧

    文章分为几个部分:汇编基础知识、应用程序二进制接口(ABI)标准、内在函数与内联汇编的使用、库的使用方法以及最后的性能和代码大小优化。 #### 汇编语言的优缺点 - **优点**: - 直接控制硬件资源。 - 在某些...

    VB汇编类

    下面我们将探讨VB汇编类的几个关键知识点: 1. **汇编语言基础**:了解基本的汇编指令,如MOV(移动数据)、ADD(加法)、JMP(跳转)和CALL(调用子程序)等,是使用VB汇编类的前提。汇编语言直接对应于机器码,每...

    x86编译器的汇编优化指南

    在开始编写或优化汇编代码之前,有几个关键因素需要考虑: 1. **决定前的思考**:确定使用汇编语言的目的和优势,同时也认识到它的局限性。通常情况下,使用汇编可以实现更高效的执行速度,尤其是在需要精确控制...

    汇编语言课件之东北大学篇

    课件主要涵盖了以下几个关键知识点: 1. **汇编语言基础**:首先会介绍汇编语言的基本概念,包括什么是汇编语言、为何使用它,以及与高级语言的区别。汇编语言是一种符号化的机器语言,每条指令对应一个特定的机器...

    几十个汇编程序,给那些需要的人

    在IT领域,汇编语言(Assembly)是一种低级编程语言,它是计算机硬件可以直接理解的语言,每一条指令对应一个或几个机器码。汇编程序的标题"几十个汇编程序,给那些需要的人"表明这个压缩包包含了一系列的汇编语言...

    ARM 汇编试验

    本次实验旨在帮助学生掌握以下几个方面: 1. **学会建立工程项目文件**:了解如何使用开发工具创建、管理一个包含多个源文件的工程项目。 2. **掌握ARM汇编语言程序设计**:熟悉ARM架构下的汇编语言语法和编程技巧,...

    汇编语言PPT

    汇编语言是一种低级编程语言,每个指令都对应着计算机硬件中的一个或几个操作,使得程序员能够对计算机的每一个动作进行精确控制。这种语言虽然不像高级语言那样易于理解和编写,但它在某些特定领域,如系统编程、...

    GCC使用教程

    GCC 使用教程主要涵盖以下几个方面: 1. GCC 基本使用:包括 GCC 的基本选项、编译过程、调试方法等。 2. Makefile 编写:Makefile 是 Unix 系统下的一个构建工具,用于自动编译和链接程序。GCC 使用教程详细介绍了...

    有关ARM汇编程序详解

    根据给定文件的信息,我们可以提炼出以下几个重要的知识点: ### ARM 汇编语言基础 **1. ARM 指令集** - **ARM指令集**:ARM指令集是为ARM架构处理器设计的一系列指令集合,它支持多种数据类型和操作,并且能够...

    飞思卡尔汇编指南(自己搜集,好)

    4. **使用内联汇编**:在高级语言(如C/C++)中嵌入关键部分的汇编代码可以进一步优化性能,尤其是在处理关键路径代码时。 #### 六、案例分析:使用汇编优化实时控制应用 假设我们正在开发一个基于飞思卡尔Kinetis...

    易语言源码易语言取汇编指令长度模块源码.rar

    在易语言源码中,"取汇编指令长度"通常涉及到以下几个关键知识点: 1. **汇编指令的理解**:汇编指令是计算机能够直接执行的基本操作,如加法、减法、跳转等。每条指令由一个或多个字节组成,其长度因指令类型和...

    易语言汇编调用过程源码.7z

    易语言汇编调用过程源码通常包括以下几个关键知识点: 1. **易语言结构**:易语言的语法结构和一般的高级语言有所不同,它采用了中文关键字,如“定义”、“创建”等,使得代码更易于理解。同时,易语言支持面向...

    单片机开发中应掌握的几个技巧

    要提高代码效率,可以采取以下几个步骤: 1. 熟悉所用C编译器的优化选项,并试验每条C语言代码编译后对应的汇编语言行数。这样做可以帮助工程师了解哪些C语言结构或语句能被编译器转换成更高效的汇编代码。 2. 在...

    汇编教程电子书

    汇编语言程序由以下几个部分组成: 1. **数据段(Data Segment)**:用于存储常量、变量等数据。 2. **文本段(Text Segment)**:包含程序的指令代码。 3. **堆栈段(Stack Segment)**:处理函数调用和局部变量。...

    程式风格与优化_x86汇编语言

    x86汇编语言的程式风格通常关注以下几个方面: 1. 注释:清晰的注释能帮助理解和维护代码,尤其是在复杂的程序中。应使用有意义的注释来解释代码的功能、逻辑和用途。 2. 命名约定:为寄存器、变量和标签选择有...

Global site tag (gtag.js) - Google Analytics