《汇编程序设计与计算机体系结构:软件工程师教程》 —3.2 基本元素
3.2 基本元素
与高级语言不同,汇编语言是一种底层语言,它的每一行代码只执行一项操作。要想写出汇编代码,必须了解与计算机体系结构有关的一些细节,例如 CPU 寄存器、标志位,以及浮点运算功能等。对于编程新手来说,通过这些底层细节编写汇编代码显得相当枯燥,而且即便是有经验的程序员有时也会产生这种感觉。不过,掌握底层细节能够令开发者写出控制能力更强、效率更高的代码,这种优势是高级语言所无法比拟的。等到熟练掌握了汇编语言,你可能就会发现自己能够写出设计上更加合理的高级语言代码。
3.2.1 汇编代码的五大支柱
学习汇编语言必须了解它的五大支柱,也就是:保留字(reserved word)、标识符(identifier)、命令(directive,也称为指示或伪操作)、区段(section 或 segment,简称段)以及指令(instruction)。本章后面的各节以及后续各章都要求你必须先清楚地理解这五个要素。现在,我们就通过一个简单的汇编程序帮助大家认清这5个概念。程序 3-1 首先定义一个 32 位的变量,然后将两个数字相加,最后把运算结果保存到该变量中。
程序 3-1 汇编语言范例代码
很多编程语言里都有保留字,它是一种具备特定用途的字词。例如 MOV 就是个保留字,它代表一条特定的指令,即 MOV 指令。你不能把它当成变量名来用,也不能做其他用途。汇编语言的保留字不区分大小写。指令(例如 MOV)、命令(例如 PROC)、寄存器(例如 eax)、属性(例如可以当作 .MODEL 命令参数值的 FLAT)等,都是保留字。
表 3-2 用粗体标出了代码中的保留字。你会发现程序中有很多地方都用到了保留字。其中有一些地方是指令,还有一些则是命令或代码段。
表3-2 范例代码中的保留字
标识符是由程序员所定义的名称,用来表示变量、常量及过程等事物,它最多可以包含 247 个字符。第一个字符不能是数字,且必须从英文字母(大写的 A 至 Z及小写的 a 至 z)、下划线(_)、问号(?)、at 符号(@)及美元符号($)这五种中选择(笔者不建议你选后三种),其后的字符则可以使用数字。笔者推荐你采用下面这几种写法来给标识符起名。
userInputValue
sum_of_values
weight1
表 3-3 用粗体标出了范例代码中的标识符。
表 3-3 范例代码中的标识符
命令是与指令集无关的一些操作,可以指挥汇编器去做某件事,例如定义变量、指明内存段等。比方说,下面这行代码里的 DWORD 就是个命令,它告诉汇编器要在内存里保留 32 个二进制位,或者说保留一个双字(doubleword)。整行代码的意思是:用 42 这个值来初始化一个双字,并将其所在的这块内存起名叫作 answer,以供后续使用。
表 3-4 用粗体标出了范例代码中的命令。
表 3-4 范例代码中的命令
现在我们需要指出 MASM 所用的命令与另外两个汇编器之间的区别。你可能已经发现了:MASM 版本的程序在数据段之前多写了几行代码,这是另外两个版本所没有的。对于 32 位程序来说,这几行代码是必须编写的,因为它们会对程序环境做出必要的设置。表 3-5 列出了 MASM 版本特有的命令并加以解释。
表 3-5 用 MASM 汇编器撰写 32 位程序时专用的命令
用 MASM 编写 64 位程序的时候不需要使用表 3-5 中的命令,因此代码与 GAS 及 NASM 版本的代码一样,直接以数据段开头。
程序段(program section 或 program segment)是用相关命令所标出的特殊段落。汇编器预先定义了几种这样的段落。表 3-6 列出了撰写汇编代码时常用的几种程序段。
表 3-6 各种汇编器所支持的程序段
表3-7用粗体标出了范例代码中与程序段有关的命令。
表 3-7 范例代码中与程序段有关的命令
后面有一节会讲到如何定义数据,那个时候再来详细解释这些程序段的用法以及它们所含的信息。
指令是程序中的可执行语句,我们将在第 4 章开始详细讲解,这里先简单地介绍一下。指令由两个基本部分组成,其语法如下:
其中mnemonic(助记符)是指令的名称,开发者用它来指代某个架构所支持的一套指令集里的一条指令。助记符通常是个缩写形式或首字母缩略形式的词,实际上也可以认为是数字形式的操作码所对应的英语写法(参见第 1 章的范例 1-2)。表 3-8 用粗体标出了范例程序中的指令。
表 3-8 范例程序中的指令
有些指令不需要操作数,有些则需要一个、两个或三个操作数。下面这四行代码分别演示了这四种情况。
学习指南:现在你应该参照附录 B 与附录 D搭建一套能够正常运作的编程环境。请在该环境中编写、执行并调试本章的范例程序 3-1,以便初步了解汇编程序的开发过程。在继续往下读之前,首先要保证这个范例程序能够在你的电脑上正常编译并运行,而且你要学会通过断点来暂停程序并逐行地调试该程序,以观察寄存器中的值是怎样在执行过程中发生变化的。做到了这一点之后,你就可以继续往下读了,阅读过程中,你可以根据学到的新知识来修改范例程序,使自己更好地理解这些概念。
- 点赞
- 收藏
- 关注作者
评论(0)