成功心法 转自周立功

来源:百度文库 编辑:神马文学网 时间:2024/04/27 15:37:45
成功心法(1):低年级大学生如何查资料写论文

  如果你输入3个关键字“电阻器”Baidu一下,你会发现很多与电阻器有关的信息。电阻器是一种最常用的元器件,虽然看起来简单,如果使用者对电阻器的了解不深入,势必将会影响到电路指标和产品质量。比如,设计一个高精度的温度采集器,则对电阻器的选择是非常有讲究的。

  首先,我们来看一看词条“电阻器_百度百科”,电位器分为11种,薄膜电阻分为4种,敏感电阻分为5种,还有实芯碳质电阻器、绕线电阻器、金属玻璃铀电阻器和SMT贴片电阻......一般来说,我们可能不会在意“0欧姆电阻”,其实0欧姆的电阻种类还很多,按功率来分有1/8W、1/4W等。而且0欧姆电阻的作用非常大,比如,用0欧姆电阻可以作为跳线器来使用,也可以作为保险丝来使用,还可以作为调试的预留位置,更重要的用途是数字和模拟混合电路中的“单点接地”处理,往往要求将两个地分开,且单点连接,则可以用一个0欧姆电阻来连接这两个地。

  作为一个优秀的电子开发工程师,必须深入了解各种电阻的分类、封装形式、材料、特性、应用场合和购买信息。尽管已有很多讨论电阻器的文章和图书,但至今却仍然找不到一份完整的参考选型与设计指南。因此各位同学不妨从这里开始,尝试分门别类精选资料就电阻器或某一类电阻撰写自己的第一篇论文,然后再将论文做成讲稿,经过精心准备和反复练习之后,为同学们主办一次有意义的讲座。

  成功心法(2):通过讲故事营销自己

  事实上我们每天与人打交道都在讲故事,因此消费者(面试官、上司、指导老师、朋友、配偶、顾客、部下、同事.....)习惯了对自己和别人讲故事,自然会向一个会讲故事的人买东西或将机会给一个会讲故事的人,这是一个不争的事实。所以几乎所有的成功者都讲故事的高手,只有通过讲故事才能满足消费者的强烈需求。故事使这个世界更容易理解,讲故事也是人们传播观念的唯一方法,而成功者只是让讲故事的艺术更完善。

  其实我们在与应聘者面对面交流的时候,最想知道的不是他们做过什么项目,而是他们在学习软硬件设计的过程中是如何克服困难最终解决问题的思路、方法和心路历程。但几乎所有的简历都象八股文一样,千篇一律似的流水账,大篇不着边际的废话,无论面试官如何费尽心思启发,非常期待应聘者能够爆一些料出来,其最终结果往往都很令人失望,真是食之无味弃之可惜。

  我们每天都在营销,但很多人不懂营销,最糟糕的是他们真的以为是自己能力不足,其实问题出在他们不会说故事。人物之所以传奇,品牌之所以传播,就是因为传奇的背后是激动人心的故事,如果你不会讲故事,如果你的故事不动人,如果你的故事无法传播开来,那么你就会被淘汰。

   参考书:《营销人都是大骗子》,高等教育出版社,赛斯.高汀著,郑水富译

  
事实上营销人并不是骗子,他们只是说故事的专家,作者只是在为这本书命名时耍了一个花招而已。营销人都需要讲故事,故事讲得好才能取信于人。我们相信穿上1000元的名牌服装比100元的杂牌服装会让我们的感觉更好更酷......

  成功的营销人从来不单纯谈产品特性和产品利益,而是说故事,一个消费者愿意相信的故事。他们不会试图改变消费者的世界观,而是让故事符合并实践消费者的世界观。但是需要注意的是,如果你的故事是不真诚的,你就越过了红线。说实话故事才有人相信,人们相信了你的故事,才会把故事与人分享,真心诚意说一个能够兑现的“谎”,才能持续地打动他人。所以作为一个工科大学生,仅仅学好技术是远远不够的,哪怕你将来不准备创业,也不准备做销售而一辈子只做产品开发,只要你面对生活,讲故事般的沟通能力至关重要。

  成功心法(3):完美的陈述

  事实上再好的PPT也不能取代完美的陈述,假设丘吉尔首相当年用笔记本电脑、PPT和极端匮乏的想象力来完成这次举世闻名的演说——“我们将在海滩上战斗”,不知道今天的世界会变成什么样子?

  假设丘吉尔首相把演说稿用电子邮件发给罗斯福总统,也许未必能促使美国参战,至少这有可能不利于促使美国参战。有人也许会说,决定战争胜负的是军人和武器,而不是演说。但是与希特勒的失误、苏联的冬季保卫战以及美国的军事实力和经济相比,英国的抵抗似乎显得微不足道。可是我们不得不承认,在刻尔克大撤退之后,英国依靠以己之力与纳粹德国打了整整一年,直至希特勒入侵苏联。德国飞机不分昼夜地轰炸英国城市,皇家海军的战舰被击沉,在为数不多的海外战场上,美国军队也在节节败退。事实上在美国参战之前,英国人顽强地抵抗了18个月。同样令人不可思议的是,英国人一直坚持到了最后,并最终夺取了战争的主动权。

  英国人之所以能取得胜利,是因为丘吉尔首相从来就不相信失败是英国人的宿命。就在1940年的那一天,丘吉尔成功地说服英国人相信自己,相信胜利是完全可能的,用自己的力量战斗到底。尽管当时还无法考量这场精妙绝伦的演讲到底有多重要,它至少抵得上几个经过严格训练的兵团、数个喷气式战斗机队,或若干全新的战舰。或许它的价值和意义还远远不止于此,尽管丘吉尔没有借助PPT,但丘吉尔却让整个英国团结一心,共同抵制法西斯的侵略。

  成功心法(5):10 000小时的标准

  天才盖茨的故事被人们翻来覆去说过多少次了,人们得到启发也大同小异。是不是真有先天的才能呢?答案很显然:有。而心理学家越是深入考察天才们的人生经历,越是发现天赋的作用越来越小,而后天储备的作用却越来越明显。

  现在让我们更深入地挖掘这个故事。事实上,盖茨在1968年读七年级的时候,就开始编程了。尽管盖茨很早就开始接触计算机,但由于采用的是分时使用制,所以上机的时间还是很短。一个偶然的机会,C-Cubed电脑中心公司邀请湖边电脑俱乐部的学生利用周末时间为公司测试软件程序,以此来换取使用电脑的时间,放学之后盖茨在这里一直编程到深夜。但电脑中心公司最终破产,他们受到另外一家名叫ISI公司的委托,为公司编写工资单程序,从而换取自由上机的时间。在1971年的7个月之内,盖茨和他的同伴们得到了ISI主机1 575小时的上机时间,一星期7天,每天平均8个小时。后来保罗在华盛顿大学找到了一台能够免费使用的电脑,在每天凌晨3~6点这段时间鲜有任何安排。就寝时间过后,盖茨开始动身到华盛顿大学。多年之后,盖茨的母亲说:“我们常常觉得奇怪,为什么他每天早上很晚才起床。”

  后来TRW为华盛顿州南部庞大的博纳维尔电站建立计算机系统,但在计算机革命的早期,要找一个熟悉专业领域的程序员并非易事。也不知道用了什么方法,盖茨成功地说服了他的老师让他离开学校来到博纳罗克,整个春天他都在编写程序。

  当读大学二年级的盖茨从哈佛大学退学,决定创办软件公司时候,此前他已经无间断地编写了七年的程序,这个时间远远超过10 000小时。事实上无论是象棋大师、曲棍球运动员、甲壳虫乐队.......,还是天才莫扎特,10 000小时是一个梦幻般的数字。

  为什么很多名牌大学的毕业生会被一般的企业拒之门外呢?因为他们在大学期间甚至连1000行程序都没有写过。

  成功心法(6):有了C语言,汇编语言还重要吗?

  我们很多工程师都是八十年代从使用机器语言编程走过来的,随着计算机技术的发展,开始由汇编语言过渡到使用C编程,与很多程序员、教师具有同样的想法,“让汇编语言见鬼去吧!”

  在由8位单片机向32位嵌入式系统技术的高速发展过程中,我们在教学和工作中发现,如果没有很好的汇编语言功底,则很难掌握操作系统的底层技术,因为操作系统中的任务切换、用户模式切换到系统模式等很多源代码还是用汇编语言编写的。我深深地体会到,之所以能够跟上32位嵌入式技术的发展,就是因为具有扎实的技术功底,而事实上对于很多年轻人来说,在学习的过程中,往往最基本的,也是最容易忽略的。

  各位同学,如果你想在未来成为一位优秀的人才,那么在学习相关课程时,一定要迫使自己静下心来,充分将周六和周末的时间用起来,坚持将汇编语言学到手,将书本上的每一个实验老老实实地做好,而且必须理解到位。

  请记住:学习汇编语言的基本方法不是背书,而是艰苦的编程实践。

  成功心法(7):如果提高自身的技术修养(1)

  程序运行到main()函数之前,CPU做了那些事情?main()是程序运行的第一个函数吗?

  你是否真的明白——编译、链接、重定位以及虚拟地址?

  或许,你不需要知道和理解这些知识就能够编程,而且工资还很高,但这些都不是你不知道的理由。

  在早期的计算机中,由于所有程序在运行时所访问的地址都是物理地址,所以各个程序所使用的地址空间不是互相隔离的,如果因为“Bug”不小心改写了其它程序的数据,那么对于实时系统来说,这是不能容忍的。因为用户非常希望做到,即使其中一个模块出现了问题,至少不要影响其它功能的正常运行。

  由于缺乏有效的内存管理机制,监控程序必须将所有的程序装入内存(RAM)中才能开始运行,从而造成内存的使用效率极低。如果突然要运行一个程序A,由于内存空间不够,这时只好将其它程序的数据暂时保存到其它存储介质(磁盘)中,等到要用时再读回来。由于程序所需要的空间是连续的,有可能将程序B保存到存储介质中所释放出来的内存空间不够,那么只好将程序C再换到存储介质中,然后才将程序A读入内存开始运行。由于内存释放出来的地址的不确定性,有可能是0x3000,也有可能是0x5000,而程序转移的目标地址却是固定的,比如,0x2000,这就要涉及到程序的“重定位”问题。其实“重定位”就是给程序中的每个地址重新确定它在物理内存中的位置。

  在程序编写的过程中,经常会涉及到主程序调用子程序的情况。编译程序将源程序翻译成二进制机器码时,事实上各个模块都是分开翻译(编译)的,因为在翻译主程序时并不知道子程序的地址,所以只好暂时将调用子程序的指令的目标地址搁置,等到合适的时候才将每个调用子程序的指令修正,然后再填入正确的转移地址参数(链接)。当程序装入内存时,这些位置又要重新计算,那么重新修改目标地址的过程就是重定位。

  怎样把编译程序解放出来,使得其在编译时并不关心物理内存的地址,而按自己的意愿给程序编址?唯一的解决办法就是增加中间层,即使用一种间接的编址方式,也就是对程序中的指令连续的编址,这些地址不是真正的物理地址,而是一种“虚拟地址”(或称逻辑地址),然后通过某些映射方法,将这个虚拟地址转化为物理地址。通过前面的学习,大家已经知道,物理地址是实实在在存在的,80C51系列单片机有16条地址线,所以可以支持64KB的存储空间。而虚拟地址空间则是一种逻辑空间,就像我们给一个班的学生编学号一样,这些学号的集合就是一种虚拟(逻辑)空间,每个班的同学都有从学号1开始的独立地址空间,由此可以推知,每个运行的程序都有自己独立的虚拟空间,而且每个运行的程序只能访问自己的地址空间,这样就能做到程序在运行时的有效隔离,从而大大地提高了系统的安全性。

  虚拟存储的实现需要依靠硬件的支持,比如,32位ARM9以上的CPU,用其内部集成的MMU(Memory Managemnet Unit)来进行页映射,在页映射下,CPU接收到的地址是虚拟地址,经过MMU转换以后就变成了物理地址。由于80C51系列单片机没有MMU,所以无法实现虚拟内存管理机制。

  成功心法(8):如果提高自身的技术修养(2)

  凡是学过C语言的人都知道main()函数,但未必一定清楚其鲜为人知的“私隐”,下面将为此揭开其神秘的面纱。

  对于标准的C语言来说,main 是所有 C 程序中都必须包含的一个函数名字。main()是C 程序中第一个要执行的函数,必须通过main()中的函数调用才能执行其它函数。只有当main()执行结束时,整个程序才会执行结束。尽管在逻辑上main()是程序中第一个要执行的函数,但在程序行文上,它不一定是第一个函数。

  main()函数是由程序员自行编写的,但其函数说明符是由语言规定好的。它可以定义成无参函数,详见程序清单1。 程序清单 无参数函数 int main(void) { ...... } 也可以带有2个特定参数 argc与argy,详见程序清单2。

  程序清单2 int main(int argc,char argy[])函数

  int main(int argc,char argy[])

  {

  ......

  }

  argc与argy 特定参数名字是由语言预定义的标识符,尽管有些C编译器也允许使用其它的一些参数,但标准C只支持argc与argy。在C语言中,编译器处理main()函数与其它函数的方式基本上是一样的,其区别主要表现在运行时,编译器可以支持argc与argy这2个特殊的参数。

  由于计算机仅认识机器码,而不认识C语言中的main()函数,因此必须有一段程序来识别C编译器编译的main()函数并调用它。其实在C语言的标准中,有一个非常重要的概念,那就是环境。

  环境是指程序翻译与执行所在的计算背景(或称计算上下文),环境可以分为翻译环境与执行环境2类。对于C程序员来说,一般不必关心翻译环境。而在C语言的标准中,对执行环境的解释大致如下:

  执行环境是指程序经过翻译后执行的环境,执行环境与翻译环境可以是同一环境,也可以是不同环境。ANSIC规定了2种执行环境,即独立式执行环境与非独立式执行环境。两者的主要区别在于,独立式执行环境不需要操作系统支持,它实际上是一种裸机执行环境,如洗衣机控制器的微控制器实际上就是这样一种执行环境,而非独立式执行环境则需要操作系统的支持,而用于程序设计的执行环境绝大多数都是非独立式执行环境。ANSIC只规定了独立式执行环境的最小规则,因为这种环境可能千差万别。但ANSIC却仔细地规定了在非独立式环境下程序执行的具体规则,包括程序启动、程序执行与程序终止的规则。

  对于执行环境的规则,不开发编译器是不需要详细了解的。但从使用者的角度来看,可以这样理解:执行环境是一个软件(及其所运行的硬件)的集合,这个软件提供了基本的库函数和调用main()函数的方式。对于非独立执行环境来说,C语言程序通常编译成对应操作系统的应用程序(一个文件)。假如C语言程序已经编译成应用程序abc.exe,如果在命令行中输入“abc.exe [参数字符串]”后,那么操作系统将执行以下步骤:

  找到abc.exe文件并进行分析;

  根据分析的结果将指令和数据加载到内存的指定位置;

  将参数字符串存储到特定位置(可能是预处理过的);

  根据操作系统的不同,执行一些特定的初始化;

  初始化堆栈指针;

  将所有的寄存器设置为预定义的值;

  执行应用程序的第一条指令。

  一般来说,应用程序的第一条指令并不是main()函数的第一条指令。编译器会提供实现参数转换等功能的接口代码,并最终调用main()函数。main()函数也会返回到接口代码,此时接口代码将main()函数的返回值处理为操作系统需要的方式,并按照操作系统给定的方式将结果和控制权提交给操作系统。

  对于独立执行环境来说,系统往往是裸机,没有任何软件支持,更不可能访问文件了。其步骤如下:

  编译器会一般将C语言程序编译为符合某种格式的目标文件;

  通过某种烧录或下载工具将目标文件以系统能识别的方式存储到系统的特定位置;

  复位系统,系统执行复位向量指定的第一条指令。

  一般来说,系统复位后硬件仅进行了有限的初始化,并不能直接运行main(),还需要一个所谓的“启动代码”,将系统引导到C语言的main()函数。启动代码可能全部由编译器提供,也有可能部分需要用户提供。启动代码的内容大致如下:

  初始化堆栈指针;

  初始化总线控制器、中断控制器、MMU等必须初始化的硬件;

  初始化C运行时库;

  可能为main()函数提供参数;

  调用main()函数。

  对于独立执行环境来说,main()函数是一般不返回的。尽管一些编译器也提供返回处理,但都是为停机、软件复位或调用用户提供的函数。

  其实main()函数与其它函数最大的区别在于main()是根函数。在一个标准的C语言程序(仅调用标准的库函数和自己编写的函数)中,所有的其它函数都由main()函数直接或间接调用。如果将函数调用关系画成一个图(一般为树形结构),那么一个标准的C语言程序只有一颗函数调用树,其树根就是main()。

  需要注意的是程序只有执行后才会调用别的函数,所以“根函数”是动态执行的概念。

  当然,还牵涉到词法分析、语义分析等,在此不再阐述。

  成功心法(9):细节决定成败

  关于堆栈

  计算机科学与技术对于初学者来说有一种莫名的神秘感,因此在学习的过程中非常容易被“编程”的快感所牵制,以至于时常感叹打开书本似乎都搞懂了,但就是不能将所学的知识转化为一种设计能力,原因就在于平时的学习中对技术的细节不求甚解所造成的。堆栈就是一个非常重要的知识点,请初学者一定要下功夫完全了解和准确理解。

  事实上在我们的生活中常常会发生这样的情形,当我们正在做“事件A”,如果突然被打断而转去做“事件B”,于是就产生了“断点”。为了保证在完成“下一事件B”之后,返回来从刚才被打断的“断点”处无缝连接继续做“上一事件A”,因此势必在被打断的同时保存“断点信息”,否则无法准确返回到断点处。

  如果用计算机来记录这一“断点信息”(在操作系统中俗称“上下文信息”)的话,很显然只要“保存断点信息”到堆栈中,就可以放下“上一事件A”去做“下一事件B”了,然后再在返回来之后从堆栈中“恢复断点信息”即可。

  成功心法(10):哪怕再简单也要注重思路!

  给初学者讲授“DIY计算机”的书稿——LED流水灯

  人们时常看到户外动画广告,一会儿从左到右地显示,一会儿又从右到左地显示,这就是流水灯效果,其特征是将想要显示的画面切割成N份,且每次只让其中的一个画面显示,同时让肉眼能够看得清楚。

  假设先让其中的一幅画面显示,接着“立刻”点亮与其相邻的另一幅画面,且同时熄灭前一幅画面,画面切换间隔时间为?s级,由于人眼的反应速度非常之慢,所以无法看清楚画面切换的过程,以至于看起来的效果就是一幅全部点亮的画面,比如,电视画面,这就是人们常说的视觉暂存效应。

  如果在点亮第一幅画面后,延时等待一个固定的时间值(假设延迟时间为ms或s级),再在点亮与其相邻的画面的同时熄灭前一幅画面,接着再延时等待一个固定的时间值……那么就能看到画面象流水一样显示的效果。

  下面将用LED来模拟从右到左的流水灯的显示效果,将“与发光二极管D17-D24相连的JP4”用并行排线连接到“与单片机的P1.0-P1.7口相连的JP31”,然后短接JP39_5与JP39_6,即硬件电路连接完毕(省略图)。由此可以看出,只要单片机I/O口输出高电平1,那么经过反相器转变为低电平后,即可驱动LED发光,反之LED熄灭。

  很显然如果想先点亮最右边第一个LED(D17),那么只要将数据01H传送到P1口即可。通过查看传送指令集,发现可以直接使用“MOV direct,#data”(MOV P1,#1H)指令来实现,那么只要在灯“流动”显示的过程中插入延时程序即可,程序清单1.1就是实现LED流水灯的程序,MAIN为主程序标号,就是程序计数器的PC,即起始地址0000 0000。

  程序清单 1.1 LED流水灯程序范例(1)

  MAIN: MOV P1,#1H ;01H = 0000 0001 ,P1.0为高电平1,D17发光

  ;执行延时程序Delay

  MOV P1,#2H ;02H = 0000 0010,P1.1为高电平1,D18发光

  ;执行延时程序Delay

  ……

  MOV P1,S0H ;80H = 1000 0000,P1.7为高电平1,D24发光

  ;执行延时程序Delay

  AJMP MAIN ;跳转到MAIN,循环执行程序

  虽然这种编程方法也能够达到目的,但效率却很低。通过分析上面的程序可以看出其中的规律,即数据01H、02H、04H、08H、10H、20H、40H、80H中的“1”不断地从右向左移动。由此可见,如果将数据01H存放在累加器A中,即使用“MOV A,#1H”指令,接着将A中的数据传递给P1,然后再想办法让A中的数据01H中的“1”从右向左移动即可,其应用实例如下:

  MOV direct,A ;MOV P1,A

  通过查看逻辑运算指令集,发现“RLC A”移位运算指令刚好满足要求。其功能是将累加器A的内容全部向左移动1位,当移位8次之后,最高位D7移到标志位CY,而CY原来的内容则移到累加器最低位D0中,其数据结构为1 0000 0000,即CY=1所有的LED全部熄灭,这就是实现“流水”灯的基本思路,详见程序清单1.2。

  程序清单 1.2 LED流水灯程序范例(2)

  MAIN:MOV A,#1H

  Loop: MOV P1,A

  RLC A ;带进位累加器A循环左移

  ;执行延时程序Delay

  AJMP Loop ;跳转到Loop处,循环执行程序

  接着开始编写延时程序,那么一条指令的执行时间是多少呢?循环延时程序详见程序清单 6.13。

  程序清单 1.3 延时程序范例(1) MOV R7,#FFH ;1个机器周期

  Delay2:DJNZ R7,Delay2 ;2个机器周期(*)

  在执行指令之前R7先减1,然后判断R7是否为0。如果R7≠0,则R7继续做减1操作。与此同时因为延时参数寄存器R7保存的数据为255(0FFH),由于执行1条指令(标有“*”号的指令)为2个机器周期,所以这2个机器周期会重复执行255次。程序实际所耗的准确机器周期为:1+2×255=511个机器周期,延时时间为511×1.1?s =562.1?s。很显然由于人眼的视觉暂存效应,以至于最终看到的效果是LED全部被点亮,因此必须再延长扫描时间,那么最好的办法是使用DJNZ指令再增加一个延时循环,详见程序清单 1.4。

  程序清单 1.4 延时程序范例(2) Delay: MOV R6,#FFH ;1个机器周期

  Delay1: MOV R7,#FFH ;1个机器周期

  Delay2: DJNZ R7,Delay2 ;2个机器周期

  DJNZ R6,Delay1 ;2个机器周期

  延时时间为[1+(1+2×255+2)×255]×1.1?s=143897.6?s=143.8mS,由此可见,如果觉得延时时间不合适,由于R7处于内层循环,因此修改R7的初值对延时的影响太小,那么可以修改R6寄存器的初值。程序清单 1.5为改进后的LED流水灯程序,程序清单 1.6为翻译为机器码后对应的程序。

  程序清单 1.5 LED流水灯程序范例(3) MAIN: MOV A,#1H Loop: MOV P1,A RLC A Delay:MOV R6,#FFH ;延时时间为143.8mS

  Delay1:MOV R7,#FFH

  Delay2 DJNZ R7,Delay2

  DJNZ R6,Delay1

  AJMP Loop

  ;

  END

  程序清单 1.6 LED流水灯程序范例(4) 地址 指令 助记符 注释

  0000 0000 0111 0100 MOV A,#1H ;该指令为2字节

  0000 0001 0000 0001

  0000 0010* 1111 0101 MOV P1,A ;该指令为2字节

  0000 0011 1001 0000

  0000 0100 0011 0011 RLC A ;该指令为1字节

  0000 0101 0111 1110 MOV R6,#FFH ;该指令为2字节

  0000 0110 1111 1111

  0000 0111* 0111 1111 MOV R7,#FFH ;该指令为2字节

  0000 1000 1111 1111

  0000 1001* 1101 1111 DJNZ R7,0009H ;该指令为2字节,跳转到0009H

  0000 1010 1111 1110

  0000 1011 1101 1110 DJNZ R6,0007H ;该指令为2字节,跳转到0007H

  0000 1100 1111 1010

  0000 1101 0000 0001 AJMP 0002H ;该指令为2字节

  0000 1110 0000 0010

  待程序输入正确无误之后,只要将A3实验区的运行开关K11拨到RUN档运行,即可看到LED流水灯效果。

  思考题:如果将“RLC A”指令改为“RL A”,请仔细观察流水灯的效果。

  成功心法(11):过程比结果更重要

  针对“DIY计算机”课程,用人工将汇编语言“编译与链接”为机器码有感而发

  千万不可投机取巧地将程序输入计算机,然后用编译器来代替人工翻译代码。无数的事实证明,用人工翻译机器码的过程对初学者理解程序的设计思想有很大的帮助,因为上面的程序写得再好,那也是作者的设计思想和经验。当初学者在翻译或输入机器码时,就有可能发生错误,比如,第一次翻译机器码就有可能将JZ指令的地址偏移量rel算错,则程序就会出现混乱,这就是人们常说的“bug”,那么初学者在“Debug”的过程中,将一定会得到更多的经验,同时有助于培养初学者的耐心、阅读程序的能力和逻辑思维的能力。

  建议初学者先在一张白纸的左边用铅笔写好地址,将要填写机器码的中间位置暂时空出来,然后将指令助记符写在右边的第3个位置,接着通过查找指令表得到相应的机器码,最右边的则是程序注释。

  当初学者通过阅读和调试一定量的范例程序之后,自然就会想到如何修改和设计程序了,这是一个熟练生巧的自然积累过程。事实上,作者写作《新编电类专业计算机基础》(DIY计算机)图书,从构思到成书前后三年时间,反反复复修改几十次,很多地方多次推倒重来,所以人们常说:深入浅出的文章是改出来,与众不同的口才是练出来,优秀的程序员是“磨”出来的,成功的人之所以成功,因为“剩者为王”。