x86指令集到底有多少条指令?
天上的星星数得清,x86指令的数目数不清。Stefan Heule介绍了5种指令数目的统计方法[1]。一般统计指令个数通常用汇编语言的助记符。x86的汇编语言通常有AT&T格式和Intel格式两种。之所以有这种差别是Intel格式的助记符通常不区分操作数长度,比如Add指令可能表示16位加法,也可能表示32位加法,而AT&T格式会把不同的操作数区别为不同的指令,如Addw表示16位加法,而Addl表示32位加法。下图是Intel官方给出的指令个数及相关专利的发展趋势[2],从中可以看出,在40年的发展历史中,由不足200条指令到今天的超过1600条指令。最常用的x86指令是哪些?
有很多人都采用不同的方式统计过最常用的x86指令。其中影响最大的是Peter Kankowski在12年前做的一个统计[3]。他对三种非常流行的开源软件(7-Zip压缩工具、LAME编码器和NSIS安装软件)进行了反编译,并统计了最常被用到的20条指令(下图)。 他还统计了 平均指令长度、 操作数的个数以及指令格式等 。从他的统计中我们可以看到MOV指令是最常用的,大概占到35%,有2条浮点运算指令(FLD和FSTP)也排在前20名之内。 后续有很多类似的研究[4-5],研究的方法类似,只是研究的目标软件有所区别,但是结论都差不多。有哪些指令过时了?
Intel(包括他的竞争对手们)设计了那么多条指令,但是常用的指令是很少的,有些指令甚至于已经被逐步废弃或者不建议使用。按照文献6的描述,有一些指令在64位指令集中已经不被支持,包括PUSHA、POPA、BOUND、INTO、BCD指令( A AA、AAS、DAA、DAS、AAD、AAM), 未公开的指令(SALC, ICEBP)、SYSENTER、SYSEXIT和ARPL等。Bruno Lopes等人分析了1995年至2012年的一部分软件[7],发现随着时间的推移,指令的使用情况也发生了很大的变化。下图就是Linux和Windows操作系统的指令演变。可以看出操作系统使用的指令数是不断增加的,这是因为更多新指令被加到x86指令集中并被操作系统所利用。过时 (Outdated )指令是这么定义的:如果分析软件发现从某一年开始某条指令就没有人使用了,就定义其为过时指令。例如由于64位地址模式的引入,像LES、PUSH ES这样的指令从Ubuntu 8以后基本就不使用了。 不过有些老指令仍然顽强地活着。例如Intel推出了很多矢量计算指令,如MME/SSE/AVX,按理说常规的x87浮点指令就应该退出舞台了,但事实上仍然有很多软件在使用x87指令。不同软件使用的指令是不是不同
不同软件使用的指令是否有所不同呢?答案是肯定的。下图是恶意软件和普通软件的指令对比(左侧是恶意软件,右侧是普通软件)[8],根据这种统计结果,我们就可以通过分析软件所使用的指令来找出恶意软件。参考文献
[1]Stefan Heule,How Many x86-64 Instructions Are There Anyway?https://stefanheule.com/blog/how-many-x86-64-instructions-are-there-anyway/,2016-3-7
[2]Steven Rodgers and Richard A. Uhlig,X86: Approaching 40 and Still Going Strong,https://newsroom.intel.com/editorials/x86-approaching-40-still-going-strong/,2017-6-8
[3]Peter Kankowski,x86 Machine Code Statistics,https://www.strchr.com/x86_machine_code_statistics
[4]Akshintala, Amogh , et al. "x86-64 instruction usage among C/C++ applications." the 12th ACM International Conference ACM, 2019. pp. 68–79
[5]A. H. Ibrahim, M. B. Abdelhalim, H. Hussein and A. Fahmy, "Analysis of x86 instruction set usage for Windows 7 applications," 2010 2nd International Conference on Computer Technology and Development, Cairo, 2010, pp. 511-516
[6]Agner Fog,Instruction tables: Lists of instruction latencies, throughputs and micro-operation breakdowns for Intel, AMD and VIA CPUs,https://www.agner.org/optimize/instruction_tables.pdf,2020-9-2
[7]Lopes, Bruno , et al. "ISA Aging: An X86 case study." Seventh Annual Workshop on the Interaction Amongst Virtualization, Operating Systems and Computer Architecture (WIVOSCA 2013) 2013.
[8]Bashari Rad, Babak & Masrom, Maslin & Ibrahim, Suhaimi & Ibrahim, Subariah. (2011). Morphed Virus Family Classification Based on Opcodes Statistical Feature Using Decision Tree. Communications in Computer and Information Science. 251.
公众号近期内容回顾16级本科生王玮琪同学的论文被IEEE Networking Letters录用
2020版课题组文化衫出炉
MASM32 SDK在Win10上无法安装怎么办
喜报 | 课题组在第十五届研究生电子设计竞赛全国总决赛获得三项荣誉
自组网中自适应多速率传输技术研究
无线自组网高精度网络时间同步算法
回忆杀 | 课题组文化衫2009~2019
微信号: bitpmcrg 欢迎关注北京理工大学专业移动通信组的公共号“北理工通信课题组”
求分享
求点赞
求在看