随笔分类 - 程序是怎样跑起来的
摘要:程序的使用目的大体可以划分为两类: 一类,是大家作为工具来使用的程序。例如,文字处理器这个程序,大家是将其作为文档处理的工具来使用的。这种情况可以说是程序替代了现有的工具(笔和尺子)。 另外一个使用目的是用程序来代替执行人类的思考过程。例如,微计算机 控制的电饭煲,会根据米和水的份量来自动调整火的大
阅读全文
摘要:如果用一句话来简单地概括该机制,那就是显示器中显示的信息一直存储在某内存中。该内存称为VRAM(Video RAM)。在程序中,只要往VRAM中写入数据,该数据就会在显示器中显示出来。实现该功能的程序,是由操作系统或BIOS提供,并借助中断来进行处理的。 在MS-DOS时代,对大部分计算机来说,VR
阅读全文
摘要:DMA机制是指在不通过CPU的情况下,外围设备直接和主内存进行数据传送。磁盘等都用到了这个DMA机制。通过利用DMA,大量数据就可以在短时间内转送到主内存。之所以这么快速,是因为CPU作为中介的时间被节省了(图11-9)。 资源是计算机具备的有限资源的统称。端口号、IRQ、DMA等可以指定的数值范围
阅读全文
摘要:在主程序运行的过程中,中断发生的频率有多大呢? 实际上,大部分的外围设备,都会频繁地发出中断请求。其原因就是为了实时处理从外围设备输入的数据。虽然不利用中断也可以从外围设备输入数据。但那种情况下,主程序就必须要持续不断地检测外围设备是否有数据输入。 由于外围设备有很多个,因此就有必要按照顺序来调查。
阅读全文
摘要:IRQ是用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制。该机制称为中断处理。如果没有中断处理,就有可能出现处理无法顺畅进行的情况。从中断处理开始到请求中断的程序(中断处理程序)运行结束之前,被中断的程序(主程序)的处理是停止的。这种情况就类似于在处理文档的过程中有电话打进来,电话就相当于
阅读全文
摘要:Windows控制硬件时借助的是输入输出指令。其中具有代表性的两个输入输出指令就是IN和OUT。这些指令也是汇编语言的助记符。 IN指令和OUT指令的语法如图11-2所示。这是Pentium等x86系列CPU用的IN指令的语法。IN指令通过指定端口号的端口输入数据,并将其存储在CPU内部的寄存器中。
阅读全文
摘要:在C语言等高级编程语言开发的Windows应用中,很少有能直接控制硬件的指令。这是因为硬件的控制是由Windows全权负责的。 不过,Windows提供了通过应用来间接控制硬件的方法。利用操作系统提供的系统调用功能就可以实现对硬件的控制。在Windows中,系统调用称为API(图11-1)各API就
阅读全文
摘要:代码清单10-12中用到了三种跳转指令,分别是比较结果小时跳转的jle 、大时跳转的jge 、不管结果怎样都无条件跳转的jmp。在这些跳转指令之前还有用来比较的cmp指令,比较结果被保存在了标志寄存器中。虽然同C语言源代码的处理流程不完全相同,不过处理结果是相同的。此外,需要注意eax寄存器表示的是
阅读全文
摘要:接下来,让我们继续解析汇编语言的源代码,看一下for循环及if条件分支等C语言程序的流程控制是如何实现的。代码清单10-8是将局部变量i作为循环计数器 连续进行10次循环的C语言源代码。在for语句中,调用了不做任何处理的MySub函数。这里我们把代码清单10-8转换成汇编语言,然后仅把相当于for
阅读全文
摘要:在代码清单10-6中定义了10个局部变量。这是为了表示存储局部变量的不仅仅是栈,还是寄存器。为了确保c1~c10所需的领域,寄存器空闲时就使用寄存器,寄存器空间不足就使用栈。 x86 系列 CPU拥有的寄存器中,程序可以操作的有十几个。其中空闲的,最多也只有几个。因而,局部变量数目很多的时候,可分配
阅读全文
摘要:在C语言中,在函数外部定义的变量称为全局变量,在函数内部定义的变量称为局部变量。全局变量可以参阅源代码的任意部分,而局部变量只能在定义该变量的函数内进行参阅。
阅读全文
摘要:通过执行AddNum函数的源代码部分,来看一下参数的接收、返回值的返回等机制(代码清单10-5)。 ebp寄存器的值在(1)中入栈,在(5)中出栈。这主要是为了把函数中用到的ebp寄存器的内容,恢复到函数调用前的状态。在进入函数处理之前,无法确定ebp寄存器用到了什么地方,但由于函数内部也会用到eb
阅读全文
摘要:代码清单 10-1 中列出的C语言源代码中,有一个处理是在变量c中存储 AddNum 函数的返回值,不过在汇编语言的源代码中,并没有与此对应的处理。这是因为编译器有最优化功能。最优化功能是编译器在本地代码上费尽功夫实现的,其目的是让编译后的程序运行速度更快、文件更小。在代码清单 10-1 中,由于存
阅读全文
摘要:程序运行时,会在内存上申请分配一个称为栈的数据空间。栈有“干草堆积如山”的意思。即数据在存储时是从内存的下层(大的地址编号)逐渐往上层(小的地址编号)累积,读出时则是按照从上往下的顺利进行(图10-3)的。 栈是存储临时数据的区域,它的特点是通过push指令和pop指令进行数据的存储和读出。往栈中存
阅读全文
摘要:指令中最常使用的是对寄存器和内存进行数据存储的mov指令。 mov指令的两个操作数,分别用来指定数据的存储地和读出源。操作数中可以指定寄存器、常数、标签(附加在地址前),以及用方括号(【】)围起来的这些内容。如果指定了没有用方括号围起来的内容,就表示对该值进行处理;如果指定了用方括号围起来的内容,方
阅读全文
摘要:在汇编语言中,1行表示对CPU的一个指令。汇编语言指令的语法结构是操作码+操作数(或只有操作码没有操作数的指令)。 能够使用任何形式的操作码,是由CPU的种类决定的。 本地代码加载到内存才能运行。 寄存器是CPU中的存储区域,寄存器具有存储指令和数据的功能,也有运算功能。
阅读全文
摘要:汇编语言的源代码,是由转换成本地代码的指令(即操作码)和针对汇编器的伪指令构成的。伪指令负责把程序的构造及汇编的方法指示给汇编器(转换程序)。伪指令本身是无法汇编转换成本地代码的。这里我们把代码清单10-2中用到的伪指令部分摘出,如代码清单10-3所示。 由伪指令 segment和ends围起来的部
阅读全文
摘要:除了将本地代码进行反汇编这一方法外,通过其他方式也可以获取汇编语言的源代码。 大部分C语言编译器,都可以把利用C语言编写的源代码转换成汇编语言的源代码,而不是本地代码。利用该功能,就可以对C语言的源代码和汇编语言的源代码进行比较研究。笔者在学生时代的报告中,使用的便是该功能。Borland C++中
阅读全文
摘要:在加法运算的本地代码中加上add(addition的缩写)、在比较运算的本地代码中加上cmp(compare的缩写)等。这些缩写称为助记符,使用助记符的编程语言称为汇编语言。通过查看汇编语言编写的源代码和查看本地代码的源代码,是同一级别的。用汇编语言编写的源代码,最终也必须要转换成本地代码才能运行。
阅读全文
摘要:通过使用操作系统提供的系统调用,程序员就没必要编写直接控制硬件的程序了。 通过使用高级编程语言,有时甚至也无需考虑系统调用的存在。这是因为操作系统和高级编程语言能够使硬件抽象化。硬件抽象化的具体实例。代码清单 9-2 是用C 语言编写的往文件中写人字符串的应用。fopen()是用来打开文件的函数,f
阅读全文
浙公网安备 33010602011771号