第一章基本概念
1.1 简单介绍
本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语言程序设计,可以使用Intel或AMD的32位/64位处理器运行本所有例子。
汇编语言是有所程序设计语言中最古老的语言,它与计算机的机器语言最为接近,通过汇编语言可以直接访问计算机的硬件,所以要求读者深入了解计算机体系结构和操作系统的大量细节。
1.1.1 一些精彩的提问
(没用的地方我都直接简化或者删除了啊!)
需要具备什么背景知识?
至少要学完一门程序设计的入门语言。
什么是汇编器和链接器?
汇编器是把汇编语言源程序转换为机器语言的实用工具程序。链接器是吧编译器创建的多个单独的文件组合连接成可执行的应用程序的实用工具。另外一个工具称为调试器、允许在程序运行时单步执行并查看寄存器和内存的内容。
需要什么硬件和软件?
需要一台装配有Intel386,Intel486,Pentium或IA-32兼容处理器的计算机。例如使用AMD系列处理器完全完全能够正常工作。MASM兼容从Windows95开始的所有32位版本的WIndows操作系统。一些与直接硬件访问和磁盘扇区编程相关的程序必须在DOS,WIndows95/98/Me下运行,这是由于Windows NT/2000/XP有严格的安全限制。
能创建什么类型地址模式程序?
16位实地址模式程序:16位实地址模式程序可以在MS-DOS或MS-Windows的控制台窗口下运行。实地址模式程序也称为实模式程序,使用Intel8086/8088处理器要求的分段内存模式。
32位保护模式程序:32位保护模式程序可运行所有32位版本的Windows操作系统上,通常比实模式程序更加易于编写,易于理解。
为了更好的理解上面两个模式,我又查了一些资料,发现其中一个说的比较详细(http://blog.csdn.net/heiworld/article/details/24371677)。
通过本书能学到些什么?
1.计算机体系结构(也适用于Intel IA-32系列处理器)的基本原理。
2.一些基本的布尔逻辑概念以及它是如何用于程序设计和计算机硬件的。
3.IA-32处理器如何管理内存,如何使用实模式、保护模式和虚拟模式。
4.高级语言编译器(如C++)是如何将源代码语句翻译成汇编语言和机器语言的。
5.高级语言是如何在机器语言层次实现算是表达式。循环和逻辑结构的。
6.数据的表示方法,包括有符号和无符号整数、实数以及字符数据。
7.如何在机器语言层次调试程序。对于C/C++这样的能够访问低层数据和硬件的语言来说,这种调试能力尤为重要。
8.应用程序是如何通过终端服务程序、系统调用和共享内存区域才做系统进行交互的。
9.汇编语言代码与C++程序之间的接口。
10.穿件汇编语言应用程序。
汇编语言与机器语言有什么关系?
机器语言是一种数字语言,只有计算机的处理器(CPU)才能理解它。IA-32兼容处理器能够理解一种通用的机器语言。汇编语言由使用短助记符的语句构成,如ADD,MOV,SUB和CALL等。汇编语言通机器语言之间是一一对应的关系:一条汇编执行对应一条机器语言指令。
C++和Java等语言与汇编语言有什么关系?
一对多的关系,下面是我用vs2012反汇编的几句代码:
bool bBool = true;
013313BE mov byte ptr [bBool],1
把1这个值直接放到指针指向位置
char cByte = 2;
013313C2 mov byte ptr [cByte],2
同上
double fDouble = 3.0; double的比较特别,之后会解释
013313C6 movsd xmm0,mmword ptr ds:[1335858h]
013313CE movsd mmword ptr [fDouble],xmm0
int nY = 3;
同上
013313D3 mov dword ptr [nY],3
int nX = (4 + nY) * 3;
013313DA mov eax,dword ptr [nY] 先把Y放寄存器里
013313DD add eax,4 寄存器值加4
013313E0 imul eax,eax,3 寄存器的值=寄存器的值乘3
013313E3 mov dword ptr [nX],eax 把当前寄存器值拷贝到X中
汇编语言是可移植的吗?
并不能,因为汇编语言总是为特定系列的处理器设计的。
为什么要学习汇编语言?(我的目的是为了了解汇编,然后去方便学习别的东西,而并不是作者所说的那样详细,下面是作者的想法)
1.适合编写嵌入式程序。
2.一些实时应用(如仿真和硬件监控)要去精确计量时间并实时响应。高级语言不允许程序员完全通知编译器生成的机器码,不过汇编语言允许程序员控制程序几乎每个字节。
3.许多专用硬件设备,有各种各样的限制。
4.汇编语言有助于对计算机硬件、操作系统、应用程序之间交互的整体理解。使用汇编语言,可以随时应用和校验计算机体系结构和操作系统课上学习的知识和理论。
5.应用程序员有时会发现高级语言中的种种限制会阻碍位操作和数据加密等底层操作的有效实现,他们一般会调用汇编语言编写此过程。
6.各种驱动。
1.1.2 汇编语言应用程序
前面说了一些,没啥用直接省略了。
C++中也可以使用汇编,这就是在使用高级结构和访问低层细节之间提供了一种折中的方案,用户可以使用汇编语言直接访问硬件,但这将是程序完全丧失可移植性。大多数C++编译器都具有生成汇编语言源代码的能力,程序员对生成汇编语言代码进行精炼、优化后再便以为可执行文件。
1.2 虚拟机的概念
虚拟机的概念是说明计算机软硬件之间相互关系的最佳途径之一。计算机能够执行机器语言书写的程序,这种语言的每条指令都简单到能用相对较少的电路单元即可执行。为简化期间。我们称这种语言为L0。
程序员使用L0语言编程非常困难,因为需要考虑非常低层、非常细微的地方,并且L0由纯粹的数字构成,如果能构造一种更加易用的新语言L1的话,那么程序可以用L1来编写了,有两种方法可以达到该目的的。
解释方法:当执行用L1语言编写的程序时,使用以L0语言编写的解释程序对L1程序的每条指令解码并执行,这样L1程序马上可以执行,但是每条指令在执行之前都必须解码。
翻译方式:用特别设计编写的L0程序将整个L1源程序翻译成L0程序,生成的L0程序就可以直接在计算机硬件上执行了。(上面两种方式让我想起两个JavaScript引擎,JavaScriptCore和V8,早期的JavaScriptCore就是采取解释方法,效率比较低,而V8自从诞生就是为了效率,直接编译成本地代码,而且跳过了字节码的阶段。)
每台虚拟机都可由硬件或软件构成。人们可以为虚拟机VM1编写程序,如果虚拟机VM1能够实现为真实的计算机硬件,程序就可以直接在硬件上执行了。除此之外,为MV1编写的程序也可以通过监视或翻译的方法在虚拟机VM0上执行。
机器VM0和VM1不应该有根本的不同,否则翻译和监视过程将过于耗时。如果VM1支持的语言对编写应用程序的程序员不够友好怎么办?继续抽象,设计虚拟机知道VMn,它支持的语言功能强大并且易于使用。
程序设计语言Java就是基于虚拟机概念的,Java语言编写的程序由Java编译器翻译成Java字节码,后者是一种低层语言,可以由Java虚拟机(JVM)来快速执行。由于在许多不同的计算机系统上都时间了JVM,使得Java程序相对而言是与系统无关的。
具体实现:
数字逻辑(第0层):计算机的数字逻辑硬件用虚拟机的第0层表示。
微结构(第一层):计算机芯片制造商通常不允许普通用户编写微指令,特殊的微结构指令通常是厂商秘密。像从内存中取数字并且加1这样的基本操作可能需要3-4条维指令。
指令集体系结构(第2层):计算机芯片制造商设计了一套国华在未处理器内部的指令集,用于执行如移动、加法和乘法等基本操作,这套指令集称为常规机器语言,或简称为机器语言。每条机器语言指令将分解成几条伪指令执行。
操作系统(第3层):随着计算机的发展,人们设计了其他能够是程序员更加高产的虚拟机。第3层的虚拟机能够理解用户发出的注入加载执行程序、显示目录之类的交互命令,这就是众所周知的计算机操作系统。操作系统软件被翻译成机器码在第2层上运行。(操作系统的源码有C或汇编语言写成,一旦编译之后,操作系统实际上不过是一个能够解释第3层命令的第2层程序。)
汇编语言(第4层):在操作系统层次之上的程序设计语言提供了能够实际用来开发大型软件的翻译层。汇编语言属于第4层,它使用ADD,SUB和MOV等很容易翻译到指令集体系结构层(第2层)的短助记符,其他一些汇编语句(如中断调用),则由操作系统(第3层)直接执行汇编语言程序在执行前一般要全部翻译(汇编)成机器语言。
高级语言(第5层):第5层是诸如C++,C#,VB和Java之类的高级语言,这些语言有功能强大的语句,每条语句通常被翻译成4层的多条指令。在内部,编译器把第5层的程序翻译成第4层的程序代码,后者由编译器会变成机器语言。
最后有一个章总结,因为没有需要删减和简化的地方,直接粘贴过来吧。