【编程基础】C语言从源程序到可执行程序

一.0,1、文本信息和字符编码 所有的信息在计算机中都是以0、1及其组合形式存在。文本信息也不例外。文本信息是以人类容易理解的方式来呈现信息。

计算机是在美国诞生的,英文26个字母加上其他符号只有128个,只用7个bit便可以完全表示所有符号。用8个bit,及一个byte来表示一个符号的方式就叫做ascii编码。对应的有ascii码表。 比如说要在计算机中表示"i love you"这个信息,采用ascii编码方式,那么在计算机中,那就是69 20 6c 6f 76 65 20 79 6f 75(hex)

但是在其他国家,符号远远多于128个,8个bit远远不够表达所有的符号,于是便有了其他编码方式,像中国的gb2312汉字编码。当然,其他编码方式表达一个符号的字节不一定是8个bit。不同编码国家都有自己的编码方式,不同编码之间的信息之间都要转换。

为了解决这个问题,unicode编码出现了。unicode自身也存在问题。utf编码作为一种unicode的实现方式,解决了unicode的问题。utf8用一个字节表示 一个字符。utf16用2或者4个字节表示一个字符。utf32则用4个字节表示一个字符。

二.文本信息到可执行程序 不论是.c, .cpp 还是.h文件,所有的这些我们称之为程序的东西都是文本信息。他们都无法被计算机认识。计算机只认识0和1.所以要让计算机执行我们用文本信息表示的程序,必须将这些文本信息表示的程序翻译成计算机认识的01代码串。

在linux下,以helloworld.c为例,使用gcc编译器,这个翻译过程一般分为以下四个步骤: 1).preprocessing预处理。 预处理过程会把所有包含的头文件的具体内容插入到指定位置,并把所有的宏展开。gcc下,用 gcc helloworld.c -o helloworld.i -E 可以得到预处理后的文件helloworld.i

2)compilation编译 将预处理后的文件中的所有符号翻译为汇编语言表示的信息。不同的CPU有不同的汇编指令集。不同的编译器有不同的汇编语言表示方式。GCC下,用 gcc helloworld.c -o helloworld.s -S 可以得到编译后用gcc汇编语言表示的文本信息。 其中的每一条汇编语言指定在CPU硬件层都对应着特定的二进制01指令集。

3)assembling汇编 将用汇编语言表示的符号翻译成特定的硬件层支持的二进制01指令集。gcc下,用 gcc helloworld.c -o helloworld.o -c 可以得到汇编后的用01指令集表示的信息文件,我们称之为可重定位的目标文件。

4)linking链接 由于我们引用了别的库中的符号,我们需要将这些符号的二进制指令集以某种方式装入到我们程序中,最后经过一些处理后才得到了能被计算机识别的可执行程序。在linux下,是elf文件。

三. CPU的寻址能力/寻址范围 寻址能力就是CPU能查找的地址的最大范围。 CPU的寻址能力由地址总线的位数决定。 32-bit的CPU指CPU一次能处理指令长度为32bit。 1.平坦地址模式

平坦地址模式将整个存储空间看成一个大的数组,存储空间的地址是线性增长的。

2.虚拟地址空间 32-bit的CPU,虚拟地址空间范围从0到0xffffffff线性增长。我们在程序中操作内存时使用的是虚拟地址。操作系统负责将虚拟地址映射到物理地址空间。

转自csdn:TylerPen的blog

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-06-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java工会

CodeReview常见代码问题

空值恐怕是最容易出现的地方之一。 常见错误有: a. 值为NULL导致空指针异常; b. 参数字符串含有前导或后缀空格没有Trim导致查询为空。 导致以上结果的...

1300
来自专栏安恒网络空间安全讲武堂

适合破解新手的160个crackme练手之04

适合破解新手的160个crackme练手之04 老规矩,先运行程序看看是干嘛的,可以看到程序有点怪异,没有确定按钮,后面知道了原来点击中间阴影部分就是验证功能啦...

2188
来自专栏北京马哥教育

爬虫实践---一次下完所有小说:排行榜小说批量下载

? 一、目标 排行榜的地址: http://www.qu.la/paihangbang/ 找到各类排行旁的的每一部小说的名字,和在该网站的链接。 二、...

3015
来自专栏九彩拼盘的叨叨叨

给新手的 JavaScript 介绍

人与人沟通的语言称为自然语言,人与计算机沟通的语言称为编程语言。编程语言和自然语言的主要不同点是:自然语言表述的内容可以是有多种意思,编程语言表述的内容不会有歧...

852
来自专栏Java架构沉思录

Kafka中的时间轮算法

简单说说时间轮吧,它是一个高效的延时队列,或者说定时器。实际上现在网上对于时间轮算法的解释很多,定义也很全,这里引用一下朱小厮博客里出现的定义:

1012
来自专栏腾讯大讲堂的专栏

设计模式笔记

| 导语 “计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决” “Any problem in computer science can be so...

4638
来自专栏算法修养

PHP 正则表达式抓取网页内容。

我想用php抓取爱奇艺生活类型视频网页里面的元素,应该如何去做呢? 首先我要非常熟悉正则表达式,关于正则表达式的学习,我会写一篇博客一直学习的。 直接举例子: ...

3456
来自专栏阮一峰的网络日志

都柏林核心(Dublin Core)

在上一篇日志中,我介绍了元数据(MetaData),并且说只要有一个集合,就可以定义一套元数据。 这样一来,很自然的,我们就会想到一个问题:有没有可能定义一套通...

2737
来自专栏知晓程序

开发 | 让小程序用上「指纹识别」,只需这 3 个接口

最初,小程序文档中只有具体接口调用方法,并没有给出小程序中调用指纹识别的最佳实践。

1180
来自专栏信安之路

【作者投稿】一道反序列化CTF引起的思考

刚开始看到这道题目,我是懵逼的。因为整篇代码没有数据输入口,然后怀疑有其它机关,抓包、扫目录无果之后,找到了一篇writeup如下:

810

扫码关注云+社区