超酷汇编教程-- 简明x86汇编语言教程(1)

超酷汇编教程-- 简明x86汇编语言教程(1)第○章写在前面我不想夸大或者贬低汇编语言。但我想说,汇编语言改变了20世纪的历史。与前辈相比,我们这一代编程人员足够的幸福,因为我们有各式各样的编程语言,我们可以操作键盘、坐在显示器面前,甚至使用鼠标、语音识别。我们可以使用键盘、鼠标来驾驭“个人计算机”,而不是和一群人共享一台使用笨重的继电器、开关去操作的巨型机。相比之下,我们的前辈不得不使用机器语言编写程序,他们甚至没有最简单的汇编程序来

大家好,又见面了,我是你们的朋友全栈君。第○章 写在前面

我不想夸大或者贬低汇编语言。但我想说,汇编语言改变了20世纪的历史。与前辈相比,我们这一代编程人员足够的幸福,因为我们有各式各样的编程语言,我们可以操作键盘、坐在显示器面前,甚至使用鼠标、语音识别。我们可以使用键盘、鼠标来驾驭“个人计算机”,而不是和一群人共享一台使用笨重的继电器、开关去操作的巨型机。相比之下,我们的前辈不得不使用机器语言编写程序,他们甚至没有最简单的汇编程序来把助记符翻译成机器语言,而我们可以从上千种计算机语言中选择我们喜欢的一种,而汇编,虽然不是一种“常用”的具有“快速原型开发”能力的语言,却也是我们可以选择的语言中的一种。

每种计算机都有自己的汇编语言——没必要指望汇编语言的可移植性,选择汇编,意味着选择性能而不是可移植或便于调试。这份文档中讲述的是x86汇编语言,此后的“汇编语言”一词,如果不明示则表示ia32上的x86汇编语言。

汇编语言是一种易学,却很难精通的语言。回想当年,我从初学汇编到写出第一个可运行的程序,只用了不到4个小时;然而直到今天,我仍然不敢说自己精通它。编写快速、高效、并且能够让处理器“很舒服地执行”的程序是一件很困难的事情,如果利用业余时间学习,通常需要2-3年的时间才能做到。这份教材并不期待能够教给你大量的汇编语言技巧。对于读者来说,x86汇编语言”就在这里”。然而,不要僵化地局限于这份教材讲述的内容,因为它只能告诉你汇编语言是“这样一回事”。学好汇编语言,更多的要靠一个人的创造力于悟性,我可以告诉你我所知道的技巧,但肯定这是不够的。一位对我的编程生涯产生过重要影响的人曾经对我说过这么一句话:

写汇编语言程序不是汇编语言最难的部分,创新才是。

 

我想,愿意看这份文档的人恐怕不会问我“为什么要学习汇编语言”这样的问题;不过,我还是想说几句:首先,汇编语言非常有用,我个人主张把它作为C语言的先修课程,因为通过学习汇编语言,你可以了解到如何有效地设计数据结构,让计算机处理得更快,并使用更少的存储空间;同时,学习汇编语言可以让你熟悉计算机内部运行机制,并且,有效地提高调试能力。就我个人的经验而言,调试一个非结构化的程序的困难程度,要比调试一个结构化的程序的难度高很多,因为“结构化”是以牺牲运行效率来提高可读性与可调试性,这对于完成一般软件工程的编码阶段是非常必要的。然而,在一些地方,比如,硬件驱动程序、操作系统底层,或者程序中经常需要执行的代码,结构化程序设计的这些优点有时就会被它的低效率所抹煞。另外,如果你想真正地控制自己的程序,只知道源代码级的调试是远远不够的。

浮躁的人喜欢说,用C++写程序足够了,甚至说,他不仅仅掌握C++,而且精通STL、MFC。我不赞成这个观点,掌握上面的那些是每一个编程人员都应该做到的,然而C++只是我们”常用”的一种语言,它不是编程的全部。低层次的开发者喜欢说,嘿,C++是多么的强大,它可以做任何事情——这不是事实。便于维护、调试,这些确实是我们的追求目标,但是,写程序不能仅仅追求这个目标,因为我们最终的目的是满足设计需求,而不是个人非理性的理想。

这份教材适合已经学习过某种结构化程序设计语言的读者。其内容基于我在1995年给别人讲述汇编语言时所写的讲义。当然,如大家所希望的,它包含了最新的处理器所支持的特性,以及相应的内容。我假定读者已经知道了程序设计的一些基本概念,因为没有这些是无法理解汇编语言程序设计的;此外,我希望读者已经有了比较良好的程序设计基础,因为如果你缺乏对于结构化程序设计的认识,编写汇编语言程序很可能很快就破坏了你的结构化编程习惯,大大降低程序的可读性、可维护性,最终让你的程序陷于不得不废弃的代码堆之中。

基本上,这份文档撰写的目标是尽可能地便于自学。不过,它对你也有一些要求,尽管不是很高,但我还是强调一下。

学习汇编语言,你需要

胆量。不要害怕去接触那些计算机的内部工作机制。 

知识。了解计算机常用的数制,特别是二进制、十六进制、八进制,以及计算机保存数据的方法。 

开放。接受汇编语言与高级语言的差异,而不是去指责它如何的不好读。 

经验。要求你拥有任意其他编程语言的一点点编程经验。 

头脑。

 

 

祝您编程愉快!

第一章 汇编语言简介

先说一点和实际编程关系不太大的东西。当然,如果你迫切的想看到更实质的内容,完全可以先跳过这一章。

那么,我想可能有一个问题对于初学汇编的人来说非常重要,那就是:

汇编语言到底是什么?

汇编语言是一种最接近计算机核心的编码语言。不同于任何高级语言,汇编语言几乎可以完全和机器语言一一对应。不错,我们可以用机器语言写程序,但现在除了没有汇编程序的那些电脑之外,直接用机器语言写超过1000条以上指令的人大概只能算作那些被我们成为“圣人”的牺牲者一类了。毕竟,记忆一些短小的助记符、由机器去考虑那些琐碎的配位过程和检查错误,比记忆大量的随计算机而改变的十六进制代码、可能弄错而没有任何提示要强的多。熟练的汇编语言编码员甚至可以直接从十六进制代码中读出汇编语言的大致意思。当然,我们有更好的工具——汇编器和反汇编器。

简单地说,汇编语言就是机器语言的一种可以被人读懂的形式,只不过它更容易记忆。至于宏汇编,则是包含了宏支持的汇编语言,这可以让你编程的时候更专注于程序本身,而不是忙于计算和重写代码。

汇编语言除了机器语言之外最接近计算机硬件的编程语言。由于它如此的接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。用汇编语言编写的程序的速度通常要比高级语言和C/C++快很多–几倍,几十倍,甚至成百上千倍。当然,解释语言,如解释型LISP,没有采用JIT技术的Java虚机中运行的Java等等,其程序速度更无法与汇编语言程序同日而语 。

永远不要忽视汇编语言的高速。实际的应用系统中,我们往往会用汇编彻底重写某些经常调用的部分以期获得更高的性能。应用汇编也许不能提高你的程序的稳定性,但至少,如果你非常小心的话,它也不会降低稳定性;与此同时,它可以大大地提高程序的运行速度。我强烈建议所有的软件产品在最后Release之前对整个代码进行Profile,并适当地用汇编取代部分高级语言代码。至少,汇编语言的知识可以告诉你一些有用的东西,比如,你有多少个寄存器可以用。有时,手工的优化比编译器的优化更为有效,而且,你可以完全控制程序的实际行为。

我想我在罗嗦了。总之,在我们结束这一章之前,我想说,不要在优化的时候把希望完全寄托在编译器上——现实一些,再好的编译器也不可能总是产生最优的代码。

当时我学过BASIC, Fortran和Pascal,写的是一个

对一个包含100个32bit整数的数组进行快速排序,并且输出出来的小程序。实际上用汇编器写出的机器码与在调试器中用它附带的汇编程序写出的机器码还是有一些细微差

别的,前者更大,然而却可能更高效,因为汇编器能够将代码放置到适合处理器的地方这句话假定两个程序进行了同等程度的优化,一个写的不好的汇编程序和一个写的很好的C程序相比,汇编程序不一定更快。

连载敬请期待下章.

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151694.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • WIN32 API获取窗口句柄

    WIN32 API获取窗口句柄WIN32API获取窗口句柄2008-08-1305:28P.M. 关于如何获取窗口句柄,以及有哪些函数可供使用的简单讨论!首先罗列出一些获取句柄的win32api函数,然后简单说说他们的用途!最后说说是怎么理解和应用的。可用的win32api函数: 1.HWNDFindWindow(LPCTSTRlpClassName,L

  • java环境变量完美配置教程

    java环境变量完美配置教程java环境变量配置教程首先,下载JDK开发包,官网和我的主页资源库都有,建议下载比较稳定普遍的1.8版本,安装时注意安装路径,安装完成后按路径找到相关文件,你会看到JDK1.8的文件夹,看见bin再点一次,然后点击正上方很长的那个输出栏,会出来一串路径复制他. 然后我们到了桌面找到我的电脑,如果没有我的电脑,自己在设置个性化中找桌面图标显示。还有某些系统是快捷方式,(右击,看到属性点击,打开文件所在位置即可)然后要是啥问题没有,咱们就右击,看见属性点击,你会看见高级系统设置点他,看没看见环境变

  • jQuery模拟打字逐字输出代码

    效果查看:http://hovertree.com/texiao/jquery/70/jQuery键盘打出逐字逐句显示特效,逐字逐句显示文字还可以设置每个文字随机颜色:http://hovert

    2021年12月24日
  • 如何知道一个网站的后台地址_看我如何攻破LOL钓鱼网站后台查清背后的大量账号被盗号的真相…

    如何知道一个网站的后台地址_看我如何攻破LOL钓鱼网站后台查清背后的大量账号被盗号的真相…说英雄联盟准备出手游,但内测资格一直没公开,有骗子利用这个机会,伪造官方给用户发送带有钓鱼链接的邮件来盗号。.方子就是其中一个受害者,除了他,我也去了英雄联盟的贴吧看了下,确实有很多人收到了这类邮件。由于反馈这事的人比较多,加上我平常也玩LOL,所以整理了下线索,开整。目前一共有两条线索。1.钓鱼邮件:j6****j9@***zol.com2.钓鱼网站:www.iku****.cn首先是发送钓鱼网…

  • Latex常见符号对照表

    摘要:Latex可以很方便的利用命令来生成各式各样的特殊符号.这里根据官方的文档将这些常见符号列出,以备查用.

  • 数据库分区分表和提升性能「建议收藏」

    数据库分区分表和提升性能「建议收藏」http://my.oschina.NET/tinyframework/blog/186583序言一直在做企业应用,目前要做一些互联网应用,当然只是应用是放在互联网的,数据量距离真正的互联网应用还是有相当大的差距的。但是不可避免的,在数据库出现瓶颈的情况还是有的,现在做互联网上的应用,当然也要未雨绸缪,要考虑数据量大的时候的解决方案。这个目前开源的商用的也都有不少解

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号