随笔分类 - 程序是怎样跑起来的
计算机组成原理
摘要:C语言的特点:C语言虽是高级编程语言,但它也具备了能够和汇编语言相媲美的低层处理(内存操作及位操作)功能。 变量和函数:不管使用什么样的编程语言,程序内容都是由数据和处理构成的至于程序的数据和处理具体该如何表示,则根据编程语言的不同而不同。在 C语言中,数据用变量来表示,处理用函数来表示。因而,语言
阅读全文
摘要:到目前为止,我们已经用程序表示了直觉、想法、习惯以及经验等。不过,除此之外,人类还有一个思考方式。思考方式是思考方法的节奏。人类大脑中有类似于“石头、石头、布、剪刀”或“剪刀、石头、石头、布”这种具有节奏感的短语,人类会在此基础上做出判断这就是思考方式。 代码清单 12-4 是用程序来实现思考方式的
阅读全文
摘要:人类的日常判断通常是根据直觉和经验做出的。直觉并不仅仅是简单的任意思考,通常还带有一些个人的思维习惯。在前面的介绍中我们已经提到,通过借助随机数,思考习惯等也是可以表示的。而如果在此基础上再加上经验(记忆)元素的话,想必就可以作成更接近人类思考的程序了。 请大家考虑一下猜拳游戏中是如何用到经验的。经
阅读全文
摘要:接下来,让我们看一下随机数在程序中扮演的角色。在编写游戏程序时,以及在计算机模拟“等情况下,经常使用随机数。随机数也是用程序来表示人类的直觉及念头的一种方法。从代码清单 12-2 的运行结果中大家可以发现,“一直在出石头的时候突然出了一个剪刀”,这确实很像人类的行为方式。 随机数色子(随机数色子的各
阅读全文
摘要:即使是成年人,可能偶尔也会像代码清单 12-1 这样猜拳时随意决定出什么。不过,并不是所有人都如此。例如,“小 A 同学喜欢出石头”,像这样,出拳习惯是因人而异的。习惯也是人类的思考方式。而如果要用程序来表示人类的习惯,就需要对习惯进行定量表现。虽然这里提到了定量,但大家不要想得太复杂。出石头的概率
阅读全文
摘要:那么,如何才能让计算机思考呢?接下来,我们就一边用 C 语言制作《猜拳游戏》,一边来尝试各种思考方式。在猜拳游戏中,程序需要让计算机像猜拳选手一样来思考。因此,为了制作该游戏,就需要“用程序来实现猜拳选手的思考步骤”。请大家冷静地回忆一下自己在猜拳时的思考过程。如果这个思考过程能直接用程序来表现的话
阅读全文
摘要:程序就如同是由计算机执行的各种指令罗列起来的文章。计算机内部的 CPU,通过对该文章的内容进行解析和运行,来控制连接到计算机的各种外围设备。具体来说,控制就是指 CPU 和各种设备之间配合进行数据的输入输出处理。关于程序的运行原理,在前面章节中我们已经从各方面进行了说明。那么,如果此时再问大家“使用
阅读全文
摘要:在本章的最后,让我们一起来看一下显示器显示文字及图形的机制。如果用一句话来简单地概括该机制,那就是显示器中显示的信息一直存储在某内存中。该内存称为 VRAM (Video RAM)。在程序中只要往VRAM中写人数据,该数据就会在显示器中显示出来。实现该功能的程序,是由操作系统或 BIOS 提供,并借
阅读全文
摘要:在了解 IO输人输出及中断处理的同时,还希望大家记住另外一个机制,这就是 DMA ( Direct Memory Access )。DMA 是指在不通过 CPU 的情况下,外围设备直接和主内存进行数据传送。磁盘等都用到了这个 DMA机制。通过利用 DMA,大量数据就可以在短时间内转送到主内存。之所以
阅读全文
摘要:在主程序运行的过程中,中断发生的频率有多大呢?实际上,大部分的外围设备,都会频繁地发出中断请求。其原因就是为了实时处理从外围设备输人的数据。虽然不利用中断也可以从外围设备输入数据。但那种情况下,主程序就必须要持续不断地检测外围设备是否有数据输人。 由于外围设备有很多个,因此就有必要按照顺序来调查。按
阅读全文
摘要:让我们再来看一下图 11-4。在“I/O 范围”下面有一个“IRQ”项目,对应的值是 0x00000006 ( 06)。IRQ(Iterrupt Request) 是中断请求的意思。那么,IQ 主要是用来做什么的呢? IRQ 是用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制。该机制称为中
阅读全文
摘要:首先让我们利用 IN 指令和 OUT 指令,来进行一个直接控制硬件的试验。假设该试验的目的是让计算机内配置的蜂鸣器(小喇叭)发音。虽然蜂鸣器内置在计算机内部,但其本身也是外围设备的一种因为就算是把蜂鸣器取出,对计算机主机也不会有什么影响。 由于用汇编语言编写程序比较麻烦,因此这里我们采取在 C 语言
阅读全文
摘要:Window 控制硬件时借助的是输入输出指令。其中具有代表性的两个输入输出指令就是IN 和 OUT。这些指令也是汇编语言的助记符IN 指令和 OUT 指令的语法如图 11-2 所示。这是 Pentium 等x86系列 CPU用的IN指令和 OUT 指令的语法。IN 指令通过指定端口号的端口输人数据,
阅读全文
摘要:在用C语言等高级编程语言开发的 Windows 应用中,大家很少能接触到直接控制硬件的指令。这是因为硬件的控制是由 Windows 全权负责的。 不过,Windows 提供了通过应用来间接控制硬件的方法。利用操作系统提供的系统调用功能就可以实现对硬件的控制。在 Windows 中,系统调用称为API
阅读全文
摘要:通过对 C语言源代码和汇编语言源代码进行比较,想必大家对程序是怎样跑起来的”又有了更深的理解。而且,从汇编语言源代码中获得的知识,在某些情况下对查找 bug 的原因也是有帮助的。 让我们来看个示例。代码清单 10-13 是更新全局变量 counter 的值的C语言程序。MyFunc1 函数和MyFu
阅读全文
摘要:下面让我们来看一下条件分支的实现方法。条件分支的实现方法同循环处理的实现方法类似,使用的也是 cmmp 指令和跳转指令,这一点估计大家也预料到了。 没错,条件分支就是利用这些指令来实现的。不过,为了以防万我们来确认一下。代码清单 10-11 是,根据变量 a 的值来调用不同函数(MySubl 函数、
阅读全文
摘要:接下来,让我们继续解析汇编语言的源代码,看一下 for 循环及 if条件分支等 C 语言程序的流程控制是如何实现的 。代码清单 10-8 是将局部变量i作为循环计数器“连续进行 10 次循环的 C 语言源代码。在for 语句中,调用了不做任何处理的 MySub 函数。这里我们把代码清单10-8 转换
阅读全文
摘要:为什么局部变量只能在定义该变量的函数内进行参阅呢?这是因为,局部变量是临时保存在寄存器和栈中的。正如本章前半部分讲的那样,函数内部利用的栈,在函数处理完毕后会恢复到初始状态,因此局部变量的值也就被销毁了,而寄存器也可能会被用于其他目的。因此,局部变量只是在函数处理运行期间临时存储在寄存器和栈上。 在
阅读全文
摘要:熟悉了汇编语言后,接下来将进人到本章的后半部分。C 语言中在函数外部定义的变量称为全局变量,在函数内部定义的变量称为局部变量。全局变量可以参阅源代码的任意部分,而局部变量只能在定义该变量的函数内进行参阅。例如,在 MyFuncA 数内部定义的i这个局部变量就无法通过 MyFuncB 函数进行参阅。与
阅读全文
摘要:接下来,让我们透过执行 AddNum 函数的源代码部分,来看一下参数的接收、返回值的返回等机制(代码清单 10-5)。 ebp 寄存器的值在(1)中人栈,在(5)中出栈。这主要是为了把函数中用到的 ebp 寄存器的内容,恢复到函数调用前的状态。在进入函数处理之前,无法确定 ebp 寄存器用到了什么地
阅读全文