译作:程序员视角的计算机系统
文章平均质量分 59
从程序员的角度理解计算机系统的硬件,以达到编程实现更好的安全性,可移植性,高性能,高可靠性等
王伟1982
我是数据分析与处理行业的数据采矿工,软件业的代码搬运工,通信业的协议打包工,互联网业的安全检查工
展开
-
程序员视角的计算机系统 部分练习题参考答案
程序员视角的计算机系统 部分练习题参考答案2.5A 小端 21 大端 87B 小端 21 43 大端 87 65C 小端 21 43 65 大端 87 65 432.761 62 63 64 65 66 002.8操作 结果a [01101001]b [01010101]~a...原创 2021-03-26 19:45:09 · 162 阅读 · 1 评论 -
程序员视角的计算机系统 2.3.8 整数的算术的总述
程序员视角的计算机系统 2.3.8 整数的算术的总述正如我们已经看到的,计算机执行的整数的算术的确是模算术的一种形式。表示数的有限的字大小,限制了可能的数的范围,操作的结果可能溢出。我们也看到了二补码表示提供了一种聪明的能够表示正数和负数的方式,当使用相同的比特级别的表示,执行无符号算术例如加法,减法,乘法甚至是除法,无符号与有符号的形式在比特位上是相同或者是极相似的行为。我们已经看到在C语言中的传统做法能够产生一些令人吃惊的结果,这是错误的源头,而且很难被识别和理解。我们特别注意到无符..翻译 2021-03-23 22:15:32 · 173 阅读 · 0 评论 -
程序员视角的计算机系统 2.3.6 常数的乘法
程序员视角的计算机系统 2.3.6 常数的乘法在绝大多数的机器上,整数乘法的指令是相当慢的,需要10多个时钟周期,而其它的整数操作例如加法,减法,位操作,移位,仅需要一个时钟周期。所以,编译器使用的一个重要的优化操作是试图用常数因子与移位和加法操作的组合来替换乘法。我们将首先考虑乘以2的幂的情况然后再泛化这个情况到随意的常数。让x表示为无符号的整数,以二进制的形式,对于k>=0, 我们要求x*2^k的二进制表示为[xw-1,xw-2,...x0,0,0,0],k个0加到了右边。注意.翻译 2021-03-22 21:48:01 · 256 阅读 · 0 评论 -
程序员视角的计算机系统 2.3.5 二进制的补码的乘法
程序员视角的计算机系统 2.3.5 二进制的补码的乘法在C中,有符号的整数的乘法通常被执行为截取低的w位。公式如下:如下的图2.26是二进制的补码的乘法的例子:练习问题2.34根据图2.26的计算风格,填写如下的表格的空白处,显示出不同的3位长的数的乘法:模式 x y x*y 截断的x*y———— ————— ————— ——— —————无符号 _...翻译 2021-03-21 11:26:46 · 586 阅读 · 0 评论 -
程序员视角的计算机系统 2.3.4 无符号的乘法
程序员视角的计算机系统 2.3.4 无符号的乘法整数x,y在0<=x,y<2^w-1的范围内,能够被表示为w位长的无符号数,但是它们的乘积在0到(2^w-1)^2之间,这要求有2w位长。取而代之的是,在C中一个无符号的乘法被 定义为返回低的w位长的结果。根据2.9的公式,这等价于对2^w取余。这个乘法的公式是2.16如下所示:...翻译 2021-03-21 10:56:20 · 173 阅读 · 0 评论 -
程序员视角的计算机系统 2.3.3 二进制的补码的减法
程序员视角的计算机系统 2.3.3 二进制的补码的减法对于x的相反数的公式为如下的公式2.15练习问题2.33我们表示一个位长为4的一个十六进制的数字。对于二补码解释的数,填写如下的表格:x t4x______________ __________________十六进制 十进制 十进制 十六进制——————————————————0 ———— ———— —————5...翻译 2021-03-20 11:31:08 · 99 阅读 · 0 评论 -
程序员视角的计算机系统 2.3.2 二进制的补码的加法
程序员视角的计算机系统 2.3.2 二进制的补码的加法在x,y满足这个范围时, -2^(w-1)<=x,y<=2^(w-1),有如下的公式2.14图2.24显示了如下的4位长的2补码加法的例子公式2.14也让我们了解了溢出的类型。当x和y都是负值,结果是正值,这是负溢出。当x和y都是正值,结果是负值,这是正溢出。练习问题2.29以图2.24的风格,填写如下的表格的空白处。x y x+y...翻译 2021-03-20 11:12:50 · 324 阅读 · 0 评论 -
程序员视角的计算机系统 2.3 整数的算术
程序员视角的计算机系统 2.3 整数的算术许多程序员的新手惊讶于两个正数相加返回了负数的发现。还有x<y与x-y<0这两个比较竟然返回了不同的结果。这些属性是计算机算术的有限性的缘故。理解计算机算术的局限性能帮助程序员写出更加可靠的代码。2.3.1 无符号的加法考虑两个非负的整数x,y,例如 0<=x,y<=2^w-1.这两个数都能表示为w位长的无符号数。如果我们计算它们的和,然而,我们有一个可能 的范围是0<=x+y<=2^(w+1)-2. 表示这...翻译 2021-03-19 18:43:55 · 223 阅读 · 0 评论 -
程序员视角的计算机系统 2.2.8 在有符号与无符号之间的建议
程序员视角的计算机系统 2.2.8 在有符号与无符号之间的建议正如我们已经看到的,有符号到无符号的隐式的映射导致了一些非直觉的行为。非直觉性的行为经常导致程序的逻辑上的错误,一个包括了隐式映射的错误,尤其是难于发现的。因为,映射的发生没有在代码上的任何明确的显示,程序员经常忽略它的影响。如下的两个练习问题显示了,归纠于隐式映射和无符号的数据类型的一些微妙的错误。练习问题2.25考虑如下的代码,它试图计算一个数组的元素的和,数组的长度是一个参数:1 /*警告:这是一个有错误的代码*..翻译 2021-03-19 12:17:55 · 162 阅读 · 0 评论 -
程序员视角的计算机系统 2.2.7 截断一个数
程序员视角的计算机系统 2.2.7 截断一个数假定不是扩展一个数, 我们要降低一个数的二进制比特位的表示的数量。例如,这发生在如下的代码中:1 int x=53191;2 short sx=(short) x; /*-12345*/3 int y=sx; /*-12345*/在一个经典的32位长的机器上,当我们把一个x映射到短整数类型时,我们把32位长的整型数截短成16位长的短整型。正如我们之前看到的这个16位长的模式是-12345的二补码...翻译 2021-03-18 20:20:20 · 331 阅读 · 0 评论 -
程序员视角的计算机系统 2.2.6 扩展一个数的比特级的表示方式
程序员视角的计算机系统 2.2.6 扩展一个数的比特级的表示方式在不同的字大小的整数之间转换的一个共同的操作是保留相同的数值的值。当然了,当目的数据类型太小而无法表示目标值时,这是不可能的实现的。把一个较小的数据类型转换成一个较大的数据类型时,应该总是可行的。为了转换一个无符号的数为一个较大的数据类型,我们能简单地加零来实现,这叫加零扩展。对于一个二补码的数转换为一个较大的数据类型时,规则是执行一个符号扩展,添加最高位的比特位到表示中。作为一个例子,考虑如下的代码:1 short...翻译 2021-03-18 18:15:55 · 256 阅读 · 0 评论 -
程序员视角的计算机系统 2.2.5 在C语言中的有符号与无符号
程序员视角的计算机系统 2.2.5 在C语言中的有符号与无符号C中默认为有符号数,如果在结尾加上U,u则被视为无符号数。C允许 在有符号与无符号之间转换。规则是二进制的表示是不变的。在显式的映射的情况下,转换能发生,例如如下的代码:1 int tx,ty;2 unsigned ux,uy;34 tx=(int) ux;5 uy=(unsigned) ty;还有,当 一个数据类型的表达式被赋值为其它类型的变量的值时,转换是隐式发生的。如下代码:1 int...翻译 2021-03-17 18:25:07 · 604 阅读 · 0 评论 -
程序员视角的计算机系统 2.2.4 有符号与无符号之间的转换
程序员视角的计算机系统 2.2.4 有符号与无符号之间的转换C允许在不同的数值数据类型之间的转换。例如,假定变量x被定义为有符号整数,或者是无符号整数。表达式(unsigned)x 被转换x的值为一个无符号的值。(int) u把u的值转换成一个有符号的值。从有符号到无符号的转换效果是什么,反之亦然?从 一个数学的角度上看,能想象出一些情况。很清楚的是,我们要在各种形式中,保持能被表示的任何值。另一个方面,转换一个负数到无符号可能返回0。把一个无符号转换成一个有符号的数,值太大了而不能在二补码.翻译 2021-03-16 19:52:19 · 429 阅读 · 0 评论 -
程序员视角的计算机系统 2.2.3 二进制的补码的编码
程序员视角的计算机系统 2.2.3 二进制的补码的编码对于许多的应用,我们期望表示负数。绝大部分的计算机的有符号的数的表示是2补码形式。这个定义把最高位解释为负的权重值。我们表达这个解释为B2Tw:最高位也叫做符号位。它的大小是-2^(w-1) 当符号位为1时,表示的值是负的,当符号位为0,表示的值为非负数。让我们考虑一下能被w位长的2补码表示的数的范围。最小值是[10....00]它的值是TMinw=-2^(w-1)最大值是[01....11]它的值是TMaxw=2^(w-1)-1.翻译 2021-03-15 18:28:24 · 243 阅读 · 0 评论 -
程序员视角的计算机系统 2.2 整数的表示
程序员视角的计算机系统 2.2 整数的表示在这一部分中,我们描述用比特来编码整数的两种不同的方式。一个仅能够表示非负的整数。另一个能够表示所有的整数。我们将看到它们的数学性质与它们的机器级别的实现是高度相关的。我们也调查研究了在适合不同的长度的表示时的扩展与收缩一个编码过的整数的效果。2.2.1 整数的数据类型C支持一些整数的类型,一个表示整数的有限的范围。每个类型能使用关键字char,short,long或者是long long来指定大小,正如所表示的数是非负的,还是可负的(这是默认的情.翻译 2021-03-14 10:37:32 · 194 阅读 · 0 评论 -
程序员视角的计算机系统 2.1.10 C语言中的移位的操作
程序员视角的计算机系统 2.1.10 C语言中的移位的操作C也提供了把比特位模式向左或者是向右的移位操作。对于一个操作数x有比特位的表示[xn-1,xn-2,...x0],C表达式x<<k 返回一个表示[xn-k-1,xn-k-2,...x0,0....0]也就是,去掉k 个最高位,在右侧添加K个0。且0<=k<n-1.移位操作是左结合的,所以x<<j<<k等价于 (x<<j)<<k这有一个相对应的右移操作x>>.翻译 2021-03-13 13:39:52 · 187 阅读 · 0 评论 -
程序员视角的计算机系统 2.1.9 C语言中的逻辑操作
程序员视角的计算机系统 2.1.9 C语言中的逻辑操作C语言也提供了一些逻辑操作的操作符,||,&&,!,它们对应于逻辑上的或者,与,非。这可能与比特位上的操作容易混淆,但是它们的功能是很不同的。逻辑操作认为非零值为真,零值为假。它们返回0或者是1,表示假与真的结果。这是如下的一些例子:表达式 结果——————————————!0x41 0x00!0x00 0x0...翻译 2021-03-12 18:06:53 · 202 阅读 · 0 评论 -
程序员视角的计算机系统 2.1.8 C语言中的比特级的操作
程序员视角的计算机系统 2.1.8 C语言中的比特级的操作C的一个有用的特征是支持比特级的布尔操作。在事实上,对于布尔操作我们已经使用的符号,已经被C语言使用了: |是或者,&是与,~是非,^是异或。这些能被应用于任何整数数据类型。也就是一个数被声明为Int或者char无论有没有如下的前缀 short,long,long long.这有一些表达式的例子:C表达式 二进制表达式 二进制结果 十六进制结果——————————...翻译 2021-03-12 12:04:37 · 430 阅读 · 0 评论 -
程序员视角的计算机系统 2.1.7 布尔代数的介绍
程序员视角的计算机系统 2.1.7 布尔代数的介绍因为二进制的值是计算机如何编码,存储,维护信息的核心,围绕着0和1的值的研究,已经进化出庞大的数学知识体系。这开始于乔治布尔的1850年左右的工作,因此叫做布尔代数。布尔注意到通过把逻辑上的真与假编码为二进制值0和1,他能形式化一个代数,这个代数捕捉到了逻辑推理的基本原则。最简单的布尔代数定义为2个元素的集合{0,1}。图2.7定义了在这个代数中的一些操作。为了表示这些操作我们选择的符号来匹配C语言中的比特位级的操作,这在稍后讨论。布尔操.翻译 2021-03-11 21:53:58 · 536 阅读 · 0 评论 -
程序员视角的计算机系统 2.1.6 代码的表示形式
程序员视角的计算机系统 2.1.6 代码的表示形式考虑如下的C函数:1 int sum(int x,int y){2 return x + y:3 }当在我们的例子机器上编译时,我们生成了如下的字节表示的机器代码:Linux 32: 55 89 e5 8b 45 0c 03 45 08 c9 c3Windows: 55 89 e5 8b 45 0c 03 45 08 5d c3Sun : 81 c3 e0 08 90 02 00 09...翻译 2021-03-11 18:03:06 · 154 阅读 · 0 评论 -
程序员视角的计算机系统 2.1.5 表示字符串
程序员视角的计算机系统 2.1.5 表示字符串在C中的一个字符串,被编码为一个字符的数组,以null字符结束(它的值为0)通过一个标准化的编码,每个字母都能被表示,最常用的是美国标准的字符编码。因此,如果我们运行一个程序show_bytes ,以参数 “123456”和6(包括了终止符)我们能得到结果是 31 32 33 34 35 00。注意的是美国标准的字符编码对于十进制的数字x,它的十六进制的值是0x3x,终止字节的十六进制的表示是0x00. 在任何系统上使用美国标准的字符编码,都会得..翻译 2021-03-10 20:10:34 · 117 阅读 · 0 评论 -
程序员视角的计算机系统 2.1.4 地址与字节序
程序员视角的计算机系统 2.1.4 地址与字节序对于跨越多个字节的程序对象来说,我们必须建立两个规范:对象的地址将是什么,我们如何对内存中的字节进行排序。在所有的机器上虚拟中,一个多字节的对象被存储在一个连续的字节的序列中。例如,假定一个变量x的类型是int,它的地址是0x100也就是地址表达式&x的值是 0x100。然后x的4个字节在内存中的存储位置是0x100,0x101,0x102,0x103.为了对表示一个对象的字节进行排序,有两种共同的传统。考虑一个有w位长的整数,它有.翻译 2021-03-10 12:51:21 · 411 阅读 · 0 评论 -
程序员视角的计算机系统 第一章 计算机系统 之旅
程序员视角的计算机系统 第一章 计算机系统 之旅一个计算机系统由硬件和系统软件组成,硬件和软件一起工作来运行应用程序。系统的特定的实现随时间的流逝而改变,但是它的本质性的概念不会改变。所有的计算机系统都有相似的硬件和软件组件来执行相似的功能。这本书为程序员而写,程序员们需要在他们的工作中做得更好,这要通过理解这些软硬件的组件是如何工作的,这些组件如何影响他们的程序的正确性和性能。对于一个令人兴奋的旅程,你要沉着。如果你决定学习本书的概念,那么你将在一个通向成为一个稀少的大程序员的道路上,通翻译 2021-03-09 18:02:26 · 169 阅读 · 0 评论 -
程序员视角的计算机系统 2.1.3 数据大小
程序员视角的计算机系统 2.1.3 数据大小计算机和编译器支持多种数据格式,使用不同的编码方式,例如整数和浮点数,有不同的长度。例如,许多的机器 有指令来操作单字节,双字节,四字节,八字节,它们也支持浮点数的四字节和八字节。C语言对于整数和浮点数都支持多种数据格式。C的数据 类型char 表示为一个字节。尽管命名char来自于在文本字符串中存储一个字母的事实,它也能被用来存储整数。C的数据类型int也能加上前缀 short,long,long long,来表示提供不同的大小的整数。图2...翻译 2021-03-08 18:02:56 · 157 阅读 · 0 评论 -
程序员视角的计算机系统 2.1.2 字
程序员视角的计算机系统 2.1.2 字每个计算机都有一个字的大小,显示出整数和指针数据的名义上的大小。因为一个虚拟地址被这样的一个字进行编码,字的大小确定的最重要的系统参数是虚拟地址空间的大小。也就是对于一个机器而言,一个w位长的字大小,虚拟地址的范围是从0到2^w-1,程序能读取的最多2^w个字节。如今大部分的私人的计算机有32位的字长。这限制了虚拟地址空间为4GB。也就是仅超过4*10^9字节数。尽管这对于大部分的应用而言是非常大的空间了,但是我们在使用许多的大规模的科学计算和数据..翻译 2021-03-08 12:58:48 · 132 阅读 · 0 评论 -
程序员视角的计算机系统 2.1.1 十六进制的标识法
程序员视角的计算机系统 2.1.1 十六进制的标识法一个单独的字节由8个比特组成。在二进制的标识法,它的值从00000000(2)到1111111(2)。当它被视为一个十进制的数时,它的值范围是0(10)到255(10)。对于描述比特的模式二进制与十进制都不是很方便。二进制太繁琐了,而十进制的标识法,与二进制之间的转换太繁琐了。使用十六进制的话,使用数字0到9和字母A到F,来表示16个可能的值。图2.2显示了十进制的值,二进制的值与16个十六进制的数字的关联。以十六进制 写出一个单个的字节的值.翻译 2021-03-07 09:38:14 · 887 阅读 · 0 评论 -
程序员视角的计算机系统 2.1 信息存储
程序员视角的计算机系统 2.1 信息存储绝大部分的计算机并不是在内存中读取单独的比特位,而是使用8个比特位的块,叫做字节,字节是内存中最小的有地址的存储单元。一个机器级的程序把内存视为一个字节的巨大的数组。,作为虚拟内存来引用它。内存中的每一个字节都被唯一地标识为一个数,这是它的地址,所有的可能的地址的集合,叫做虚拟地址空间。正如它的名称所显示的,这个虚拟地址空间仅是展示给机器级程序的概念性的图景。实际的实现(在第9章中)使用了一个随机读取内存和磁盘存储和特定硬件,操作系统软件的组合,来提..翻译 2021-03-06 12:21:56 · 129 阅读 · 0 评论 -
程序员视角的计算机系统 第一部分 程序的结构与执行
程序员视角的计算机系统 第一部分 程序的结构与执行我们的计算机系统的探索开始于学习计算机本身,从一个处理器和一个内存子系统开始。在核心, 我们要求表示基本的数据类型的方式,例如对整数和实数算法的估计。从这我们能够考虑机器级别的指令如何操纵数据和一个编译器是如何翻译C语言的程序到这些指令的。接下来,为了得到硬件资源是如何使用来执行指令的更好的理解,我们研究了实现一个处理器的几种方法。一旦我们理解了编译器和机器级别的代码,我们能够检查通过写C程序来如何最大化程序的性能,当编译之后,达到最大的可能.翻译 2021-03-05 22:30:04 · 286 阅读 · 0 评论 -
程序员视角的计算机系统 1.9 重要主题
程序员视角的计算机系统 1.9 重要主题这里包括了我们的刚开始的旋风般的系统之旅。从这个讨论中来的一个重要的思想是一个不仅仅由硬件组成。它是一个硬件与系统软件交织在一起的集合,为了完成运行应用程序的终极任务,必须合作。这本书的剩下的部分,将完成硬件和软件的一些细节部分,通过了解了这些细节,它将显示出你能如何写出好的程序,让程序更快,更可靠,更安全。为了结束这一章,我们强调一些重要的概念,它们关系到计算机系统的所有的方面。我们将在本书中,多次讨论这些概念的重要性。 1.9.1 并...翻译 2021-03-04 12:49:26 · 165 阅读 · 1 评论 -
程序员视角的计算机系统 1.8 系统通过网络与其它的系统通信
程序员视角的计算机系统 1.8 系统通过网络与其它的系统通信在我们的系统之旅进行到这一点时,我们已经把一个系统视作一个孤立的硬件与软件的集合。在实践中,现代的系统 常常通过网络与其它的系统进行链接。从一个独立的系统的视角来看网络也被视为仅是一个另外的输入与输出设备,正如图1.14所示。当系统复制一些字节的序列从内存到网络适配器,数据流通过网络到达其它的机器,代替了到一个本地的磁盘驱动器。相似的是,系统能够读取其它的机器发送的数据和复制这个数据到它的内存中。随着全球网络的发展,例如互联网.翻译 2021-03-03 13:10:00 · 158 阅读 · 0 评论 -
程序员视角的计算机系统 1.7 操作系统管理硬件
程序员视角的计算机系统 1.7 操作系统管理硬件回顾我们的你好程序的例子。当外壳程序加载和运行你好程序时,当你好程序打印了它的消息的时候,程序根本没有直接读取键盘,显示器,磁盘,内存中的任何一个。然而,它们依赖操作系统提供的服务。我们能够认为操作系统介于应用程序和硬件之间的一层软件,如图1。10所示一个应用程序要操作硬件的所有的尝试必须通过操作系统。操作系统有两个主要的目标,1是保护硬件避免运行的应用的误操作。2是为应用提供一个简单和统一的操作机制,尽管底层的硬件设备是各种各样的。操作.翻译 2021-03-02 12:29:25 · 346 阅读 · 0 评论 -
程序员视角的计算机系统 1.6 存储设备形成了一个层次
程序员视角的计算机系统 1.6 存储设备形成了一个层次在一个处理器与一个更大的更慢的设备(例如内存)之间插入一个更小的更快的存储设备的观念是一个通用的思想。在事实上,在每个计算机系统中存储设备都被组织成一个存储的层级,类似于图1。9的样子。正如我们从层级的顶层移到底层,设备变得更慢了,更大了,每个字节的成本更低了。寄存器文件占据着顶层,它是第0级。我们显示了缓冲的第1到第3级,占据着存储层级的第1到3级。内存在第4级,如此等等。一个存储层级的主要思想是一个层级的存储作为缓冲来为下一更低的翻译 2021-03-01 19:14:51 · 115 阅读 · 0 评论 -
程序员视角的计算机系统 1.5 缓冲问题
程序员视角的计算机系统 1.5 缓冲问题从这个简单的例子上的一个重要的课程是一个系统花费了大量的时间来把信息从一个地方移到另一个地方。在你好程序中的机器指令刚开始时存储在磁盘中。当程序被加载时,它们被复制到内存中。当处理器运行程序时,指令从内存复制到处理器中。相似的是,数据字符串“hello,world”,刚开始时在磁盘上,被复制到内存中,然后被从内存中复制到显示器上。从一个程序员的视角来看,这种复制是无用的,它减慢了程序的真正的工作。因此对于系统的设计者的一个主要的目标是把这些复制的操作运行翻译 2021-02-28 22:02:00 · 115 阅读 · 0 评论 -
程序员视角的计算机系统 1.4 处理器读取并且解释执行存储在内存中的指令
程序员视角的计算机系统 1.4 处理器读取并且解释执行存储在内存中的指令在这一点上, 我们的源程序已经被编译系统翻译成一个可执行的目标文件叫做 并且存储在磁盘上。为了在操作系统上运行这个程序,我们需要在外壳上输入这个名称:unix> ./hellohello,worldunix>外壳是一个命令行的解释器,它打印一个提示符,等待你输入一个命令行,然后执行命令。如果命令行的第一个词没有对应于外壳本身包括的命令,它假定这个词是可执行文件的名称,这个文件需要应该加载并且执行。所.翻译 2021-02-28 21:58:13 · 332 阅读 · 0 评论 -
程序员视角的计算机系统 1.3 要理解编译系统是如何工作的
程序员视角的计算机系统 1.3 要理解编译系统是如何工作的对于简单的程序例如hello.c 我们能够依赖编译系统来生成正确的和有效率的机器代码。然而还有一些其它的重要原因来说明为什么程序员需要理解编译系统是如何工作的。优化程序性能现代的编译器是复杂的工具,通常能生成好代码。作为程序员,我们不需要知道编译器的内部工作原理,然而为了做好的编码决策,我们的确需要对机器级代码有一个基本的理解以及编译器是如何翻译不同的C语言语句到机器代码的。例如一个分支 语句总是比一个条件语句的序列更有效率吗? 一翻译 2021-02-27 20:17:43 · 193 阅读 · 0 评论 -
程序员视角的计算机系统 1.2 程序由其它的程序转换成不同的形式
程序员视角的计算机系统 1.2 程序由其它的程序转换成不同的形式你好程序作为一个高级的C程序的开始程序,因为它能被人阅读和理解。然而为了在系统中运行这个程序,独立的C语言的语句必须被其它的程序翻译为低级的机器语言的指令的序列。这些指令是被打包为一种叫做可执行的目标程序的形式并且存储在一个二进制的磁盘文件中。目标程序被引用作为一个可执行的目标文件。在一个unix系统中,从一个源文件到目标文件的翻译由一个编译器来执行。unix> gcc -o hello hello.c这里有一个g翻译 2021-02-26 21:58:41 · 114 阅读 · 0 评论 -
程序员视角的计算机系统 1.1 信息是比特加上上下文
程序员视角的计算机系统 1.1 信息是比特加上上下文我们的你好程序开始了生命,以一个源程序(或者是源文件)这是一个程序员用编辑器创建并且保存的文本文件叫做hello.c 源程序是一个比特的序列,每个比特有0或者是1的值,每8个比特位组成了一个字节。每个字节在程序中表示一个文本字符。绝大部分的现代计算机表示文本字符使用美国字符标准集,它使用一个字节表示一个字符。例如图1。2展示了hello.c的程序的编码。hello.c的程序被存储在一个文件中,它是字节的序列。每个序列有一个整数,这个翻译 2021-02-25 20:53:20 · 157 阅读 · 0 评论 -
最简单的汇编器的javascript版本
根据 最简单的汇编器与反汇编器的设计文档的内容,开发了最简单的汇编器的javascript版本,在网络上的演示结果如下图所示:解析汇编指令与生成机器语言代码的javascript的主要代码如下所示:var instruction_arr=['halt','nop','rrmovl','cmovle','cmovl','cmove','cmovne','cmovge','cmovg','irmovl','rmmovl','mrmovl','addl','subl','andl','xorl','j原创 2020-11-14 22:28:33 · 354 阅读 · 0 评论 -
最简单的汇编器与反汇编器的设计文档
在程序员视角的计算机系统这本书的第四章中,有一个Y86的指令集架构。这个架构有满足功能的最小的指令集。指令与机器码的对应关系见下图这个设计的图中,有一个隐藏给出的信息,还缺少一个重要的设计信息,它们都是什么呢?欢迎留言回复。根据如上的设计文档,开发的汇编器,可以实现如下的功能:irmovl $15,%ebx/p>rrmovl %ebx,%ecxrmmovl %ecx,-3(%ebx)addl %ebx,%ecxjmp loop上述的汇编指令,经过汇编器的汇编生成原创 2020-11-11 21:29:01 · 309 阅读 · 1 评论 -
程序员视角的计算机系统 第一章 计算机系统之旅
一个计算机系统由硬件和系统软件组成,硬件和软件一起工作来运行应用程序。系统的特定的实现随时间的流逝而改变,但是它的本质性的概念不会改变。所有的计算机系统都有相似的硬件和软件组件来执行相似的功能。这本书为程序员而写,程序员们需要在他们的工作中做得更好,这要通过理解这些软硬件的组件是如何工作的,这些组件如何影响他们的程序的正确性和性能。对于一个令人兴奋的旅程,你要沉着。如果你决定学习本书的概念,那么你将在一个通向成为一个稀少的大程序员的道路上,通过对内在的计算机系统和系统对你的应用程序的影响的理翻译 2020-11-10 18:03:29 · 255 阅读 · 0 评论