内联汇编基础知识

甩甩の头发

甩甩の头发

2016-01-29 12:18

内联汇编基础知识,内联汇编基础知识

内联汇编基础知识
       作者:释雪

几天看了孙原等几位仁兄关于汇编语言的几篇文章,颇感兴趣。于是查了查98版的MSDN中,其中也有几篇关于内联汇编的基础,索引字是asm。讲得不算太难,于是试着将其内容写下来了,特此贴来。
     
      一、 内联汇编简述
     
       Visual C++ 6.0编译器下,内联汇编可以使用所有的Intel486处理器指令集。而且可以对目标处理器建立起伪指令来实现附加指令功能。内联汇编可以使用MASM编译器所允许的表达式,其中的一些表达式可以通过操作符和操作数的组合,对单精值进行运算.
       
       虽然内联汇编可以访问CC++中的数据变量以及类对象,但它不可能通过MASM指令和操作符来定义数据及对象。尤其你还不能使用DB, DW, DD,         DQ, DT和DF等定义指令以及DUP和This操作符。汇编中的结构记录也不是可用的。内联汇编也不支持directives STRUC, RECORD,         WIDTH, 和 MASK指令。不过,在内联汇编可以使用到一个_emit宏指令,它类似于MASM中的DB指令,它可以在本区域内定义出一个字节型,虽然它每次只能定义一个字节出来,但还是可以用它来定义出一个字符串,请看示例:        

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)
#define randasm __asm _emit 0x4A __asm _emit 0x43 __asm _emit 0x4B …__asm {     randasm}

           虽然内联汇编不支持MASM中的很多指令,但它支持EVEN 和 ALIGN指令。它们被用于那些需要使用align labels来指定分界线的汇编指令。

内联汇编不可以是一个宏汇编程序,你不可以使用MASM中的宏定义指令以及宏操作符。但内联汇编是可以使用CC++中的预理指令来定义宏。

在处理段时,你只能使用寄存器,而不是通过名字,因为在内联汇编中这是非法的。而且段必须显式地使用寄存器,如: ES:[BX]

在内联汇编使用操作符LENGTH, SIZE, 和 TYPE可以来对变量以及类型进行长度的测量,你可以使用它们来求得CC++中的变量及类型的长度:

*LENGTH操作符可以返回在一个变量数组中的元素个数,如果返回为1则代表这不是一个变量数组。

*SIZE操作符可以求得一个变量及类型的总长度。这个值也可以由LENGTH与TYPE积来求得。

*TYPE操作符可以求得一个变量及类型的长度,与SIZE不同的是,如果变量名是一个数组的话,则返加这个数组中单个元素的长度。

具体情况请看下表:

__asm          C          SizeLENGTH arr          sizeof(arr)/sizeof(arr[0])          8SIZE arr          sizeof(arr)          16                          TYPE arr          sizeof(arr[0])          2

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)

包含着内联汇编的程序可以使用/Zi选项编译,从而来进行代码级的调试工作。这样,你就可以同时在CC++程序段与内联汇编段中设置断点,如果你使用/Fas选项允许混合汇编与CC++源程序调试方式,那么你就可以看到混合着汇编与源程序的代码集合。

Visual C++编译器允许你在内联汇编程序中使用Intel处理器的MMX指令集。不过如果使用MMX指令集编译器会发生警告。更多的信息请查看MSDN的Web站点。

二、         关于内联汇编的具体使用说明:
       
       
因为内联汇编不需要编译与链接过程,因此它比一个汇编程序更为方便。由于它能够访问CC++中的变量及函数,所以它能够更好和你CC++代码融为一体。内联汇编可以在以下方面进行编程:

*用汇编语言编写函数。
     *使用汇编语言来产生速度最优化代码段。
     *直接使用汇编语言来对硬件进行访问。
     *为naked函数调用编写保护现场和恢复现场代码( prolog and epilog code)
     

如果你计划在不同机器上运行程序的话,那么你应该分别放置不同机种的专一汇编代码。因为内联汇编有一定的机器专一性,它不完全支持所有MASM中的宏与数据类型。

VC不支持C++中的asm关键字,所以你需要使用__asm(两个下划线)关键字来编写你的内联

展开更多 50%)
分享

猜你喜欢

内联汇编基础知识

C语言教程 C语言函数 汇编语言
内联汇编基础知识

胎盘基础知识

电脑网络
胎盘基础知识

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

ECMAScript 基础知识

Web开发
ECMAScript 基础知识

HTML基础知识

Web开发
HTML基础知识

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

护肤基础知识

电脑网络
护肤基础知识

x86内联汇编

编程语言 网络编程
x86内联汇编

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

JSP开发入门(四)--JSP的内部对象

JSP开发入门(四)--JSP的内部对象

解析动态联编(上篇) - 作者:tingya

解析动态联编(上篇) - 作者:tingya
下拉加载更多内容 ↓