云霞资讯网

十分钟掌握最常用的x86汇编语言

学CPU里的秘密代码,普通人到底能不能看懂这些芯片指令。今天我们聊聊X86汇编语言。虽然现在大家用C++、Python这

学CPU里的秘密代码,普通人到底能不能看懂这些芯片指令。

今天我们聊聊X86汇编语言。虽然现在大家用C++、Python这些高级语言开发软件,但偶尔会遇到需要看懂汇编的情况。比如写操作系统或者弄明白程序底层逻辑时,汇编就是必经之路。我前两天看教程发现,这玩意儿真不好整,全是些奇怪的代码和符号。

X86处理器从最早的8086到现在发展出好多版本,32位、64位的区别很大。早期的CPU只有几个寄存器,后来越做越大,现在的64位处理器能支持256TB内存,比我家电脑大太多了。那些寄存器像仓库货架,专门放数据用的,像EAX这种还能分块操作,前面放数字后面留空。不过有些寄存器一般人碰不到,比如控制程序跳转的IP,感觉像是CPU的操作系统。

指令代码看着头疼。比如"mov"是搬数据,后面跟着一堆后缀代表大小,b是字节、l是4字节。操作数分直接写数字、用寄存器或内存地址。有个lea指令更邪门,根本不是搬数据而是算地址,比如把eax+4的结果存回去。跳转指令jmp有直接跳和间接跳,有点像导航APP选路线。

语法分成两种,AT&T和Intel,就像两种方言。Linux用AT&T,符号多得烦人,指令后面带%和$,操作顺序还跟Intel反过来。Intel语法看着直观,能直接写"[array+ebx*4]"这种表达式。编译器参数可以切换,但记不住命令的时候很麻烦。

遇到条件判断时问题更多。测试标志位的test和cmp像交通信号灯,控制跳转方向。如果直接写if语句,CPU要预测路线,走错就卡顿。用条件传送指令cmov反而更快,但实际编程要看编译器选哪种。

加减乘除指令也分好几种,进位加法adcl能处理超长数,不过实际用处不大。64位汇编跟32位差不多,就是寄存器变大了,后缀换成q这种符号。符号扩展和零扩展听着复杂,其实就是数字补0或者补符号位,防止数据溢出。

以前觉得汇编是程序员专属暗号,现在明白它就是CPU的操作手册。虽然学着费劲,但遇到程序崩溃、性能优化这些事儿,看懂汇编真有用。现在至少知道那些古怪代码不是天书,但真要变成高手,还有很长路要走。