得C/C++中变量的大�
。桓霰淞康拇笮∈荓ENGTH和TYPE的乘积
。TYPE用来取得一个变量的大小
,如果是一个数组
,它得到的一个数组中的单个元素的大小。
?8.注释
?可以使用C/C++的注释,但推荐用ASM的注释,即";"号。
?9._EMIT伪指令
?_EMIT伪指令相当于MASM中的DB,但一次只能定义一个字节,比如:
???__asm
???{
?????JMP?? _CodeOfAsm
?????_EMIT? 0x00??; 定义混合在代码段的数据
?????_EMIT? 0x01
???_CodeOfAsm:
?????; 这里是代码
?????_EMIT? 0x90??; NOP指令
???}
四、在__asm块中使用C/C++语言元素
?C/C++与汇编可以混合使用,在内联汇编可以使用C/C++的变量和很多其它C/C++的元素。在__asm块中可以使用以下C/C++元素:
?1.符号,包括标号、变量和函数名;
?2.常量,包括符号常量和枚举型(enum)成员;
?3.宏定义和预处理指示符;
?4.注释,包括"/**/"和"//";
?5.类型名,包括所有MASM中合法的类型
?6.typedef名称, 像PTR、TYPE、特定的结构成员或枚举成员这样的通用操作符。
?在__asm块中,可以使用C/C++或ASM的基数计数法(比如: 0x100和100H是相等的)。
?__asm块中不能使用像<<一类的C/C++操作符。C/C++和MASM通用的操作符,比如"*"和"[]"操作符,都被认为是汇编语言的操作符。举个例子:
???int array[[10]];
???__asm MOV array[[6]], BX ;?Store BX at array+6 (not scaled)
???array[[6]] = 0;???? /* Store 0 at array+12 (scaled) */
?* 小技巧: 内联汇编中,你可以使用TYPE操作符使作其与C一致。比如,下面两条语句是一样的:
???__asm MOV array[[6 * TYPE int ], 0 ; Store 0 at array + 12
???array[[6]] = 0;????????? /* Store 0 at array + 12 */
?内联汇编能通过变两名直接引用C/C++的变量。__asm块中可以引用任何符号,包括变量名。
?如果C/C++中的类、结构或者枚举成员具有唯一的名称,如果在"."操作符之前不指定变量或者typedef名称,则__asm块中只能引用成员名称。然而,如果成员不是唯一的,你必须在"."操作符之前加上变量名或typedef名称。例如,下面的两个结构都具有same_name这个成员变量:
???struct first_type
???{
?????char *weasel;
?????int same_name;
???};
???struct second_type
???{
?????int wonton;
?????long same_name;
???};
?如果按下面声明变量:
???struct first_type hal;
???struct second_type oat;
?那么,所有引用same_name成员的地方都必须使用变量名,因为same_name不是唯一的。另外,上面的weasel变量具有唯一的名称,你可以仅仅使用它的成员名称来引用它:
???__asm
???{
?????MOV EBX,
希望这篇
在 C++中使用内联汇编(2)的文章能够对您有所帮助,如果您觉得这篇网站维护教程有用的话,别忘了推荐给您的朋友哦!如果您有好的经验方法,不妨拿出来和大家一起分享:假如每个人都拿出一个经验,那么我们都将额外的获取一堆他人的经验。
请记住本站永久域名:(黑客防线网安服务器维护方案维护基地)Www.Rongsen.Com.Cn