02 2023 档案
摘要:在该程序中,猜拳结果被保存在了计算机内部的内存中。而对手的出拳信息也通过2维数组”记录了下来。例如player[0][0]这个数组元素记录的就是对手出石头后再出石头的次数。数组的索引0、1、2分别表示石头、剪刀、布。由于猜拳游戏刚开始时,数据记录还不够充足,因此这里使用了变量counter来记录猜拳
阅读全文
摘要:随机数色子 是用来产生随机数的一种工具,每个色子有20面。晃动随机数色子后,出现在正面的数字就是随机数。由于计算机没法晃动随机数色子,因此程序一般会通过生成类似于随机数的数值公式来得到随机数。在C语言中,虽然该公式的实体是隐藏的,但只要调用rand)函数,就可以得到结果(随机数)。不过,由于借助公式
阅读全文
摘要:C语言是AT&T贝尔实验室的 D.M.Ritchie在1973年推出的程序开发语言。C语言虽是高级编程语言,但它也具备了能够和汇编语言相媲美的低层处理(内存操作及位操作)功能。AT&T贝尔实验室开发的Unix,最初是用汇编语言编写的,但后来大部分都用C语言进行了重写。借助C语言,Unix的移植性得到
阅读全文
摘要:接下来让我们对代码清单12-1的内容进行说明。computer是用来保存计算机出拳数据的变量。石头、剪刀、布分别用数值0、1、2来表示(后面的程序中也是如此)。这里使用随机数来决定是0、1、2中的某一个数值。随机数指的是随机出现的没有规律的数值。在C语言中,rand(函数返回的随机数的范围是0~32
阅读全文
摘要:程序就如同是由计算机执行的各种指令罗列起来的文章。计算机内部的CPU,通过对该文章的内容进行解析和运行,来控制连接到计算机的各种外围设备。具体来说,控制就是指CPU和各种设备之间配合进行数据的输入输出处理。关于程序的运行原理,在前面章节中我们已经从各方面进行了说明。那么,如果此时再问大家“使用程序的
阅读全文
摘要:如果用一句话来简单地概括该机制,那就是显示器中显示的信息一直存储在某内存中。该内存称为VRAM(Video RAM)。在程序中,只要往VRAM中写入数据,该数据就会在显示器中显示出来。实现该功能的程序,是由操作系统或BIOS提供,并借助中断来进行处理的。在MS-DOS时代,对大部分计算机来说,VRA
阅读全文
摘要:在了解I/O输入输出及中断处理的同时,还希望大家记住另外一个机制,这就是DMA(Direct Memory Access)。DMA是指在不通过CPU的情况下,外围设备直接和主内存进行数据传送。磁盘等都用到了这个DMA机制。通过利用DMA,大量数据就可以在短时间内转送到主内存。之所以这么快速,是因为C
阅读全文
摘要:在主程序运行的过程中,中断发生的频率有多大呢?实际上,大部分的外围设备,都会频繁地发出中断请求。其原因就是为了实时处理从外围设备输入的数据。虽然不利用中断也可以从外围设备输入数据。但那种情况下,主程序就必须要持续不断地检测外围设备是否有数据输入。由于外围设备有很多个,因此就有必要按照顺序来调查。按照
阅读全文
摘要:IRQ是用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制。该机制称为中断处理。中断处理在硬件控制中担当着重要角色。因为如果没有中断处理,就有可能出现处理无法顺畅进行的情况。从中断处理开始到请求中断的程序(中断处理程序)运行结束之前,被中断的程序(主程序)的处理是停止的。这种情况就类似于在处
阅读全文
摘要:在AT兼容机中,蜂鸣器的默认端口号是61H(末尾的H,表示的是十六进制数(Hexadecimal)的意思)。用IN指令通过该端口号输入数据,并将数据的低2位设定为ON,然后再通过该端口号用OUT指令输出数据,这时蜂鸣器就会响起来。采用同样的操作方法,将数据的低2位设定为OFF并输出后,蜂鸣器就停止了
阅读全文
摘要:上图是IN指令和OUT指令的语法 上图是数据传递
阅读全文
摘要:在用C语言等高级编程语言开发的Windows应用中,大家很少能接触到直接控制硬件的指令。这是因为硬件的控制是由Windows全权负责的。不过,Windows提供了通过应用来间接控制硬件的方法。 利用操作系统提供的系统调 用功能就可以实现对硬件的控制。在Windows中,系统调用称为API(图11-1
阅读全文
摘要:代码清单10-12中用到了三种跳转指令,分别是比较结果小时跳转的jle (jump on less or equal)、大时跳转的jge (jump on greater orequal)、不管结果怎样都无条件跳转的jmp。在这些跳转指令之前还有用来比较的cmp指令,比较结果被保存在了标志寄存器中。
阅读全文
摘要:接下来,让我们继续解析汇编语言的源代码,看一下for循环及if条件分支等C语言程序的流程控制是如何实现的。代码清单10-8是将局部变量i作为循环计数器 连续进行10次循环的C语言源代码。在for语句中,调用了不做任何处理的MySub函数。这里我们把代码清单10-8转换成汇编语言,然后仅把相当于for
阅读全文
摘要:函数内部利用的栈,在函数处理完毕后会恢复到初始状态,因此局部变量的值也就被销毁了,而寄存器也可能会被用于其他目的。因此,局部变量只是在函数处理运行期间临时存储在寄存器和栈上。在代码清单10-6中定义了10个局部变量。这是为了表示存储局部变量的不仅仅是栈,还有寄存器。为确保cl~c10所需的领域,寄存
阅读全文
摘要:在C语言中,在函数外部定义的变量称为全局变量,在函数内部定义的变量称为局部变量。全局变量可以参阅源代码的任意部分,而局部变量只能在定义该变量的函数内进行参阅。
阅读全文
摘要:接下来,让我们透过执行AddNum函数的源代码部分,来看一下参数的接收、返回值的返回等机制(代码清单10-5)。 ebp寄存器的值在(1)中入栈,在(5)中出栈。这主要是为了把函数中用到的ebp寄存器的内容,恢复到函数调用前的状态。在进入函数处理之前,无法确定ebp寄存器用到了什么地方,但由于函数内
阅读全文
摘要:上面这个图是函数调用的汇编语言代码: (1)、(2)、(7)、(8)的处理适用于C语言中所有的函数,我们会在后面展示AddNum函数处理内容时进行说明。这里希望大家先关注一下(3)~(6)部分,这对了解函数调用的机制至关重要。 (3)和(4)表示的是将传递给AddNum函数的参数通过push入栈。在
阅读全文
摘要:程序运行时,会在内存上申请分配一个称为栈的数据空间。栈(stack)有“干草堆积如山”的意思。就如该名称所表示的那样,数据在存储时是从内存的下层(大的地址编号)逐渐往上层(小的地址编号)累积,读出时则是按照从上往下的顺利进行(图10-3)的。 栈是存储临时数据的区域,它的特点是通过push指令和po
阅读全文
摘要:指令中最常使用的是对寄存器和内存进行数据存储的mov指令。mov指令的两个操作数,分别用来指定数据的存储地和读出源。操作数中可以指定寄存器、常数、标签(附加在地址前),以及用方括号(【】)围起来的这些内容。如果指定了没有用方括号围起来的内容,就表示对该值进行处理;如果指定了用方括号围起来的内容,方括
阅读全文
摘要:在汇编语言中,1行表示对CPU的一个指令。汇编语言指令的语法结构是操作码+操作数(也存在只有操作码没有操作数的指令)。操作码表示的是指令动作,操作数表示的是指令对象。操作码和操作数罗列在一起的语法,就是一个英文的指令文本。操作码是动词,操作数相当于宾语。例如,用汇编语言来分析“Give me mon
阅读全文
摘要:汇编语言的源代码,是由转换成本地代码的指令(后面讲述的操作码)和针对汇编器的伪指令构成的。伪指令负责把程序的构造及汇编的方法指示给汇编器(转换程序)。不过伪指令本身是无法汇编转换成本地代码的。这里我们把代码清单10-2中用到的伪指令部分摘出,如代码清单10-3所示。 由伪指令 segment和end
阅读全文
摘要:除了将本地代码进行反汇编这一方法外,通过其他方式也可以获取汇编语言的源代码。大部分C语言编译器,都可以把利用C语言编写的源代码转换成汇编语言的源代码,而不是本地代码。利用该功能,就可以对C语言的源代码和汇编语言的源代码进行比较研究。笔者在学生时代的报告中,使用的便是该功能。Borland C++中,
阅读全文
摘要:在加法运算的本地代码中加上add(addition的缩写)、在比较运算的本地代码中加上cmp(compare的缩写)等。这些缩写称为助记符,使用助记符的编程语言称为汇编语言。这样,通过查看汇编语言编写的源代码,就可以了解程序的本质了。因为这和查看本地代码的源代码,是同一级别的。不过,即使是用汇编语言
阅读全文
摘要:Windows操作系统的主要特征如下所示:(1)32位操作系统(也有64位版本)(2)通过API函数集来提供系统调用(3)提供采用了图形用户界面的用户界面(4)通过WYSIWYG实现打印输出(5)提供多任务功能(6)提供网络功能及数据库功能(7)通过即插即用实现设备驱动的自动设定这里只列出了对程序员
阅读全文
摘要:通过使用操作系统提供的系统调用,程序员就没必要编写直接控制硬件的程序了。而且,通过使用高级编程语言,有时甚至也无需考虑系统调用的存在。这是因为操作系统和高级编程语言能够使硬件抽象化。这是个非常了不起的处理。下面就让我们来看一下硬件抽象化的具体实例。 代码清单 9-2 是用C 语言编写的往文件中写人字
阅读全文
摘要:操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(systemcall),也就是应用对操作系统(system)的功能进行调用(call)的意思。在前面的程序中用到了 time() 及 printf() 等函数,这些函数内部也都使用了系统调用。
阅读全文
摘要:制作应用的程序员们意识到一点:那就是你们制作的不是硬件,而是利用操作系统功能的应用。 下面就来看一下操作系统是如何给开发人员带来便利的。代码清单9-1 表示的是,在 Windows 操作系统下,用C语言制作一个具有表示当前时间功能的应用。time 是用来取得当前日期和时间的函数printf0) 是用
阅读全文
摘要:操作系统的原型:仅具有加载和运行功能的监控程序。通过事先启动监控程序,程序员就可以根据需要的各种程序加载到内存中运行。如下图: 在利用监控程序编写程序的过程中,发现很多程序都要共通的部分。因此,基本的输入输出部分的程序就被追加到了监控程序中。初期的操作系统就这样诞生了(图 9-2 )。 之后,随着时
阅读全文
摘要:Q:编译器和解释器有什么不同?A:编译器是在运行前对所有源代码进行解释处理的。而解释器则是在运行时对源代码的内容一行一行地进行解释处理的。Q:“分割编译”指的是什么?A:将整个程序分为多个源代码来编写,然后分别进行编译,最后链接成一个EXE文件。这样每个源代码都相对变短,便于程序管理。Q:“Buil
阅读全文
摘要:EXE文件的内容分为再配置信息、变量组和函数组,这一点想必大家都清楚了吧。不过,当程序加载到内存后,除此之外还会额外生成两个组,那就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域(图8-10)。 EXE文
阅读全文
摘要:在程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在EXE文件的开头,追加转换内存地址所需的必要信息。这个信息称为再配置信息。EXE文件的再配置信息,就成为了变量和函数的相对地址。相对地址表示的是相对于基点地址的偏移量,也就是相对距离。实现相对地址,也是需要花费一番心思的。在源代码中,虽然
阅读全文
摘要:Windows以函数的形式为应用提供了各种功能。这些形式的函数称为API (应用程序接口)。例如,Samplel.c中调用的MessageBox0,它并不是C语言的标准函数,而是Windows提供的API的一种。MessageBox()提供了显示消息框的功能。Windows中,API的目标文件,并不
阅读全文
摘要:下图的错误消息表示的是无法解析Sample1.obj参照的外部符号。 外部符号是指其他目标文件中的变量或函数。sprintf及MessageBoxA是目标文件中sprintf及MessageBox()的名称。代码中记述的函数名同目标文件中的函数名有一些差异,不过大家只需把它理解成这是C编译器的规定即
阅读全文
摘要:编译器转换源代码后,就会生成本地文件。不过,本地文件是无法直接运行的。为了得到可以运行的EXE文件,编译之后还需要进行“链接”处理。下面,就让我们使用Borland C++ Compiler5.5(以下称为Borland C++)来看一下编译和链接是如何进行的。Borland C++的编译器是bcc
阅读全文
摘要:能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。 每个编写源代码的编程语言都需要其专用的编译器。将C语言编写的源代码转换成本地代码的编译器称为C编译器。编译器工作是首先读入代码的内容,然后再把源代码转换成本地代码。编译器中就好像有一个源代码同本地代码的对应表。但实际上,仅仅靠对
阅读全文
摘要:用记事本打开由代码清单8-1的内容转换成本地代码得到的EXE文件(Samplel.exe),页面显示情况如下图所示: 据此我们应该可以看出,本地代码的内容是人类无法理解的。也正是因为如此,才有了用人类容易理解的C语言等编程语言来编写源代码,然后再将源代码转换成本地代码这一方法。 接下来,我们把刚才的
阅读全文
摘要:类似于代码清单8-1这样 用某种编程语言编写的程序就称为源代码,保存源代码的文件称为源文件。用C语言编写的源文件的扩展名通常是“.c”,因此,这里我们就把代码清单8-1的文件命名为Sample1.c。 因为源文件是简单的文本文件,所以用Windows自带的记事本等文本编辑器就可以编写。 代码清单8-
阅读全文
摘要:程序的运行环境中,存在着名为BIOS(Basic Input/Output System)的系统。BIOS存储在ROM中,是预先内置在计算机主机内部的程序。BIOS除了键盘、磁盘、显卡等基本控制程序外,还有启动“引导程序”的功能。引导程序是存储在启动驱动器起始区域的小程序。操作系统的启动驱动器一般是
阅读全文
摘要:除虚拟机的方法之外,还有一种方法能够提供不依赖于特定硬件及操作系统的程序运行环境,那就是Java。大家说的Java,有两个层面的意思。一个是作为编程语言的Java,另一个是作为程序运行环境的Java。同其他编程语言相同,Java也是将Java语法记述的源代码编译后运行。不过,编译后生成的并不是特定C
阅读全文
摘要:即使不通过移植,也可以使用别的方法来运行其他操作系统的应用。这里我们要介绍的方法就是利用虚拟机软件。通过利用该虚拟机,我们就可以在Macintosh的Mac操作系统上运行Windows应用了。Virtual PC for MAC 可以使Macintosh这一硬件变得同AT兼容机一样,从而能在该硬件上
阅读全文
摘要:API也称为“系统调用”,是应用调用操作系统功能的手段。Unix系列操作系统FreeBSD中,存在一种名为Ports的机制。该机制能够结合当前运行的硬件环境来编译应用的源代码,进而得到可以运行的本地代码系统。如果目标应用的源代码没有在硬件上的话,Ports就会自动使用 FTP"连接到相关站点来下载代
阅读全文
摘要:接下来让我们看一下操作系统的种类。同样机型的计算机,可安装的操作系统类型也会有多种选择。例如,AT兼容机的情况下,除Windows之外,还可以采用Unix系列的 Linux及 FreeBSD”等多个操作系统。当然,应用软件则必须根据不同的操作系统类型来专门开发。CPU的类型不同,所对应的机器语言也不
阅读全文
摘要:计算机的硬件并不仅仅是由CPU构成的,还包括用于存储程序指令和数据的内存,以及通过1/O连接的键盘、显示器、硬盘、打印机等外围设备。而计算机是如何控制这些外围设备的呢?这和计算机的机型有着很大的关系。Windows操作系统对克服这些硬件构成的差异做出了很大贡献。在20年前的MS-DOS时代,日本国内
阅读全文
摘要:1.应用的运行环境指的是1.操作系统和计算机本身(硬件)的种类2. Macintosh用的操作系统(MacOS),在AT兼容机上无法运行。3. Windows上的应用,在MacOS上无法运行4. FreeBSD提供的Ports,指的是:通过使用源代码来提供应用,并根据运行环境进行整合编译,从而得以在
阅读全文
摘要:最后,让我们来看一下图像文件的数据形式。图像文件的使用目的通常是把图像数据输出到显示器、打印机等设备上。Windows的标准图像数据形式为BMP,是完全未压缩的。由于显示器及打印机输出的bit (点)是可以直接映射(mapping)的,因此便有了BMP=bitmap这一名称。除BMP格式以外,还有其
阅读全文
摘要:使用哈夫曼树后,出现频率越高的数据所占用的数据位数就越少,而且数据的区分也可以很清晰地实现。但哈夫曼算法为什么达到这么好的效果呢,大家都了解吗? 通过图6-5的步骤2可以发现,在用枝条连接数据时,我们是从出现频率较低的数据开始的,这就意味着出现频率越低的数据到达根部的枝条数就越多。而枝条数越多,编码
阅读全文
摘要:刚才已经提到,莫尔斯编码是根据日常文本中各字符的出现频率来决定表示各字符的编码的数据长度的。不过,该编码体系,对AAAAAABBCDDEEEEEF这样的特殊文本并不是最适合的。在莫尔斯编码中,E的数据长度最短,而在AAAAAABBCDDEEEEEF这个文本中,出现最频繁的是字符A。因此,应该给A分配
阅读全文
摘要:压缩技巧实际上有很多种。接下来,我们就来看一下本章要介绍的第二个压缩技巧,即哈夫曼算法。 哈夫曼算法是哈夫曼(D.A.Huffman)于1952年提出来的压缩算法。日本人比较常用的压缩软件LHA(LHA是吉崎荣泰开发的一款免费压缩软件),使用的就是哈夫曼算法。为了更好地理解哈夫曼算法,首先大家要抛弃
阅读全文
摘要:然而,在实际的文本文件中,同样字符多次重复出现的情况并不多见。虽然针对相同数据经常连续出现的图像、文件等,RLE算法可以发挥不错的效果,但它并不适合文本文件的压缩。不过,因为该压缩机制非常简单,因此使用RLE算法的程序也相对更容易编写。 下面这个例子是借助RLE算法对而各种文件进行压缩的结果: 压缩
阅读全文
摘要:数据后,不难看出有不少字符是重复出现的。在字符后面加上重复出现次数,AAAAAABBCDDEEEEEF就可以用A6B2C1D2E5F1来表示。A6B2CID2E5F1是12个字符也就是12字节,因此结果就将原文件压缩了12字节÷17字节=70%。恭喜你,压缩成功了!像这样,把文件内容用“数据×重复次
阅读全文
摘要:1.文件储存的基本单位是什么?1字节(=8位)2.DOC、LZH和TXT这些扩展名中,哪一个是压缩文件的扩展名?LZH3.文件内容用“数据的值×循环次数”来表示的压缩方法是RLE算法还是哈夫曼算法?RLE 算法4.在Windows 计算机经常使用的SHIFT JIS字符编码中,1个半角英数是用几个字
阅读全文