20-PLM程序设计.doc_第1页
20-PLM程序设计.doc_第2页
20-PLM程序设计.doc_第3页
20-PLM程序设计.doc_第4页
20-PLM程序设计.doc_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 PL/M程序设计基础PL/M-51的程序书写格式相当灵活,其说明语句写在输入行的位置不受限制,而且程序元素之间可以随意插入空格。11 PL/M字符集PL/M中用到的字符集,是ASCII字符集的一个子集,包括如下几个字符形式:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789以及专用字符:=./()+-*:;$等,此外,还有空格符、制表符、回车符和换行符。这里提出的规则,适用于除了字符串常量和注解以外的PL/M51程序的每个环节。如果在PL/M51程序中包含了任何不在以上字符集中出现的字符,则编译程序就把它按出错处理。大写字母和小写字母,除了在字符串常量中外,程序中的书写形式一般没有什么区别,如xyz和XYZ可以交换。此外,空格的多少,除在字符串常量中外,也没有区别,编译程序把连续的空格符视为一个空格对待。专用字符以及它们的组合,在一个PL/M程序中有特定的含义。专用字符及其组合列入表中。 专 用 字 符 及 其 组 合 表符 号 名 称 用 途=等号(1)赋值运算符;(2)关系运算符.点号(1)结构成员限制符;(2)取地址符/除号除法运算符/*说明符注解开始分界符*/说明符注解结束分界符(左括号列、行以及一些表达式的在端分界符)右括号列、行以及一些表达式的右端分界符+加号加法运算或一元数的正号符-减号减法运算或一元数的负号符单引号串界符*星号乘法运算符,隐含维数指定符大于号关系运算符=大于等于号关系运算符不等于号关系运算符:冒号标号界符;分号语句分界符,逗号列表元素分界符_下横线标识符中的有效字符$美元号标识符中的无效字符12 标识符和保留字标识符用于命名变量、过程、符号常量和语句标号,最大长度是31个字符。第一个字符必须是字母,其余字符可以是字母、数字或下划符(_)和美元符($)。随意加入的美元符($),是完全被编译程序忽略的,以提高一标识符或一个常量(不过$不能是第一个字符)的可读性。一个包括美元符号($)的标识符或常量,完全等价于除去美元符$的同一标识符。下面是有效标识符的一些例子:INPUT_COUNTXGAMMLONGIDENTIFIERNUMBER3LONG$IDENIFIER$NUMBER$3INPUT$COUNTINPUTCOUNT可见,两个长标识符是相同的(对编译程序而言),最下面两行标识符也是等价的,但不同于第一行标识符。保留字不能用作标识符,因为它们实际上是PL/M51语言的组成部分。以下是PL/M51的保留字,它们不能用作标识符。ADDRESSINDIRECTLY_CALLABLEANDINTERRUPTATLABLEAUXILARYLITERALLYBASEDMAINBITMINUSBYMODBYTENOTCALLORCASEPLUSCONSTANTPROCEDUREDECLAREPUBLICDISABLEREGISTERDORETURNELSESTRUCTUREENABLETHENENDTOEXTERNALUSINGGOWHILEGOTOWORDIDATAXORIFPL/M51也有一组预定义标识符,用以命名内部过程,可以根据给出的目的来说明这些标识符。但一经说明,则具有相同名字的内部过程就不能再用了。下面是内部过程预说明的标识符,若这些标识符之一在DECLARE语句中作了说明,则在这个说明的作用域内相应的内部过程,就变成没有用的标识符。BOOLEANROLDECRORDOUBLESCLEXPANDSCRHIGHSHLLASTSHRLENGTHSIZELOWTESTCLEARPROPAGETETIME13 标记、分隔符和空格的使用正如英文句子是由单词组成的一样,PL/M语句也是由标记组成的。每个有下列诸类:1 标识符2 保留字3 简单分界符。除下划线(_)和美元符($)外,所有专用字符都是简单分界符。4 复合分界符两个专用字符的组合。包括:、=、/*、*/。5 数值常量。6 字符串常量。显然,在大多数情况下,一个符号结束时,下一个符号紧接着出现,例如下面赋值语句中:EXACT=APPROX*(OFFSET-3)/SCALE;EXCAT,APPROX,OFFSET和SCALE是标识符,3是一数值常量,其它所有字符都是简单分界符。有时在两标识符、保留字或数值常量之间并不出现简单或复合分界符。例如:DECLAREABYTE在这种情况下,必须插入空格作为分隔符,即DECLARE A BYTE(连续多个空格可以代替单个空格使用)。同样,注解语句也可当作分隔符使用。空格也可以随意插入到标记的两侧,并不改变PL/M1语句的意义。因此,下面的赋值语句:EXACT = APPROX * (OFFSET-3) / SCALE;等价于:EXACT=APPROX*(OFFSET-3)/SCALE;14 常量常量是在程序执行时不能变化的值。这里对数值常量和字符常量予以简单说明。数值常量 数值常量可以用二进制、八进制、十进制或十六进制数表示,编译程序分别通过后缀B、O(或Q)、D或H来识别它们。不加后缀的数值,通常认为是十进制数。如果一个常量含有在已指定了的数据基下无效的字符,则它被认为不合法(错误)而标识出来。最大的数值字常量是:1111$1111$1111$1111B=177777Q=65535D=0FFFFH十六进制数的第一个字符必须是一个自然数,以避免与标识符混淆。如用十六进制表示163,必须写成品0AH,而不写成A3H,否则会被误码认为标识符。有效数值常量的例子列举如下:12AH 2 33Q 1010B 55D 0BF3H 65535 777O 3EACH;无效的数值常量举例如下:l 12A十六进制数字,但没有后缀,因此按无效的十进制数解释。l 12AD最后的D可以是一个后缀,但是A不是十进制数字,如果是十六进制数,则最后应加一后缀。l 1102B2不是一个有效的二进制数字。l 2ADGHG不是一个有效的十六进制数字。一个数值常量可以是一位值、一个字节或者一个字值,这取决于其大小和前后关系。字符串常量 由单引号括起来的可打印ASCII字符即构成字符串。一个字符串中含有引号时,按双引号书写,如串Q由两个字符组成,一个引号再跟一个Q。字符串中允许加空格,编译程序在存贮器中是以ASCII码表征字符串;七位的字符码可以通过高位补零转换成八位的字节;长度为1的串译成一个字节的值,长度为2的串译成双字节的值。参见下面的例子:A等价于41HAG等价于4147H字符串只能作字节或字型值。由于多于2个字符的字符串将超出一个字(16位)值所能表征的能限,因此,较长字符串作常量时必须以字节串的形式存贮,方可在PL/M程序中使用。字符串常量的最大长度是254字符,串常量可以用来予置初值常量或作为地址分配的一部分,来指出串常量的存贮位置。15 注解说明性的注解可与PL/M程序正交叉书写,以提高程序的可读性,并提供程序的文本。PL/M-51的注解是一个字符序列,左边由字符对/*分界开始,右边由字符对*/分界结束。这两个分界符表明编译程序在其之间的任何信息不参与编译,不把这部分信息视作程序的一部分。注解可以包含任何打印的ASCII字符,也可以包括空格、回车、换行和制表符。注解不能嵌于一个字符串常量中,否则它将被理解为串常量的一部分,而使编译程序不能识别。除此之外,凡空格符能出现的地方就可用注解,即除了标记内的任何地方。因此,注解可以分布在整个PL/M程序中。这里,给出PL/M注解的一个简单例子:/* This procedure copies one structure to another. */在本书中,注解使用小写字母,以利于与由大写字母表示的程序代码相区别。2 类型与说明符号名的说明定义有五种类型,即:变量、常量、文字常量(串)、标号和过程。用在程序块中的每个符号名只能进行唯一的说明,该说明可出现在程序块的开始或者在外层程序块中。同一程序块中对同名进行多次说明是无效的。变量、常量、文字常量和过程,必须在说明和定义后才能用在可执行语句中,标号可以通过其后跟一冒号隐含地得到说明。过程是由PROCEDURE过程说明语句和过程结束语句END之间的语句组定义的。除以上各项的名字外,说明语句还可以描述其类型、属性和位置。21 变量说明语句DECLARE语句是一种非执行语句,它引入了一些对象或对象的集合,给它们命名(有时赋值),需要时还可为它们分配存贮。DECLARE最重要的作用是说明定义变量。变量可以是标量(即单一的量)、数组或结构。变量有更通用的一层含义,即变量可以是一个标量变量,或是可以用一个标识符引用的标量表(数组)。标量变量是一单独的说明对象,其值在编译时不一定必须知道,它在程序执行过程中可以变化,因而在引用时要在程序中说明。它所使用的名字:标识符。在数组中,所有的标量都用同一标识符命名,彼此之间的区别在于下标不同,如A(0)、A(1)、A(123)等等。结构(类型)是标量或数组构成的表,它们使用同一主标识符,相互间可以由其自身的元素标识符字段加以区别。例如,EMPLOYEES.NAME所指的是结构EMPLOYEES中的NAME字段。这种类型的变量(数组和结构)将在第四章中详细阐述。22 类型标量总是具有字节(BYTE)、字(WORD)或位(BIT)等几种类型。字节型标量是占内存一字节的8位二进制数;字节标量的值是一无符号数,其值的范围为0-255,字型标量占用内存连续两字节的16位二进制数,其最低有效8位存放在第一字节(低地址);字型标量的值是无符号数,其值范围是065535,与其它PL/M-51编译程序兼容,保留字ADDRESS可以与WORD同义地使用。位型标量只含0(FALSE)或1(TRUE)两种取值。它必须放在片内RAM的32到47中的位可寻址单元或在可位寻址存贮映射的硬件寄存器中。因此,位型量只能有片内RAM(MAIN)或寄存器(REGISTER)后缀。位型量(BIT)具有如下几个方面重要限制:1 不能有下标,也就是说位型数组是不存在的。2 不能是基变量(BASED)。3 在片内RAM(MAIN)中的位型量不具有AT属性,但映射到硬件寄存器中的位型量必须是AT确切指出的寄存器地址。4 位可以是结构中的成员。然而,一个含有BIT成员的结构不可含有非位型成员,它即不可以是一数组元素,又不可以是基址变量(如果它具有一个专用功能的位寄存器可以是AT)。注意:字节可以覆盖位型结构,以允许BYTE语句对存贮单元的访问。例如:DECLARE S1 STRUCTURE(B0,B1,B3,B3,B4,B5,B6,B7)BIT);DECLARE S1_OVER BYTE AT(S1);5. 最大允许64位。对BIT型量的这些限制,不是人为给定的,它们取决于MSC-51体系结构,而使用ASM-51,则不存在以上的限制。数据类型的概念,不仅用于变量,而且也适用于PL/M51程序处理的每一个值,这包括过程调用返回的值和处理表达式计算得出的值。使用不同类型的算术表达式和其它表达式将在第三章阐述。下面是几个说明标量的语句举例:DECLARE APPROXWORD;DECLARE (OLD,NEW)BIT;DECLARE POINTWORD,VAL12BYTE;第一行语句说明其标识符为APPROX字型的单个变量,第二行语句说明了两个标量OLD和NEW均为位型标量。这种语句称为“因子式说明”语句,它等价于下述序列:DECLARE OLDBITDECLARE NEWBIT只有因子式说明才能保证这两个位型标量在内存中的分配是相邻的。第三行语句说明了不同类型的两个标量: POINT是字型标量,而VAL12是字节型标量。下面语句对数组进行说明:DECLARE DOMAIN(12)BYTEAUXILIARY;DECLAREGOMMA(19)WORD;第一个语句说明了在片外RAM中数组DOMAIN(AUXILIARY在本节后面的讨论中加以说明),它的12个标量元素都是字节型,由0至11作DOMAIN名的下标来区别,例如DOMAIN的第三个元素可用DOMAIN(2)表示,每个数组的第一个元素下标都是0。第二个语句说明了数组GAMMA,它具有19个字型标量元素,其数组的下标为0到18。下面语句说明了具有两个标量成员的结构:DECLARE RECORDSTRUCTURE(KEY BYTE,INFO WORD);两个成员分别是字节型(可由RECORD.KEY引用)和字型(由RECORD.INFO)引用。这个字型变量是该结构的第二和第三个字节。结构和数组在第四章还要做进一步讨论。结果一个有效的变量说明产生两个结果:(1)按名给予每个变量存贮分配。(2)认为具有预说明了的属性。在程序中使用该变量时,相当于映射同一地址(基址除外)。这也要求所有对变量的引用应遵循当前属性的规则,即在当前程序块中具有优先权的那些属性。这样的原则,使编译程序指出(在该程序块级)各种说明与使用的不一致的错误,也就是不相容的错误。23 地址空间和后缀8051的存贮器有4个存贮空间:程序存贮器(CONSTANT)、片内数据RAM(MAIN或IDATA)、特殊功能寄存器(REGISTER)和片外数据存贮器(AUXILIARY)。了解并掌握存贮器的结构,就具备了进一步研究MCS-51系列单片机的入门条件。因为MCS-51系列的每种单片机都围绕着存贮器的特点进行的,包括由REGISTER地址空间(存贮器映射I/O)完成I/O操作。例如在8051上有程序段:DECLARE SBUFBYTEAT(99)REGISTER;DECLAREXBYTE;X=SBUF;从串行接口读(送到变量X)一字符,因为SBUF是包含串行接口数据的设备寄存器。类似地:DECLARE BIT_2_OF_PORT_2BIT AT(0A2H)REGISTER;BIT_2_OF_PORT_2=NOT BIT_2_OF_PORT_2;该程序段将对I/O口的位2做反操作。在大多数程序设计语言中,变量都有名字和类型(象复数、整数、记录等等)。PL/M51的变量不仅有名字和类型,还有地址空间。程序书写中的疏忽,将引起地址空间的错误分配。由于8051有多个存贮空间,地址本身还无法指定PL/M51变量的位置,必须要说明它所在的存贮器。对应的存贮器的说明是由说明语句的后缀指定的。后缀可以是下面的一种:MAIN指可直接寻址的片内RAM区;AUXILIARY指片外RAM区;REGISTER指(存贮器映射的)硬件寄存器区;IDATA指可以间接寻址的片内RAM区;CONSTANT即ROM存贮区。如果没有说明后缀,则一般认为是MAIN。若后缀是IDATA,变量就驻于可间接寻址的片内存贮器(8051字节0-127,8044的字节0-191)。若是REGISTER,则必须在其前加一个AT属性,该属性中的地址只能是128255之间(包括128和255),而量必须是位型或字节型。不同的后缀有不同的作用。常量(CONSTANT)后缀 它说明变量分配在CONSTANT存贮空间,且一定是ROM区。与其它变量相反,常变量的内容在程序执行过程中不能改变。CONSTANT数据初始化能够用于任何程序块层的说明语句中,但常变量名绝不可写在赋值语句左边。PL/M51允许对常量(CONSTANT)关键字进行初始化,这是为非基址变量做的,而对于基址变量(BASED)和外部变量(EXTERNAL)则禁止初始化。初始化可以用在AT属性后面,但是如果因此而引起多重初始化,则其结果就无法预料。初始化的一般形式为:CONSTANT(值表)这里的值表为一序列,是由逗号隔开的值。从值表中每次取一个值,且将其赋给已说明的标量做初值。初始化的方法与赋值语句相同,对于数组或结构的元素,其初始值必须明确给出。可能是一字节或两字节的字符串(如“A”、“NO”)或是一个下面将说明的限定表达式(字节型数组能够适应更长的字符串,因为每个元素都能表征一个字符)。限定表达式可有如下三种形式:1 由点操作符(.)构成地址引用,且必须引用以前说明了的变量。2 常量表达式只包含除了(+)或(-)以外的非运算符,它仅进行数值常量的操作,如2048-256+5。对一个字节初始化,常量表达式值大于255就非法。3 地址引用包含对常量表达式进行加或减运算表达式。说明1:DECLARE THRESHOLDBYTECONSTANT(48)说明字节标量THRESHOLD在ROM中并赋以初值48。说明语句:DECLARE (COUNTER,LIMIT,INCR) WORD CONSTANT(1024,0,2);说明字型标量COUNTER、LIMIT和INCR都在ROM中,并分别给COUNTER、LIMIT和INCR赋初值为1024、0、-2(即65534)。说明2:DECLARE EVEN(5)BYTECONSTANT(2,4,6,8,10);说明字节型ROM数组EVEN,并分别赋给其五个标量初值为2、4、6、8和10。说明3:DECLARE COORD STRUCTURE(HIGH$BOUND WORD,VALUE(3) BYTE,LOW$BOUND BYTE) CONSTANT(302,3,6,12,0);说明结构语句COORD,并把它分配在ROM中,赋其初值如下:COORD.HIGH$BOUND初值为302COORD.VALUE(0)初值为3COORD.VALUE(1)初值为6COORD.VALUE(2)初值为12COORD.LOW&BOUND初值为0如果表中出现字符串,则从左到右取值赋给每个标量。一个字节型标量存一个字符,一个字型标量存两个字符。如:DECLARE GERRTING(5) BYTE AT(1600) CONSTANT(HELLO);该语句使GREETING(0)赋予初值为ASCII码H,GREETING(1)的初值是ASCII码E,以此类推。到此为止,以上各例中和值表与被说明的标量都是一一对应的,而值表中元素个数也小于被定义的标量个数,因而DECLARE DATUM(100) BYTE CONSTANT(3,5,7,8);是合法的。数组DATUM四个元素分别赋初值为值表中的四个元素,而剩下元素没有初始化。但是,值表中的元素不允许多于被说明的标量。下面是地址引用的应用例子:DECLARE GO$NO$GO$MSG(5) BYTE CONSTANT(NOGO,0),GO$NO$GO$MSG$PTR(2) WORD,CONSTANT(GO$NO$GO$MSG,GO$NO$GO$MSG+2);其中第一个常量(CONSTANT)包含一个信息,第二个常量(CONSTANT)包含两常量指针,第一指向完整信件头(NOGO),第二个则仅指向其后缀(GO)。隐含数组维数说明 当数组赋初值时,往往要使数组与列表具有相同的元素个数。借助隐含维数说明方式,可以简化对数组维数的说明定义(即括号内常量)。隐含维数说明具有形式为(*)。现举例如下:DECLARE MSG(*) BYTE CONSTANT(WELCOME!);它说明了一个在ROM中字节数组MSG,有足够的元素来容纳字符串WELCOME!(即8个元素),并用该字符串对其元素初始化。隐含维数说明符只可用于常量(CONSTANT)后缀和要赋初值的数组,它可同任何值表一起使用,字符串常量不受限制。寄存器(REGISTER)后缀 8051 CPU和外界的相互作用,是通过访问硬件寄存器地址空间来完成的。该地址空间包含象SBUF(串行接口缓冲器)、P1(I/O端口1)以及SP(堆栈指示器)等这样的伪变量。例如,若8051写一字节信息到SBUF中,该字节将经串行口输出。这个原则也符合于PL/M51。要访问硬件寄存器,需先说明它为REGISTER(在AT部分指出其确切的地址),然后使端口3复制给端口2,就可以写成P2=P3。有关芯片的用户手册提供有寄存器变量的作用。假如在8051上P0(I/O 0端口)的地址分配是80H,而对该寄存器的说明有类似下面的形式:DECLARE P0 BYTE AT(80H) REGISTER;Intel公司提供有文件REG51.DCL,其中包含做好的对8051芯片上所有寄存器的标准说明语句。应注意的是:为了完成各种计算和保持暂时的结果,编译程序要使用ACC、B、PSW、DPL和DPH寄存器。虽然在程序中允许使用这些寄存器,但可能会产生预料之外的结果,如PSW=0FFH,这是较危险的。IDATA 后缀 MCS-51结构允许内部RAM多达256字节。其中0-127字节既能直接寻址又能间接寻址;而128-255(在8051中不能实现)仅能间接寻址,对这些地址的直接访问便进入寄存器(REGISTER)空间。为使用128-255字节区,得在说明语句中使用IDATA后缀。带有这种后缀的变量,只能间接寻址。因此,它可以存在于RAM内任何部位。然而这种间接访问往往没有直接访问效率高。MAIN 后缀 如未明确指定其后缀,则系统设置为MAIN后缀,即在片内RAM中可直接寻址。带有此后缀的变量可存于片内RAM的地址0-127中,并可最快实现存贮。但为了避免过分拥挤,应尽量少使用。AUXILIARY 后缀 对于8051可以将其片外RAM容量增加到65535个字节。附加的存贮区(RAM)是一个独立的地址空间,说明该存贮空间中的变量要加后缀AUXILIARY。例如:DECLARE X WORD PUBLIC AT(2000H) AUXILIARY;它说明了X是一个在片外RAM空间2000H单元中的字型变量,带有AUXILIARY后缀的变量,其寻址速度要比带MAIN或IDATA后缀的变量慢。24 编辑常量(LITERALLY)当源程序含有很多说明语句时,可以通过说明一个编辑常量来节省在键盘上的操作时间。即:DECLARE DCL LITERALLYDECLARE;此后在编译过程中,每当DCL单独出现(不作为一个字的组成部分)时,编译程序就用DECLARE代之。因而,可写成下列的说明:DCLSWITCHBIT;DECAREABYTE;DELSIZEWORD;使用保留字LITERALLY说明语句定义的一个参数“宏语句”,编译时将其展开,可通过说明一标识符来代表一字符串,此后每当在正文中出现标识符时,就以该字符串替换。这种展开式不能用于字符串或常数中。其说明形式为:DECLARE identifierLITERALLYstring;这里identifier是任意有效的PL/M-51标识符;string是PL/M-51字符集中任意字符序列,但长度不能超过254。使用LITERALLY的另一例子:DECLARE TRUE LITERALLY 1,FALSE LITERALLY 0;DECLARE ROUGH BITDECLARE (X,Y,DELTA,FINAL) WORD;ROYGH=TRUE;DO WHILE ROUGH;X=SMOOTH(X,Y,DELTA);IF(X-FINAL)B所得到的是一个TRUE或FALSE的布尔值。因此,语句:BIT_1=AB OR CD;是有意义的、是合法的PL/M51语句(如果AB或CD,则BIT_1为TRUE,否则 BIT_1为FALSE)。但语句:A=AB+CD 是没有意义的、非法的。下例结构是合法的:IF AB THEN . .IF BOOLEAN(4) THEN . .下例是一些非法结构:IF A THEN ./*因为A是数值型,而不是布尔型*/IF ABIT_1 THEN /*字节型变量与位型变量比较是非法的*/布尔值与数值型值的自动转换只出现在某种特殊的情况下。如用在常量表达式里(即表达式的操作数全是数值常量)。例如:X=1;如果X是字节型变量,则赋值数字1;X是位型变量,则得一位值1(即TRUE)。因此,常量可以是位型或数值型,它取决于程序的上下文,这也适用于其它常量(如BIT_1=3是合法的)和常量表达式(如3+5-7)。34 算术运算符PL/M-51有5 种主要算术运算符:+,-,*,/,MOD。和普通代数一样,这些运算符是用来连接两个数的,每个操作数都有一个字节型或字型。运算符 运算符+、-、*、/用来对位型以外的操作数进行加、减、乘、除运算。运算规则如下:1 两个操作数是同类型的,其结果与操作数的类型相同。但两个操作数是字节型,则*和/结果是字型的。2 只允许有一种混合操作数的组合。一个字节型操作数可以与字型操作数组合。此时字节型操作数被扩充成高8位全0字型操作数而产生一个字型值。,然后对两个字型操作数进行运算。3 一个操作数整数常量,另一个为字型或字节型,那么该整数常量如果小于或等于255,就认为是一个字节型值;如果大于255,就认为是一个字型值,然后按规则1或2对它们进行运算。如果整数常量超过65535,则运算无效。4 两个操作数都是整数常量,其运算取决于所出现的上下文。一元算子也被子定义在PL/M51里,它是加在单个操作数前的前缀。也就是说,-左边没有操作数的被认为是一元减运算。正如普通代数一样,一元算子+运算符没有作用,只有+A时才对A的求值有作用。此外,除数为零的结果没有意义。MOD与/执行的运算一样,只是所得的结果不同。其结果是整除后的余项。例如,字型变量A和B分别赋值为35和16,相应地,A MOD B将出现字型值3。MOD与运算符/的不同之处是,它与周围的数字或字母必须用空格或其它分隔符隔开。35 关系运算符关系运算符用于两个同类型的操作数的比较。或者字节型和字型的值进行比较。关系运算如下:大于=大于等于不等于=等于关系运算符总是二进制的运算符,使两个操作数产生一个位值结果。如果两个操作数是同一类型,无符号的算术运算是用于两个字节型值,两个字型值或两个位型值的比较,当两个操作数之间已说明的关系是真时,其结果是一个位值1,否则位值是0。(65)结果是1(TRUE)(6=4)结果是0(FALSE)由关系操作所得的结果真与假的值和DO WHILE语句与IF语句在一起是很有用的。36 逻辑运算符PL/M-51有NOT、AND、OR、XOR四个逻辑运算符。这四个逻辑运算符用于位型、字节型、字型操作数进行1、8、16位的按位运算。其中,NOT是只与操作数运算的一元算子,它产生一个与操作数同类型的结果,其结果的每一位是对位值的1的补码。其余的每一运算符都涉及两个操作数,相应地进行按位的与、或、异或运算。按位“与”运算的结果是只有当每个操作数的相应位都是1是才得1。按位“或”运算的结果是,只要参加运算的操作数中相应位有一个是1就得1,相应两位同时为0其结果才为0。按位“异或”的运算结果是,只有两个操作数的相应位相同时才为0(即两个都是1或0),两个操作数的相应位中只要有一个是1,另一个是0,则结果就是1。此外,如果两个操作数属同一类型,其结果与原操作数具有相同的类型。它与算术、关系运算一样,只有操作数类型是字节或字型时,混合连接才是合法的,在这种情况下,字节型值被扩展为高8位全为0字节。即:NOTBIT_X/*BIT_X的值是1*/结果是0NOT11001100B结果是00110011B10101010B AND 11001100B结果是10001000B10101010B OR 11001100B结果是11101110B10101010B XOR 11001100B结果是01100110B由关系运算所得的真假值,可以由逻辑运算符连接。例如:NOT (65)结果是0(FALSE)(65) AND (1=2)结果是0(FALSE)(65) OR (1=2)结果是1(TRUE)(LIM=Y) XOR (Z=2)结果是0(FALSE)/*如果两个关系式(LIM=Y和Z=2)同时为真或同时为假是时上式为0,否则结果为1(TRUE)*/37 表达式求值运算符的先后顺序 PL/M51里的运算符是有序的。其顺序决定了在汇编时操作数和运算符是怎样分组和分解。PL/M51里的运算符按从高到低的顺序列于表3-1。也就是说,它们当中首先起作用的在表顶部。位于同一行上的运算符具有相同的优先级,它们按表达式从左到右的顺序进行求值。对具有多个操作符的表达式进行求值时,可以从优先级最高的操作符开始,处于同一外优先级则按从左至右的顺序求值。在表达式的求值中,括号的优先级最高,然后按运算符的优先级,同一级按从左到右的顺序进行。因此,编译程序先对括号内的子表达式里的操作数和运算符进行求值,对有多对括号时,则按从里向外顺序进行。而子表达式的值,作为表达式中余下的一个操作数。括号也可用来括子表达式以外的下标、函数的参数以及过程的引用。但它们在更高层次余下的表达式求值之前,必须先求出值来。 表3-1运算符的顺序操作符类别 操 作 符 注 释 括 号(,)求值顺序控制: 有括号的表达式先对括号内求值,它优先括号外的任何操作数的求值 一元算子+,.,-单边正号操作符,地址操作符,单边负号操作符 算 术*,/,MOD,+,-,PLUS,MINUS乘,除,取余除.加,减 关 系,=,=,=,小于,小于等于,不等于,等于,大于等于,大于 逻 辑NOT,AND,OR,XOR逻辑非,逻辑与,逻辑或,逻辑异或关系操作符的一些说明 代数不等式A=X=B在理论上定义是可行的,但在PL/M51里的有效表达式是A=X AND XG AND HG得到一个位型值,同样子表达式HK也得到一个位型值。然后两个位型值进行逻辑与运算。尽管出现了混合类型,但该表达式是合法的(G和H不是AND的操作数,因为关系操作符比与操作符的优先级高)。操作数的求值顺序 操作数和操作符的结合顺序与操作数的求值顺序不是一回事。具体分析和确定地说明哪个操作数要受到操作符的限制。例如表达式A+B*C,其中B和C是操作符“*”的操作数,而A和B*C的值是操作符“+”的操作数。在操作符“*”执行之前,B和C的值都必须求出。同样,复合操作数B*C的值必须在操作符“+”执行之前求出,但究竟先求出B或是C并不明显,实际上,A的值可以在B的C之前计算出,贮存起来,在执行“+”操作时再取出。PL/M51的规则并没有说明在每个句子中子表达式和操作数的求值顺序,这种机动性使编译程序产生的目标代码最优化。在大多数情况下,求值的顺序没有区别。但是,当具有副作用(边界效应)的函数用作操作数时则必须特别注意。38 赋值语句计算的结果,可以作为一个标量变量的值贮存起来。在任何给定的时候,一个标量变量都只有一个值,但该值随着程序的执行可以改变。PL/M51中的赋值语句可以改变一个变量的值。PL/M51赋

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论