汇编语言学习笔记(零)-为什么开始

为什么开始

从开始学习汇编到现在也有很长时间了,虽算不上刻苦钻研,但接触久了多少也有些感悟,打算就此做一些总结,一来算是备忘,二来也可以梳理知识使之融会贯通。我自小就不是一个勤奋的人,写这个东西也不会很积极,只当做是闲暇时的消遣,希望不要无疾而终便好。

沿袭程序员“良好”习惯,这篇文章做为第零篇,主要总括汇编语言的概况以及它的主要用途,初识一种技能,知道它能做什么或许比如何去做更加有意义。

汇编语言种类

汇编语言不同于C、C++等高级语言,因为它“派系林立”,语法种类非常之多,但总体来讲各种语法都没有本质的差别,更多的是表述方式不同。

大学时期学过一门《微机原理》的课程,其中的汇编是微软的Masm语法,如同Windows基本成为系统的代名词,Masm几乎也成了汇编代名词,但我这组文章并不是仅仅用来说明Masm,微软的东西用起来挺方便,用多了感觉多少有点繁琐;Masm 还是 Visual C++编译后端,如果有需要,可以编译C/C++代码到Masm查看汇编代码。

除此之外,比较流行的语法还有Nasm,这也算是个简洁的语法,简单到连数据类型都没有,只需指定内存大小,如何理解内存是开发者的事情,这样也更接近汇编语言的本质,但易用性就较之Masm差了很多;与Masm专注于Windows平台不同,Nasm是个跨平台语言,几乎可以生成各种平台下各种格式的二进制,官方的教程也写得很详细,只是语言显得有点过于简单,似乎学的人不少,但是用的人不多。

还有一种比较出名的汇编语法HLA,语法有点类似高级语言,这种语法之所以出名得益于《汇编语言编程艺术》一书,书名有“艺术”一词或许会显得比较高深,但实在不知道这种语法除了作者还有谁在使用,用于何地。

最后隆重推出的语法是AT&T的GAS语法,压轴戏都是最后登场,此次也不例外,之前提到的各种汇编语法都是伟大的结晶,我也没有任何贬低之意,只是我更加喜欢AT&T而已,AT&T语法是Gcc的后端汇编语法,这也是为什么我更偏爱它的原因之一,Gcc几乎可以在任何平台编译任何代码,GAS当然做到Gcc所实现的事情,Nasm虽然也能轻松跨平台应用,但在特定平台下编译代码,除了代码的二进制还需有资源文件、系统库等,这点需要一个强大的链接器支持,与其使用各种拼盘,不如直接用Gcc套件来的更为直接;AT&T汇编也被应用于Linux内核中,这点也不难理解,原本Gcc编译的代码就跟AT&T汇编是一样的的东西。

当然,汇编语言种类很多,还有些主要应用于Dos平台,我也没有更多接触,自此也不便妄加评论;汇编之中使用最为广泛的就属Win平台下的MASM和Linux平台下的GAS,之所以重要在于二者分别是VC++和Gcc这两大重器的后端,尤其是在Windows广泛应用的环境下,Masm在汇编语法中就显得更为重要了,所以说,有时候拼的不是谁更出色,而是拼谁的“背景”更牛。若在Linux平台想用汇编对代码进行优化、阅读Linux内核源码,就免不了GAS汇编;在Windows下做优化、破解、外挂,也免不了Masm汇编。虽说二者本质相同,但表现形式还是有很大差别。我这里写的东西并不局限于其中一种汇编,因为二者都是非常重要的语言。

学习汇编语言有什么用

在学习汇编之前,很多人可能都有疑问,汇编到底能做什么,除非是Geek,否则没人去用汇编写一套软件出来吧;在这里需要总括一下汇编的用途:

  • 破解:也许汇编最广的用途在于软件的破解,在中国大多数人都在有意无意的使用着盗版,有很多人都不知道自己电脑中哪些软件是需要收费的,也有很多程序员收集很多软件,以及这些软件所对应的注册码供人使用,所谓己所不欲勿施于人,作为一个程序员,却侵犯着其他程序员的利益,好在如今免费的东西越来越多,尤其是互联网的广泛使用,各种云平台的挤压,为服务收费方式越来越多过为软件收费的方式。抛开盗版这种行为,破解软件的过程中本身是件很有趣的事情,是跟软件保护者的一场智力对抗比赛;

  • 逆向工程:有时候看到某些软件制作精巧,细想之下居然不知道他是如何实现的,在作者不开源的情况下,要想理解作者的实现思路,只能阅读部分的汇编代码,还原为C代码来仿制作者的功能;同样由于互联网的冲击,提供网络服务的企业越来越多,逆向的需求也越来越少;

  • 游戏外挂:破解和逆向的应用场景不断收缩,但与之关联的游戏外挂却越来越火爆(当然法律的越来越健全对外挂有着相当大的阻力),因为通过游戏的盈利点非常清晰,通过一款成功的游戏能够获得巨大收益,而外挂是游戏的一种“捷径”,从中牟取的利益也是非常客观。游戏外挂本身是逆向和破解的集合,对技能的要求非常高。随着网页游戏和手机游戏的逐渐火爆,外挂的形式也变得多种多样,已经并不局限于汇编;

  • 系统编程:对于精确定位和控制可执行文件大小方面,恐怕没有哪种高级语言能够实现,Linux内核尽可能使用C语言实现,但是引导区部分仍然需要汇编处理,另外,操控硬件(in,out指令),中断(int,syscall指令)等等,C语言也需要内联汇编实现;

  • 汇编优化:C语言是比较底层的语言,还是需要更进一步编译为汇编代码,由于C需要通用性,翻译成汇编指令的过程中为了兼顾其他平台或者各种可能的用法,对某种具体行为未必能做到最优化处理,这时就需要手动调整汇编代码,不过Gcc 的优化能力已经非常出色,况且这种优化只能是微观优化,大多数情况还得需要宏观的优化,调整算法的复杂度,汇编优化可能提高几倍的效率,业务算法的优化可能能够提升上百倍甚至上千倍的效率,除非这里已经是算法的瓶颈所在,否则汇编优化是没有多少意义的;

  • 理解高级语言:C++有很多晦涩的语法,不了解编译器如何实现,可能有各种猜测,但事实是否如此,我们可将最简单的例子编译成汇编阅读,一窥语言的底层实现,不过这里只供理解之用,不是标准规定的,各个平台的实现并不尽相同。

另外还有对可执行文件的二次开发等等,都脱离不了对程序的逆向。同时我们也可以看到,在互联网时代,汇编似乎显得比较没落,更多的学习者都在于增加“功力”而已。

Built with Hugo
主题 StackJimmy 设计