x86指令集_x86指令集趣谈

不管喜欢不喜欢,x86指令集都是一个影响力巨大的指令集。从1978年Intel正式推出8086以来,历经40多年发展,x86指令集不断扩充,已经成为CISC指令集中巨无霸。今天让我们来谈谈x86指令集的一些故事。 a9478fb3ddb1830d04512aa0e4d3b6e9.png

x86指令集到底有多少条指令?

40306b031b764002b5c8994f5b2f2c80.png天上的星星数得清,x86指令的数目数不清。Stefan Heule介绍了5种指令数目的统计方法[1]。一般统计指令个数通常用汇编语言的助记符。x86的汇编语言通常有AT&T格式和Intel格式两种。之所以有这种差别是Intel格式的助记符通常不区分操作数长度,比如Add指令可能表示16位加法,也可能表示32位加法,而AT&T格式会把不同的操作数区别为不同的指令,如Addw表示16位加法,而Addl表示32位加法。下图是Intel官方给出的指令个数及相关专利的发展趋势[2],从中可以看出,在40年的发展历史中,由不足200条指令到今天的超过1600条指令。

90237534f3ad5431d400e648e329b3d3.png

a9478fb3ddb1830d04512aa0e4d3b6e9.png

最常用的x86指令是哪些?

40306b031b764002b5c8994f5b2f2c80.png有很多人都采用不同的方式统计过最常用的x86指令。其中影响最大的是Peter Kankowski在12年前做的一个统计[3]。他对三种非常流行的开源软件(7-Zip压缩工具、LAME编码器和NSIS安装软件)进行了反编译,并统计了最常被用到的20条指令(下图)。 他还统计了 平均指令长度、 操作数的个数以及指令格式等 。从他的统计中我们可以看到MOV指令是最常用的,大概占到35%,有2条浮点运算指令(FLD和FSTP)也排在前20名之内。

ebd4d0df0fb89aff906da38e4f034cf4.png

后续有很多类似的研究[4-5],研究的方法类似,只是研究的目标软件有所区别,但是结论都差不多。 a9478fb3ddb1830d04512aa0e4d3b6e9.png

有哪些指令过时了?

40306b031b764002b5c8994f5b2f2c80.pngIntel(包括他的竞争对手们)设计了那么多条指令,但是常用的指令是很少的,有些指令甚至于已经被逐步废弃或者不建议使用。按照文献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以后基本就不使用了。

654824e11553183d4a9d140762d69f1e.png

不过有些老指令仍然顽强地活着。例如Intel推出了很多矢量计算指令,如MME/SSE/AVX,按理说常规的x87浮点指令就应该退出舞台了,但事实上仍然有很多软件在使用x87指令。 a9478fb3ddb1830d04512aa0e4d3b6e9.png

不同软件使用的指令是不是不同

40306b031b764002b5c8994f5b2f2c80.png不同软件使用的指令是否有所不同呢?答案是肯定的。下图是恶意软件和普通软件的指令对比(左侧是恶意软件,右侧是普通软件)[8],根据这种统计结果,我们就可以通过分析软件所使用的指令来找出恶意软件。

9f59dc398e6d6794809f2e392f17a5a2.png

886be718d8b7c385625b3f36ddfa49b0.png

参考文献

012f21f23ff86e2213c4506b7fd21fad.png

[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. 

公众号近期内容回顾

3f1cd8736e6fde6d390de05c80c9e3b9.gif16级本科生王玮琪同学的论文被IEEE Networking Letters录用

3f1cd8736e6fde6d390de05c80c9e3b9.gif2020版课题组文化衫出炉

3f1cd8736e6fde6d390de05c80c9e3b9.gifMASM32 SDK在Win10上无法安装怎么办

3f1cd8736e6fde6d390de05c80c9e3b9.gif喜报 | 课题组在第十五届研究生电子设计竞赛全国总决赛获得三项荣誉

3f1cd8736e6fde6d390de05c80c9e3b9.gif自组网中自适应多速率传输技术研究

3f1cd8736e6fde6d390de05c80c9e3b9.gif无线自组网高精度网络时间同步算法

3f1cd8736e6fde6d390de05c80c9e3b9.gif回忆杀 | 课题组文化衫2009~2019


94630315e24f1a113a17938c311a51a7.png微信号: bitpmcrg 欢迎关注北京理工大学专业移动通信组的公共号“北理工通信课题组” 0548adb21e67b74b318adb07496e49a4.png 519f6bd338f804501c8ba45807a2adbe.png 4a476110b4a2bd79797cd726a1c6ec1e.png

求分享

4a476110b4a2bd79797cd726a1c6ec1e.png

求点赞

4a476110b4a2bd79797cd726a1c6ec1e.png

求在看

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值