1.06k likes | 1.19k Views
汇编语言程序设计. 吴 向 军. 中山大学计算机科学系. 2003.03.20. 第 1 章 预备知识. 1.1 汇编语言的由来及其特点. 1.1.1 机器语言. 机器指令是 CPU 能直接识别并执行的指令,它的表现形式是二进制编码。 机器指令通常由操作码和操作数两部分组成:. 操作码指出该指令所要完成的操作,即指令的功能; 操作数指出参与运算的对象,以及运算结果所存放的位置等。. 机器指令与 CPU 紧密相关,所以,不同种类的 CPU 所对应的机器指令也就不同。. 第 1 章 预备知识. 1.1.2 汇编语言.
E N D
汇编语言程序设计 吴 向 军 中山大学计算机科学系 2003.03.20
第1章 预备知识 1.1 汇编语言的由来及其特点 1.1.1 机器语言 机器指令是CPU能直接识别并执行的指令,它的表现形式是二进制编码。 机器指令通常由操作码和操作数两部分组成: • 操作码指出该指令所要完成的操作,即指令的功能; • 操作数指出参与运算的对象,以及运算结果所存放的位置等。 机器指令与CPU紧密相关,所以,不同种类的CPU所对应的机器指令也就不同。
第1章 预备知识 1.1.2 汇编语言 用通俗易懂、具有一定含义的符号来代表机器指令,这些符号称为助忆符,用指令助忆符、符号地址等组成的符号指令称为汇编格式指令(或汇编指令)。 汇编语言是汇编指令集、伪指令集和使用它们规则的统称。 伪指令是在程序设计时所需要的一些辅助性说明指令,它不对应具体的机器指令。 用汇编语言编写的程序称为汇编语言程序,或汇编语言源程序,在本教材中简称为源程序。汇编语言程序要比用机器指令编写的程序容易理解和维护。
第1章 预备知识 1.1.3 汇编程序 用汇编语言编写的程序大大提高了程序的可读性,但失去了CPU能直接识别的特性。 把汇编语言编写的源程序翻译成CPU能识别的机器指令序列,我们称该翻译程序为汇编程序。图1.1是翻译程序的翻译过程示意图。 目前,常用的汇编程序有:MASM、TASM和DEBUG等。 图1.1汇编语言指令到机器指令的示意图
第1章 预备知识 1.1.4 汇编语言程序的主要特点 汇编语言程序归纳起来大概有以下几个主要特性。 • 与机器相关性 • 执行的高效率 • 编写程序的复杂性 • 调试的复杂性 • 现在在调试方面有所改善,CV(CodeView)、TD(Turbo Debug)等软件可在源程序级进行符号跟踪。
第1章 预备知识 1.1.5 汇编语言的使用领域 根据应用程序的“可移植性”和“执行效率”来确定是否选用汇编语言。 下面简单列举几个领域以示说明,但不要把它们绝对化。 • 1、适用的领域 • 要求执行效率高、反应快的领域,如:操作系统内核,实时系统等; • 系统性能的瓶颈,或频繁被使用子程序或程序段; • 与硬件资源密切相关的软件开发,如:设备驱动程序等; • 受存储容量限制的应用领域,如:家用电器的计算机控制功能等; • 2、不宜使用的领域 • 大型软件的整体开发; • 没有特殊要求的一般应用系统的开发等。
第1章 预备知识 1.2 数据的表示和类型 用汇编语言进行程序设计时,程序员可以直接访问内存,对数据在存储器内的表示形式要有清晰的认识。有关“数据表示”的详细内容请参阅《计算机组成原理》中的章节。 1.2.1 数值数据的表示 1、二进制 二进制的表示元素是:0和1。书写时,在数据后面紧跟一个字母B。如:0101B、10101B等。 数据的二进制写起来比较长,通常情况下,程序中不直接用二进制来书写具体的数值,而改用八进制、十进制或十六进制。
第1章 预备知识 2、八进制 八进制是一种二进制的变形,三位二进制可变为一位八进制,反之也然。 八进制的表示元素是:0、1、…、7。 书写时,在数据后面紧跟一个字母Q。如:1234Q、7654Q、54Q等。 3、十进制 十进制是我们最熟悉的一种数据表示形式,其基本元素是:0、1、…、9。 书写时,在数据后面紧跟一个字母D。如:1234D、7674D、5411D等。 4、十六进制 十六进制是另一种二进制的变形,四位二进制可变为一位十六进制,反之也然。其基本元素是:0~9、A~F、a~f,其中:A~F依次代表10~15。 书写时,数据后面紧跟一个字母H。当十六进制数的第一个字符是字母时,在其之前必须添加一个‘0’。如:100H、56EFH、0FFH、0ABCDH等。
第1章 预备知识 1.2.2 进制在编程环境中的表示 程序员在用汇编语言进行程序设计时,需要知道当前环境的数据表示符号。 (*)字符Y、O和T是宏汇编MASM系统所增加的进制表示符。
第1章 预备知识 1.2.3 非数值数据的表示 • 1、ASCII码 • 在ASCII码表中,对学习本课程有用的主要信息有: • 字符’0’~’9’是连续编码的,其ASCII码的低4位就是该字符在十进制中的数值; • 小写字母的ASCII码比大写字母的编码大,对应字母的编码之间相差20H。 2、汉字编码 我国在1981年5月对6000多个常用的汉字制定了交换码的国家标准,即:GB2312-80。 该标准给定每个字符的二进制编码,即国标码。
第1章 预备知识 1.2.4 基本的数据类型 1、字节 一个字节有8位二进制组成,其最高位是第7位,最低位是第0位。 通常情况下,存储器按字节编址,读写存储器的最小信息单位就是字节。 2、字 由2个字节组成一个字,其最高位是第15位,最低位是第0位。高8位称为高字节,低8位称为低字节。 3、双字 用2个字(4个字节)来组成一个双字,其高16位称为高字,低16位称为低字。 双字有较大的数据表示范围,它通常是为了满足数据的表示范围而选用的数据类型,也可用于存储远指针。
第1章 预备知识 4、四字 由4个字(8个字节)组成一个四字类型,它总共有64个二进制位,有更大的数据表示范围,但在汇编语言中很少使用该数据类型。 5、十字节 由10个字节组成一个十字节类型,它总共有80个二进制位。在汇编语言中很少使用该数据类型。 6、字符串 字符串是由若干个字节组成的,字节数不定,通常每个字节存储一个字符。该数据形式是汇编语言程序中经常使用的一种数据形式。 汇编语言中没有C语言中的规定:以ASCII码0为字符串的结束符。
第2章 CPU资源和存储器 计算机的硬件资源是用汇编语言编程所必须要了解的重要内容,因为汇编语言允许、也需要程序员直接使用这些硬件资源,只有这样才能编写出高效的目标代码。 2.1 寄存器组 2.1.1 16位寄存器组 • 4个数据寄存器:AX、BX、CX和DX,每个寄存器又可分为2个8位寄存器 • 2个变址寄存器:DI和SI • 2个指针寄存器:SP和BP • 4个段寄存器:ES、CS、SS和DS • 1个标志寄存器:FLAG • 1个指令指针寄存器:IP
第2章 CPU资源和存储器 2.1.2 32位寄存器组 32位CPU把通用寄存器、指令指针和标志寄存器从16位扩充成32位,而且还增加了2个16位的段寄存器:FS和GS。如下图所示。 32位CPU有8个32位的通用寄存器EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP,这些通用寄存器的低16位就是先前CPU中的AX、BX、CX、DX、SI、DI、SP和BP。对其低16位数据的存取,不会影响高16位的数据。
第2章 CPU资源和存储器 2.1.3 通用寄存器的作用 • 1. 数据寄存器 • 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 • 4个32位寄存器:EAX、EBX、ECX和EDX • 4个16位寄存器:AX、BX、CX和DX • 8个8位寄存器:AH和AL、BH和BL、CH和CL、DH和DL • 每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器“能分可合”的特性,灵活地处理双字、字和字节等信息。
第2章 CPU资源和存储器 2. 变址寄存器(Index Register) 寄存器SI和DI称为变址寄存器,它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,且具有特殊的功能。 • 3. 指针寄存器(Pointer Register) • 寄存器BP和SP称为指针寄存器,它们主要用于访问堆栈内的存储单元,并且规定: • BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据 • SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
第2章 CPU资源和存储器 表2.1通用寄存器的主要用途
第2章 CPU资源和存储器 2.1.4 段寄存器的作用 • CS——代码段寄存器(Code Segment Register) • DS——数据段寄存器(Data Segment Register) • SS——堆栈段寄存器(Stack Segment Register) • ES——附加段寄存器(Extra Segment Register) • FS——386CPU增加段寄存器(Extra Segment Register) • GS——386CPU增加段寄存器(Extra Segment Register) 有关寄存器的作用详细描述。
第2章 CPU资源和存储器 2.1.5 专用寄存器的作用 1、指令指针寄存器(Instruction Pointer) 指令指针IP和EIP是16位和32位的寄存器,它们分别位于16位和32位处理器之中。指令指针寄存器存放着下次将要执行的指令在代码段的偏移量。 在80386及其高档处理器处于保护模式时,其指令指针寄存器是32位的EIP。 在实方式下,由于每个段的最大范围就是64K,所以,EIP中的高16位肯定都为0,相当于只用其低16位来反映程序中指令的执行次序,这样,EIP低16位与先前CPU中的IP作用相同。 2、标志寄存器(Flags Register) 有关标志位寄存器的详细描述。
第2章 CPU资源和存储器 2.2 存储器的管理模式 2.2.1 16位微机的内存管理模式 1. 存储器的分段 计算机的内存单元是以“字节”为最小单位进行线性编址的。为了标识每个存储单元,就给每个存储单元规定一个编号,此编号就是该存储单元的物理地址。 16位微机把内存空间划分成若干个逻辑段,每个逻辑段的要求如下: • 逻辑段的起始地址(通常简称为:段地址)必须是16的倍数,即最低4位二进制必须全为0; • 逻辑段的最大容量为64K,这由16位寄存器的寻址空间所决定。 按上述规定,1M内存最多可分成64K个段,即65536个段(段之间相互重叠),至少可分成16个相互不重叠的段。
第2章 CPU资源和存储器 2. 物理地址的形成方式 存储单元的逻辑地址分为两部分:段地址和偏移量。由逻辑地址得到其物理地址(PA—Physical Address)的计算方法如下: 物理地址PA=段地址×16 + 偏移量 计算存储单元物理地址的公式可用“左移4位”和“加”运算来实现。 对物理地址来说,当其段地址变化时,只要对其偏移量进行相应的调整就可得到同一个物理地址,所以,同一个物理地址可有多个逻辑地址。
第2章 CPU资源和存储器 3、段寄存器的引用 段寄存器是因为对内存的分段管理而设置的。一般情况下,段寄存器及其指针寄存器的引用关系方面有如下规定: • 取指令所用的段寄存器和偏移量一定是用CS和IP; • 堆栈操作所用的段寄存器和偏移量一定是SS和SP; • 串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI; • 其它情况,段寄存器除其默认段寄存器外,还可以强行改变为其它段寄存器。
第2章 CPU资源和存储器 表2.3段寄存器及其指针寄存器的引用关系
第2章 CPU资源和存储器 1. 存储单元的内容 存储单元中所存放的二进制信息称为该存储单元的内容或值,并且规定: • 一个字节的内容是该字节单元内存放的二进制信息; • 一个字的内容是该字地址所指向的单元及其后继一个单元的内容拼接而成; • 一个双字的内容是该字地址所指向的单元及其后三个单元的内容拼接而成。 在拼接“字内容”时,我们按“高高低低”的原则来处理,即:高存储单元(地址大的存储单元)的值是“字内容”的高8位,低存储单元(地址小的存储单元)的值是“字内容”的低8位。 在拼接“双字内容”时也是如此。
第2章 CPU资源和存储器 • 下图是一段内存单元存放数据的例子。从图中可看出下列存储结果: • 字节12340H、12341H的内容分别为:12H和34H • 字12340H、12341H的内容分别为:3412H和5634H • 双字12340H、12341H的内容分别为:78563412H和90785634H
第3章 操作数的寻址方式 微机系统有七种基本的寻址方式:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式、相对基址加变址寻址方式等。其中,后五种寻址方式是确定内存单元有效地址的五种不同的计算方法,用它们可方便地实现对数组元素的访问。 另外,在32位微机系统中,为了扩大对存储单元的寻址能力,增加了一种新的寻址方式——32位地址的寻址方式。
第3章 操作数的寻址方式 3.1 立即寻址方式 操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。 立即数可以是8位、16位或32位数,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。例如: MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H 其中:B1、W1和D1分别是字节、字和双字单元。 立即数寻址方式通常用于对通用寄存器或内存单元赋初值。
第3章 操作数的寻址方式 下图是指令“MOV AX, 4576H”的存储形式和执行情况示意图。
第3章 操作数的寻址方式 3.2 寄存器寻址方式 • 指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。 • 指令中可以引用的寄存器及其符号名称如下: • 8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等; • 16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等; • 32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。 • 寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。 • 由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数。 • 通常情况下,我们提倡应尽可能地使用寄存器寻址方式,但也不要绝对化。
第3章 操作数的寻址方式 3.3 直接寻址方式 指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。 通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。
第3章 操作数的寻址方式 例3.1 假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么? 解:根据直接寻址方式的寻址规则,把该指令的具体执行过程如下图所示。
第3章 操作数的寻址方式 3.4 寄存器间接寻址方式 操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。 该寻址方式物理地址的计算方法如下: • 在不使用段超越前缀的情况下,有下列规定: • 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS; • 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
第3章 操作数的寻址方式 例3.2 假设有指令:MOV BX, [DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是什么? 解:根据寄存器间接寻址方式的规则,在执行本例指令时,寄存器DI的值不是操作数,而是操作数的地址。该操作数的物理地址应由DS和DI的值形成,即: PA=(DS)*16+(DI)=1000H*16+2345H=12345H。 该指令的执行效果:把从物理地址为12345H开始的一个字的值传送给BX。
第3章 操作数的寻址方式 3.5 寄存器相对寻址方式 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。 其有效地址的计算公式如下: • 在不使用段超越前缀的情况下,有下列规定: • 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS; • 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
第3章 操作数的寻址方式 例3.3 假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么? 解:根据寄存器相对寻址方式的规则,在本指令中的源操作数的有效地址EA为: EA=(SI)+100H=2345H+100H=2445H 该操作数的物理地址应由DS和EA的值形成,即: PA=(DS)*16+EA=1000H*16+2445H=12445H。 该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。
第3章 操作数的寻址方式 3.6 基址加变址寻址方式 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。 其有效地址的计算公式如下: • 在不使用段超越前缀的情况下,有下列规定: • 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS; • 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
第3章 操作数的寻址方式 例3.4 假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问指令执行后,BX的值是什么? 解:根据基址加变址寻址方式的规则,在本指令的源操作数的有效地址EA为: EA=(BX)+(SI)=2100H+0011H=2111H 该操作数的物理地址应由DS和EA的值形成,即: PA=(DS)*16+EA=1000H*16+2111H=12111H 该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。
第3章 操作数的寻址方式 3.7 相对基址加变址寻址方式 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。 其有效地址的计算公式如下: • 在不使用段超越前缀的情况下,有下列规定: • 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS; • 若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
第3章 操作数的寻址方式 例3.5 假设指令:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)= 2100H,(SI)=0010H,内存单元12310H的内容为1234H。问指令执行后,AX的值是什么? 解:根据相对基址加变址寻址方式的规则,本指令中源操作数的有效地址EA为: EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H 该操作数的物理地址应由DS和EA的值形成,即: PA=(DS)*16+EA=1000H*16+2310H=12310H 该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。
第3章 操作数的寻址方式 相对基址加变址寻址方式有多种等价的书写方式,书写格式: [BX+SI+1000H]、1000H[BX+SI]、1000H[BX][SI]和1000H[SI][BX]等格式都是正确的,并且其寻址含义也是一致的, 但格式:BX[1000H+SI]、SI[1000H+BX]等是错误的,即所用寄存器不能在”[“,”]”之外,该限制对寄存器相对寻址方式的书写也同样起作用。
第3章 操作数的寻址方式 相对基址加变址寻址方式与其它寻址方式之间的变形关系
第3章 操作数的寻址方式 3.8 32位地址的寻址方式 在32位微机系统中,除了支持前面的七种寻址方式外,又提供了一种更灵活、方便,但也更复杂的内存寻址方式。 用16位寄存器来访问存储单元时,只能使用基地址和变址寄存器来作为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。 当用32位地址偏移量进行寻址时,内存地址的偏移量可分为三部分:一个32位基址寄存器,一个可乘1、2、4或8的32位变址寄存器,一个8位/32位的偏移常量,并且这三部分还可进行任意组合,省去其中之一或之二。 基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP; 变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。
第3章 操作数的寻址方式 用32位地址偏移量进行寻址的有效地址计算公式归纳如下: MOV AX, [123456H] MOV EAX, [EBX] MOV EBX, [ECX*2] MOV EBX, [EAX+100H] MOV EDX, [EAX*4+200H] MOV EBX, [EAX+EDX*2] MOV EBX, [EAX+EDX*2+300H] MOV AX, [ESP]
第3章 操作数的寻址方式 由于32位寻址方式能使用所有的通用寄存器,和该有效地址相组合的段寄存器也就有新的规定。具体规定如下: 1、地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器;如:[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器; 2、默认段寄存器的选用取决于基址寄存器; 3、基址寄存器是EBP或ESP时,默认段寄存器是SS,否则,默认段寄存器是DS; 4、在指令中,如果使用段前缀的方式,那么,显式段寄存器优先。
第3章 操作数的寻址方式 下面列举几个32位地址寻址指令及其内存操作数的段寄存器。 MOV AX, [123456H] ;默认段寄存器DS MOV EAX, [EBX+EBP] ;默认段寄存器DS MOV EBX, [EBP+EBX] ;默认段寄存器SS MOV EBX, [EAX+100H] ;默认段寄存器DS MOV EDX, ES:[EAX*4+200H] ;显式段寄存器ES MOV [ESP+EDX*2], AX ;默认段寄存器SS MOV EBX, GS:[EAX+EDX*2+300H] ;显式段寄存器GS MOV AX, [ESP] ;默认段寄存器SS
第4章 标识符和表达式 标识符和表达式是程序设计经常用到的两个基本概念。 4.1 标识符 在汇编语言中,标识符最多由31个字母、数字及规定的特殊字符(?、@、_、$)等组成,但它不能用数字开头。 标号、内存变量名、子程序名和宏名等都是标识符。通常情况下,汇编语言不区分标识符中字母的大小写。 和高级语言的变量名一样,一般要求标识符尽可能取得有点含义,这会有助于对程序的理解。
第4章 标识符和表达式 标识符不能是汇编语言的保留字,汇编语言的保留字主要是指:指令助忆符、伪指令定义符、寄存器名以及一些具有特殊含义的字符串等。 例如:MSG1、ERRMSG2、ASC1、asc2等是合法的标识符,而1a、ah、mov等就不是标识符。 试比较ABCDH和0ABCDH之间的差异。前者是标识符,而后者是十六进制数值。
第4章 标识符和表达式 4.2 简单内存变量的定义 在高级语言程序中,要给存储单元取一个符号名,然后通过引用该符号名来访问其所对应的存储单元。 在汇编语言程序中要灵活一些,它可以给存储单元取符号名,也可以不取符号名。 当给存储单元取符号名时,则可通过该符号名来访问其对应的存储单元; 当不给存储单元取符号名时,则可通过存储单元的偏移量(有效地址)来访问它。
第4章 标识符和表达式 4.2.1 内存变量定义的一般形式 定义内存变量语句是程序中经常使用的伪指令语句,其一般格式如下: [变量名] 数据定义符 表达式1[, 表达式2, …, 表达式n] [;注释] 该定义格式的主要解释如下: • 变量名必须是一个合法的标识符,它可以写,也可以不写; • 数据定义符用于确定内存单元的数据类型,常用定义符有:DB、DW和DD等; • 表达式是定义内存单元时的初值表达式,一个定义语句可以有多个初值表达式,各表达式之间必须用逗号分开;如果某个存储单元没有初值表达式,则必须用一个问号’?’来表示; • 在定义语句的后面可以书写注释内容,也可以不写。
第4章 标识符和表达式 在定义变量时,虽然可以不写变量名,但我们建议还是要写,因为不写变量名,就意味着只能用内存单元的偏移量来访问它。 这时,一旦内存单元的偏移量发生变化,那么程序中所有引用都要修改。这不仅增加了程序维护的工作量,而且也容易因遗漏修改而出错。