汇编语言程序的开发有哪4个步骤(汇编语言程序如何运行)
- 前端设计
- 2023-08-13
- 76
c语言程序设计语言经历了哪些阶段程序设计语言的发展经历了从机器语言、汇编语言到高级语言三个阶段,其中c语言程序设计是高级阶段。。第一阶段:机器语言机器语言是由二进制0、...
c语言程序设计语言经历了哪些阶段
程序设计语言的发展经历了从机器语言、汇编语言到高级语言三个阶段,其中c语言程序设计是高级阶段。。
第一阶段:机器语言
机器语言是由二进制0、1代码指令构成,不同的CPU具有不同的指令系统。机器语言程序难编写、难修改、难维护,需要用户直接对存储空间进行分配,编程效率极低。这种语言已经被渐渐淘汰了。
第二阶段:汇编语言
汇编语言指令是机器指令的符号化,与机器指令存在着直接的对应关系,所以汇编语言同样存在着难学难用、容易出错、维护困难等缺点。但是汇编语言也有自己的优点:可直接访问系统接口,汇编程序翻译成的机器语言程序的效率高。从软件工程角度来看,只有在高级语言不能满足设计要求,或不具备支持某种特定功能的技术性能(如特殊的输入输出)时,汇编语言才被使用。
第三阶段高级语言
高级语言是面向用户的、基本上独立于计算机种类和结构的语言。其最大的优点是:形式上接近于算术语言和自然语言,概念上接近于人们通常使用的概念。高级语言的一个命令可以代替几条、几十条甚至几百条汇编语言的指令。因此,高级语言易学易用,通用性强,应用广泛。高级语言种类繁多,可以从应用特点和对客观系统的描述两个方面对其进一步分类。
如何快速word汇编成册
将文件汇编成册的方法有很多,主要可以采用文档软件或互联网环境。
首先,可以使用Office软件中的Word、Excel等文档工具,将文件上传到该软件中进行合并,最后将其整理成相应的文件格式。
也可以在网络环境中,例如Google文档或其它第三方文档服务提供商,通过上传电子文档的方式,将多个文件进行整合或者合并,然后生成新的文件,下载保存即可。
汇编语言自学该怎么学
你要是想学习汇编语言要从基础学起,如果你以后打算从事软件开发领域的话,学习汇编是非常必要的。
学习汇编可以让你对编程的底层实现,对计算机的工作原理都有很清晰的认识,只有明白了底层的实现原理,以后学习高级语言的时候才能有的放矢。所以,我支持你学习汇编语言。
学习汇编语言,目前的教程就那几本一本是《IBM80x86汇编语言简明教程》清华大学出版社温冬禅编的这本书介绍的比较全面,所以的内容都有涉及,但是不适合没有基础的初学者,因为好多的基础的东西都是一笔带过,让你看了很难理解。
还有一本是《汇编语言》清华大学出版社王爽著我在这里强烈推荐这本书,这本书对于初学者简直就是救命稻草,它深入浅出,从最基本的开始,步步深入,让你很轻松的学会汇编语言我刚开始是用第一本,看了好几次都看不下去。。最后经别人推荐买了第二本,真的是喜欢死了,你可以去搜下关于这本书的评论,绝对经典。
学习汇编需要学习:微机原理、C语言要会点.工具masm5.06.0都可以罗云彬教授的windows32位汇编可以看看。
学汇编一定要记住所学芯片的指令集,掌握指令集的功能及使用格式。记住一定不要漏看了,漏一个标点都不行。还有要学算法(差不多数据结构也在这里学),只要掌握了算法,学一种计算机语言只要知道他的语法就会用,因为各种语言的算法用起来都是一样的。
剩下的就是学计算机的运算逻辑,明白机器指令是怎么一条条执行的,特别是寄存器的分配问题(这是汇编语言特有的)。注意你自己编程序的时候,先把寄存器怎么使用的,以后又是如何变换的全都列出来,分配好。
最后就是多做练习了。加油把孩子
汇编语言如何发展到C语言的
我给你说说二者的区别,再去看看演变历史!
一、汇编语言是什么?
我们知道,CPU只负责计算,本身不具备智能。你输入一条指令(instruction),它就运行一次,然后停下来,等待下一条指令。这些指令都是二进制的,称为操作码(opcode),比如加法指令就是00000011。编译器的作用,就是将高级语言写好的程序,翻译成一条条操作码。对于人类来说,二进制程序是不可读的,根本看不出来机器干了什么。为了解决可读性的问题,以及偶尔的编辑需求,就诞生了汇编语言。汇编语言是二进制指令的文本形式,与指令是一一对应的关系。比如,加法指令00000011写成汇编语言就是ADD。只要还原成二进制,汇编语言就可以被CPU直接执行,所以它是最底层的低级语言。二、来历
最早的时候,编写程序就是手写二进制指令,然后通过各种开关输入计算机,比如要做加法了,就按一下加法开关。后来,发明了纸带打孔机,通过在纸带上打孔,将二进制指令自动输入计算机。为了解决二进制指令的可读性问题,工程师将那些指令写成了八进制。二进制转八进制是轻而易举的,但是八进制的可读性也不行。很自然地,最后还是用文字表达,加法指令写成ADD。内存地址也不再直接引用,而是用标签表示。这样的话,就多出一个步骤,要把这些文字指令翻译成二进制,这个步骤就称为assembling,完成这个步骤的程序就叫做assembler。它处理的文本,自然就叫做aseemblycode。标准化以后,称为assemblylanguage,缩写为asm,中文译为汇编语言。每一种CPU的机器指令都是不一样的,因此对应的汇编语言也不一样。本文介绍的是目前最常见的x86汇编语言,即Intel公司的CPU使用的那一种。三、寄存器
学习汇编语言,首先必须了解两个知识点:寄存器和内存模型。
先来看寄存器。CPU本身只负责运算,不负责储存数据。数据一般都储存在内存之中,CPU要用的时候就去内存读写数据。但是,CPU的运算速度远高于内存的读写速度,为了避免被拖慢,CPU都自带一级缓存和二级缓存。基本上,CPU缓存可以看作是读写速度较快的内存。但是,CPU缓存还是不够快,另外数据在缓存里面的地址是不固定的,CPU每次读写都要寻址也会拖慢速度。因此,除了缓存之外,CPU还自带了寄存器(register),用来储存最常用的数据。也就是说,那些最频繁读写的数据(比如循环变量),都会放在寄存器里面,CPU优先读写寄存器,再由寄存器跟内存交换数据。寄存器不依靠地址区分数据,而依靠名称。每一个寄存器都有自己的名称,我们告诉CPU去具体的哪一个寄存器拿数据,这样的速度是最快的。有人比喻寄存器是CPU的零级缓存。四、寄存器的种类早期的x86CPU只有8个寄存器,而且每个都有不同的用途。现在的寄存器已经有100多个了,都变成通用寄存器,不特别指定用途了,但是早期寄存器的名字都被保存了下来。
●EAX●EBX●ECX●EDX●EDI●ESI●EBP●ESP
上面这8个寄存器之中,前面七个都是通用的。ESP寄存器有特定用途,保存当前Stack的地址(详见下一节)。我们常常看到32位CPU、64位CPU这样的名称,其实指的就是寄存器的大小。32位CPU的寄存器大小就是4个字节。
五、内存模型:Heap
寄存器只能存放很少量的数据,大多数时候,CPU要指挥寄存器,直接跟内存交换数据。所以,除了寄存器,还必须了解内存怎么储存数据。程序运行的时候,操作系统会给它分配一段内存,用来储存程序和运行产生的数据。这段内存有起始地址和结束地址,比如从0x1000到0x8000,起始地址是较小的那个地址,结束地址是较大的那个地址。程序运行过程中,对于动态的内存占用请求(比如新建对象,或者使用malloc命令),系统就会从预先分配好的那段内存之中,划出一部分给用户,具体规则是从起始地址开始划分(实际上,起始地址会有一段静态数据,这里忽略)。举例来说,用户要求得到10个字节内存,那么从起始地址0x1000开始给他分配,一直分配到地址0x100A,如果再要求得到22个字节,那么就分配到0x1020。这种因为用户主动请求而划分出来的内存区域,叫做Heap(堆)。它由起始地址开始,从低位(地址)向高位(地址)增长。Heap的一个重要特点就是不会自动消失,必须手动释放,或者由垃圾回收机制来回收。
六、内存模型:Stack
除了Heap以外,其他的内存占用叫做Stack(栈)。简单说,Stack是由于函数运行而临时占用的内存区域。请看下面的例子。
1234上面代码中,系统开始执行main函数时,会为它在内存里面建立一个帧(frame),所有main的内部变量(比如a和b)都保存在这个帧里面。main函数执行结束后,该帧就会被回收,释放所有的内部变量,不再占用空间。如果函数内部调用了其他函数,会发生什么情况?
12345上面代码中,main函数内部调用了add_a_and_b函数。执行到这一行的时候,系统也会为add_a_and_b新建一个帧,用来储存它的内部变量。也就是说,此时同时存在两个帧:main和add_a_and_b。一般来说,调用栈有多少层,就有多少帧。等到add_a_and_b运行结束,它的帧就会被回收,系统会回到函数main刚才中断执行的地方,继续往下执行。通过这种机制,就实现了函数的层层调用,并且每一层都能使用自己的本地变量。所有的帧都存放在Stack,由于帧是一层层叠加的,所以Stack叫做栈。生成新的帧,叫做”入栈”,英文是push;栈的回收叫做”出栈”,英文是pop。Stack的特点就是,最晚入栈的帧最早出栈(因为最内层的函数调用,最先结束运行),这就叫做”后进先出”的数据结构。每一次函数执行结束,就自动释放一个帧,所有函数执行结束,整个Stack就都释放了。
Stack是由内存区域的结束地址开始,从高位(地址)向低位(地址)分配。比如,内存区域的结束地址是0x8000,第一帧假定是16字节,那么下一次分配的地址就会从0x7FF0开始;第二帧假定需要64字节,那么地址就会移动到0x7FB0。
七、CPU指令
7.1一个实例
了解寄存器和内存模型以后,就可以来看汇编语言到底是什么了。下面是一个简单的程序example.c。
123456gcc将这个程序转成汇编语言。
1上面的命令执行以后,会生成一个文本文件example.s,里面就是汇编语言,包含了几十行指令。这么说吧,一个高级语言的简单操作,底层可能由几个,甚至几十个CPU指令构成。CPU依次执行这些指令,完成这一步操作。example.s经过简化以后,大概是下面的样子。
12345678910111213可以看到,原程序的两个函数add_a_and_b和main,对应两个标签_add_a_and_b和_main。每个标签里面是该函数所转成的CPU运行流程。每一行就是CPU执行的一次操作。它又分成两部分,就以其中一行为例。
1这一行里面,push是CPU指令,%ebx是该指令要用到的运算子。一个CPU指令可以有零个到多个运算子。下面我就一行一行讲解这个汇编程序,建议读者最好把这个程序,在另一个窗口拷贝一份,省得阅读的时候再把页面滚动上来。
7.2push指令
根据约定,程序从_main标签开始执行,这时会在Stack上为main建立一个帧,并将Stack所指向的地址,写入ESP寄存器。后面如果有数据要写入main这个帧,就会写在ESP寄存器所保存的地址。然后,开始执行第一行代码。
1push指令用于将运算子放入Stack,这里就是将3写入main这个帧。虽然看上去很简单,push指令其实有一个前置操作。它会先取出ESP寄存器里面的地址,将其减去4个字节,然后将新地址写入ESP寄存器。使用减法是因为Stack从高位向低位发展,4个字节则是因为3的类型是int,占用4个字节。得到新地址以后,3就会写入这个地址开始的四个字节。
1第二行也是一样,push指令将2写入main这个帧,位置紧贴着前面写入的3。这时,ESP寄存器会再减去4个字节(累计减去8)。
7.3call指令
第三行的call指令用来调用函数。
1上面的代码表示调用add_a_and_b函数。这时,程序就会去找_add_a_and_b标签,并为该函数建立一个新的帧。下面就开始执行_add_a_and_b的代码。
1这一行表示将EBX寄存器里面的值,写入_add_a_and_b这个帧。这是因为后面要用到这个寄存器,就先把里面的值取出来,用完后再写回去。这时,push指令会再将ESP寄存器里面的地址减去4个字节(累计减去12)。
7.4mov指令
mov指令用于将一个值写入某个寄存器。
1这一行代码表示,先将ESP寄存器里面的地址加上8个字节,得到一个新的地址,然后按照这个地址在Stack取出数据。根据前面的步骤,可以推算出这里取出的是2,再将2写入EAX寄存器。下一行代码也是干同样的事情。
1上面的代码将ESP寄存器的值加12个字节,再按照这个地址在Stack取出数据,这次取出的是3,将其写入EBX寄存器。
7.5add指令
add指令用于将两个运算子相加,并将结果写入第一个运算子。
1上面的代码将EAX寄存器的值(即2)加上EBX寄存器的值(即3),得到结果5,再将这个结果写入第一个运算子EAX寄存器。
7.6pop指令
pop指令用于取出Stack最近一个写入的值(即最低位地址的值),并将这个值写入运算子指定的位置。
1上面的代码表示,取出Stack最近写入的值(即EBX寄存器的原始值),再将这个值写回EBX寄存器(因为加法已经做完了,EBX寄存器用不到了)。注意,pop指令还会将ESP寄存器里面的地址加4,即回收4个字节。
你写过的自己觉着最牛X的黑程序是什么
说实话,做过程序员的人都是疯子,这句话是没错的。自从我开始和代码打交道,我见识过各种程序黑科技。比如:有会直接F12改代码,更改学校教务系统成绩并且毫无痕迹的;或者是用Python写代码让室友的电脑一打开LOL就定时5分钟自动关机的;还有玩障碍物游戏时,让程序自动识别眼前是否有障碍,如果有就自动跳过的;
然而这些对我来说都不算什么,在这里,我想说一个我朋友写的程序。
事情是这样的~
有一天我在做爬虫采集一些物流数据,大概500w条,由于数据量较大于是我像我的好朋友巴凯借一个服务器,上分布式。
然而,当我登上他的服务器以后,映入眼帘的是好几个窗口,我一脸懵比!?
可能现在看起来有点混乱,我来解释一下到底发生了什么。。
这几个窗口一共干了那么几件事情:
1.不停地监控新浪微博大号是否有新微博,如果检测到有新微博,则根据该微博主题特征提取评论库中的评论,自动评论该条微博。
2.记录该条评论的ID,用从市场买的成千上万的新浪微博账号「实际上就是cookies」,批量自动给这条评论点赞。
3.与此同时,用另一批买来的小号自动转发点赞该微博。
所以原来新浪微博的那些评论转发点赞水军就是这么来的。。
终于知道为什么自己很久不上的微博号总会自动关注、自动转发、自动评论一些莫名其妙的微博了!
嘿!看客留个赞再溜呗!
c语言程序解析步骤
C语言是一种编程语言,程序的解析步骤是指计算机如何处理编写的C语言程序以生成可执行的二进制代码。C语言程序的解析步骤通常包括以下几个步骤:
1.预处理:C语言预处理器(Preprocessor)会处理包含在程序中的宏定义,以及用#include关键字包含的头文件。预处理器还可以进行条件编译(控制程序的不同部分在何时编译),并删除注释中的内容。
2.编译:编译器将C语言代码转换成中间代码(Assembly代码),并检查语法错误和类型错误。如果存在错误,编译器会发出错误提示信息,通知开发人员进行修正。
3.汇编:汇编器将中间代码转换成机器语言(二进制代码),并生成目标文件。目标文件包含了所编译的程序的对象代码,但不包含任何库函数的代码。
4.链接:链接器会将目标文件和库文件链接起来,生成一个可执行文件。可执行文件包含了完整的程序代码和所需的库文件,可以在计算机上直接运行。
5.运行:最后一步是运行程序,计算机加载可执行文件并执行其中的指令,生成程序的输出。
总的来说,C语言程序的解析步骤是一个自动化的过程,可帮助开发人员生成可执行文件,从而实现所期望的功能。如果在编写代码过程中存在语法错误或逻辑错误,编译器和链接器会提供有用的提示信息,以帮助开发人员及时修正错误。
本文链接:http://xinin56.com/qianduan/7542.html