购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.1 机器指令、汇编语言与高级语言

计算机系统只能识别并运行机器指令,对于汇编程序,需要汇编编译器将其编译为若干条机器指令,才能被计算机系统运行。其过程如图4-1所示。

图4-1 汇编编译器执行过程

不同的CPU,其指令集不同,而汇编语言指令是机器指令的一种符号表示,所以,除了同系列、不同型号CPU之间的汇编语言程序有一定程度的可移植性之外,其他不同类型(如小型机和微机等)CPU之间的汇编语言程序是无法移植的。

汇编语言的另一个特点是它所操作的对象不是具体的数据,而是寄存器或者存储器,也就是说它直接与寄存器和存储器打交道,这也是汇编语言的执行速度比其他语言快的原因。但同时这也使编程更加复杂,因为既然数据被存放在寄存器或存储器中,那么必然就存在如何寻址的问题,即用什么方法找到所需要的数据,这就要求汇编程序员了解计算系统的底层结构,增加了编程的复杂性。

相比之下,在高级程序设计语言中,寻址工作由程序编译系统来完成。高级程序设计语言并不是指一种语言,而是包括多种编程语言,比如Java、C、C++、C#、Python等。一般来说,高级语言与计算机的硬件结构和指令系统无关,它有更强的表达能力,可方便地表示数据的运算和程序的控制结构,能更好地描述各种算法,而且容易掌握,同时对于不同的CPU,可以通过相应的高级程序编译器将同一个高级程序语言源代码编译成某一类CPU上能运行的汇编代码或机器指令代码。但用高级语言编译生成的程序代码一般比用汇编程序语言设计的程序代码要长,程序执行的速度也慢。

总的来说,高级程序设计语言提供的抽象级别比较高,大多数时候,在这种抽象级别上工作效率会更高,也更可靠。编译器提供的类型检查能帮助我们发现许多程序错误,并能够保证按照一致的方式来引用和处理数据。通常情况下,现代的优化编译器产生的代码至少与熟练的汇编语言程序员手工编写的代码一样有效。用高级语言编写的程序最大的优点是,可以在很多不同的机器上编译和执行,而汇编代码则是与特定机器密切相关的。

那么为什么我们还要花时间学习机器代码呢?即使编译器承担了产生汇编代码的大部分工作,对于严谨的程序员来说,能够阅读和理解汇编代码也是一项很重要的技能。以适当的命令行选项调用编译器,编译器就会产生一个以汇编代码形式表示的输出文件。通过阅读这些汇编代码,我们能够理解编译器的优化能力,并分析代码中隐含的低效率。我们将在后续章节中体会到,试图最大化一段关键代码的性能的程序员,通常会尝试源代码的各种形式,每次编译并检查产生的汇编代码,从而了解程序的运行效率。此外,有时候,高级语言提供的抽象层会隐藏我们想要了解的有关程序运行时行为的信息,例如,在使用线程包写并发程序时,知道存储器保存不同的程序变量的区域是很重要的,而这些信息在汇编代码级是可见的。再举一个例子,攻击程序(使用蠕虫和病毒侵扰系统)的许多方式中都涉及程序存储运行时控制信息方式的细节,许多攻击利用了系统程序中的漏洞重写信息,从而获得系统的控制权,了解这些漏洞是如何出现的以及如何防御它们,需要具备程序机器级表示的知识。对程序员学习汇编代码的要求随着时间的推移也发生了变化,开始时只要求程序员能直接用汇编语言编写程序,现在则要求他们能够阅读和理解编译器产生的代码。 k3q4P6PYWqqGzlaIMOEcjUf3jBpDZBqtz9br3XkdUJRKoWBoTZ48ahM3Xcg09a4q

点击中间区域
呼出菜单
上一章
目录
下一章
×