现在的位置: 首页 > 综合 > 正文

用汇编的眼光看C++(之嵌入汇编)

2013年01月29日 ⁄ 综合 ⁄ 共 1185字 ⁄ 字号 评论关闭

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

     嵌入式汇编是对纯汇编文件的一种有益补充。通常会有下面几种情况使用到汇编:(1)提高代码的工作效率 ,使用到cpu的一些特殊指令,比如说mmx指令;(2)对硬件进行某种特殊的操作,比如说关中断等,这在内核级的代码中是比较常见的。但是我们讲究嵌入式汇编的一些基本点和大家一起讨论一下,建议大家和我一起做实验,用事实证明一切。
     (1)使用嵌入汇编的时候,注意寄存器的保护
int process()
{
	__asm
	{
		push ax
		push bx
		push cx
		pop cx
		pop bx 
		pop ax
	}
	return 1;
}

    (2)调用函数的时候,直接使用call即可,返回值用eax传递,同时注意堆栈平衡

int add(int a, int b)
{
	return a + b;
}

int process()
{
	int value = 0;
	__asm
	{
		push eax
		push 2
		push 3
		call add
		add esp, 8
		mov value, eax
		pop eax
	}
	return 1;
}

    (3)计算的时候注意指针和数值的差别

void process()
{
	int value = 0;
	int* address = &value;
	__asm
	{
		push ebx
		mov value, 1
		mov ebx, address
		mov [ebx], 2
		pop ebx
	}
	
	assert(value == 2);
	return ;
}

    (4)全局数据的访问

static int global = 10;

void process()
{
	__asm
	{
		push eax
		mov eax, global
		add eax, 1
		mov global, eax
		pop eax
	}
	
	assert(global == 11);
	return ;
}

    (5)循环的跳转

void process()
{
	int value = 0;
	__asm
	{
		push eax
start:
		mov eax, value
		add eax, 1
		mov value, eax
		cmp value, 10
		jne start
		pop eax
	}
	
	assert(value == 10);
	return ;
}

    (6) 关中断的指令在VC中并不能被执行,会产生异常

void process()
{
	__asm{
		cli
	}
	
	return ;
}

    (7) VC6.0支持MMX指令集,但是VS2005支持MMX和SSE指令集

    (8)如果工程中存在*.asm汇编文件,那么需要按照下面的步骤进行操作
        a) 选择【project】-> 【setting】
        b) 单击左边的工程,选择某一个*.asm文件,右边的tab会出现两个选项,分别是General和Custom Build  
        c) 在Commands中输入对应的编译指令,至于是MASM还是NASM类型,请参考对应的编译手册
【预告: 下面的文章将开始讨论内联函数、静态函数、重载函数等】 

抱歉!评论已关闭.