程序在计算机中的存储和运行过程

上传人:壹****1 文档编号:497855653 上传时间:2023-01-10 格式:DOCX 页数:7 大小:227.54KB
返回 下载 相关 举报
程序在计算机中的存储和运行过程_第1页
第1页 / 共7页
程序在计算机中的存储和运行过程_第2页
第2页 / 共7页
程序在计算机中的存储和运行过程_第3页
第3页 / 共7页
程序在计算机中的存储和运行过程_第4页
第4页 / 共7页
程序在计算机中的存储和运行过程_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《程序在计算机中的存储和运行过程》由会员分享,可在线阅读,更多相关《程序在计算机中的存储和运行过程(7页珍藏版)》请在金锄头文库上搜索。

1、首先,看如下最简单的C语言Helloword的代码1 #include 23 int main()45 printf(hello, worldn”);6上面的代码我们保存在helloworld.c文件中。其本质实际上是由0、1的比特(位)序列构成 的。8位为一个字节。每个字节对应某个文本字符。不少系统用ASCII来表示文本字符。实 际是由一个唯一的同字节大小的整数值来表示每个字符。下面给出helloworld.c的ASCII表 /示 O# tidnicoludennintmain()n104621010105110 1163210997105110404110123nvsp vsp print

2、f(!hel1032323232112 1141051101161024034104101108loworldn!)n10811144321191111141081009211034415910125以此类推,在计算机系统中,任何介质中的数据都是比特序列。把他们区分成不同的数据对 象,是通过数据对象的上下文来确定的。程序编译程序的编译过程如下图所示,分为预处理、编译、汇编、链接等几个阶段。hello.cpreprocessor (cpp)hello-icompiler(ucl)hel lo - ssourcemodifiedisssemfayprogramsourceprogram(text)

3、program (text)(text)printf -Oassemblerhello*i inkerhello(as)(Id)retocatableexecutaljleobjectob/ectprogramsprogram(binary)(binary)预处理:预处理相当于根据预处理命令组装成新的C程序,不过常以i为扩展名。cpp hello.c -o hell.i编译:将得到的i文件翻译成汇编代码.s文件。gcc -S hello.i -o hello.s汇编:将汇编文件翻译成机器指令,并打包成可重定位目标程序的O文件。该文件是二进制文件,字节编码是机器指令。as hello.s -o

4、hello.o链接: 将引用的其他O文件并入到我们程序所在的o文件中,处理得到最终的可执行 文件。gcc -o hello hell.o觀泽器翻译器(cpp r cclr as)(cpp F CC1 r S3)rr.ain . o可重定位X标文件链接器(Id)完仝链接的叮执厅冃标文件硬件组成:从下图中看出一个典型的系统由总线、Cpu、I/O设备、主存等构成。graphics adapterdisplayhello;worldVndisk as network adapters, conirollerregister tilern46I/O busKello ? wot ldn hello代码c

5、ontrollermouse keyboard 用F输斥 hellort:二 1/ bridgsystem bus memory busIMeniorv InterfaALUExpan Bion slots far other devices suchh&ll o executabie stored an disfiCPU: Central Processing Unit, ALU: Arithmetic/Logic Unit, PC: Program counter, USB: Universal Serial Bus.程序执行我们已经讨论了可执行文件产生的过程。接下来讨论哈可执行文件执行的

6、过程。从上面途中 的彩色线条可以清晰的看到这个过程,我们简单的把它分为6步。1. shell程序执行指令,等待用户输入,这里我们输入“hello”。2. shell程序将字符逐一读到寄存器中3再从寄存器取出放到主存中4当我们敲入回车时,shell程序得知输入结束,将hello目标文件的代码和数据拷贝到主存, 从而加载hello文件数据包括最终被输出的字符串“hello, worldn”利用了 DMA访问技术, 数据可不经CPU直接到主存5执行主程序中的机器语言指令,将“hello, worldn”串的字节从主存拷贝到寄存器堆。6从寄存器中把文件拷贝到显示设备。11程序是怎样在计算机中运行的CP

7、U从键盘中读入hello命令,经过shell的解析,shell执行一系列的 指令将hello目标文件中的代码和数据从磁盘中拷贝到主内存当中, 如下图所示:CPU总线接口寄存器文件系統池纯存棒器总线QOO*扩展槽.密待禺絡适配器-类的设备便用鼠标 钮盘 显不器旳总线hello, woridntThvllo就码s存储吝瑶盘上的hello 磁盘脱圻文件这个过程会利用DMA技术,不经过CPU数据直接从磁盘拷贝到内存当中CPUUSB控制器适配器寄存需丈件系统总妓存赭辭总线fiMlor woridln*&411O代码扩展槽留待网络适 配器啖的设备使用rt亂标犍盘显示器uheilof存储在磁盘上的hello

8、 可执*亍文件控制器一旦hello目标文件中的代码和数据被加载到了内存当中,处理器就开始执行hello程序中的 主程序的机器语言指令,这些指令将hello worldn”串中的字符从内存中拷贝到寄存器中, 再从寄存器中将这些内容拷贝到显示设备上,最终显示在屏幕当中。OxcOODOOOOf对用户代码不可!见的存储器0x400000000x08046000用户挨(运行时创建)共寧库的存储辭映射区域运行时堆(由malloc创崖读/写段(-datar .bss)只读段 init,.text * .rodata未使用* esp(栈扬针)4 bxk卜从可执祁文件中加载静态库和动态库的制作我们在实际编程工作

9、中肯定会遇到这种情况:有几个项目里有一些函数模块的功能相同, 实现代码也相同,也是我们所说的重复代码。比如,很多项目里都有一个用户验证的功能。 代码段如下:/UserLogin.h文件,提供函数声明int IsValidUser(char* username, int namelen);/UserLogin.c文件,实现对用户信息的验证int IsValidUser(char* username, int namelen)int IsValid = 0;/*下面是具体的处理代码,略去*/return IsValid如果每个项目都保存着这两个UserLogin.h和UserLogin.c文件,会

10、有以下几个 弊端:1、每个项目里都有重复的模块,造成代码重复。2、代码的重用性不好,一旦IsValidUser的代码发生了变化,为了保持设计的一致性, 我们还要手工修改其他项目里的UserLogin.c文件,既费时又费力,还容易出错。 库文件就是对公共代码的一种组织形式。为了解决上面两个弊端,就提出了用库文件存放公共代码的解决方案,其要点就是 把公共的(也就是可以被多次复用的)目标代码从项目中分离出来,统一存放到库文件中, 项目要用到这些代码的时候,在编译或者运行的时候从库文件中取得目标代码即可。库文件 又分两种:静态库和动态库。如果程序是在编译时加载库文件的,就是使用了静态库。如果是在运行时加载目标代 码,就成为动态库。换句话说,如果是使用静态库,则静态库代码在编译时就拷贝到了程序的代 码段,程序的体积会膨胀。如果使用动态库,则程序中只保留库文件的名字和函数名,在运行 时去查找库文件和函数体,程序的体积基本变化不大。静态库的原则是“以空间换时间”,增加程序体积,减少运行时间;源文件可重定位目标文件p2动态库则是“以时间换空间”,增加了运行时间,但减少了程序本身的体积。完全链接的可执行目标文件静态库的方式main2.c vector,h动态链接的方式

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号