2.asm-asm内联汇编

在VC++中,__asm伪指令可放在汇编语句的前面或用于标记一块汇编语句

	__asm pushfd   // 一个语句
	__asm// 一个语句块
	{
		pushad
		//todo
		popad
		popfd
	}
注释建议直接使用C++的注释方式,这样可以避免与C宏冲突


以下为内联汇编的特性:

1.使用任何Intel指令集中的指令

所有的interl指令集可在它的官网上查到:

http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

文档:直接打开搜索就好了

2.asm-asm内联汇编_第1张图片


2.使用寄存器操作数

3.通过名字引用函数参数

4.可以引用在汇编语句块外面声明的代码标号和变量

5.在语句中支持使用PTR操作符

inc WORD PTR[eax]
6.使用EVEN和ALIGN伪指令

以下是不能使用的特性:

1.不能使用数据定义伪指令,如DB(BYTE)和DW(WORD)等

2.不能使用汇编操作符(PTR除外)

3.不能使用STRUCT 、RECORD、WIDTH和MASK

4.不能使用宏伪指令,包括MACRO、REPT、IRC、ENDM或宏操作符(<>,!,&,%)

5.不能引用段名,但可使用段寄存器作为操作数

由于__fastcall会导致编译器使用寄存器来传递参数,最好不好同时使用__fastcall和__asm


汇编内部和外部的偏移地址可以直接取得:


可以看出直接使用mov eax,s等同于mov eax, offset s

汇编内部和外部的偏移地址都可以通过lea或offset取得

如:

char *g_char ="1234";
int _tmain(int argc, _TCHAR* argv[])
{
	__asm pushfd   // 一个语句
	__asm// 一个语句块
	{
		pushad
		//todo
s:
		lea eax,s
		mov ebx,offset g_char// 取得的是g_char这个指针的地址
		
		popad
		popfd
	}


在内联汇编中可以使用LGNGTH,TYPE,和SIZE操作符,但不支持SIZEOF和LENGTHOF

LGNGTH返回数组中元素的数目

TYPE返回下列值之一

1> c/c++类型或标量变量占用的字节数,使用字节对齐规则的

2>结构使用的字节数

3>对数组而言,TYPE返回单个数组元素的大小

	struct st
	{
		int i;
		byte j;
	};
	st obj[3];
	__asm
	{
		pushfd
		pushad
		mov eax, LENGTH obj //3
		mov ebx, TYPE obj   //8
		mov ecx, SIZE obj	//24
	
		popad
		popfd
	}









你可能感兴趣的:(2.asm-asm内联汇编)