20-PLM程序設(shè)計(jì).doc_第1頁(yè)
20-PLM程序設(shè)計(jì).doc_第2頁(yè)
20-PLM程序設(shè)計(jì).doc_第3頁(yè)
20-PLM程序設(shè)計(jì).doc_第4頁(yè)
20-PLM程序設(shè)計(jì).doc_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1 PL/M程序設(shè)計(jì)基礎(chǔ)PL/M-51的程序書(shū)寫(xiě)格式相當(dāng)靈活,其說(shuō)明語(yǔ)句寫(xiě)在輸入行的位置不受限制,而且程序元素之間可以隨意插入空格。11 PL/M字符集PL/M中用到的字符集,是ASCII字符集的一個(gè)子集,包括如下幾個(gè)字符形式:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789以及專(zhuān)用字符:=./()+-*:;$等,此外,還有空格符、制表符、回車(chē)符和換行符。這里提出的規(guī)則,適用于除了字符串常量和注解以外的PL/M51程序的每個(gè)環(huán)節(jié)。如果在PL/M51程序中包含了任何不在以上字符集中出現(xiàn)的字符,則編譯程序就把它按出錯(cuò)處理。大寫(xiě)字母和小寫(xiě)字母,除了在字符串常量中外,程序中的書(shū)寫(xiě)形式一般沒(méi)有什么區(qū)別,如xyz和XYZ可以交換。此外,空格的多少,除在字符串常量中外,也沒(méi)有區(qū)別,編譯程序把連續(xù)的空格符視為一個(gè)空格對(duì)待。專(zhuān)用字符以及它們的組合,在一個(gè)PL/M程序中有特定的含義。專(zhuān)用字符及其組合列入表中。 專(zhuān) 用 字 符 及 其 組 合 表符 號(hào) 名 稱(chēng) 用 途=等號(hào)(1)賦值運(yùn)算符;(2)關(guān)系運(yùn)算符.點(diǎn)號(hào)(1)結(jié)構(gòu)成員限制符;(2)取地址符/除號(hào)除法運(yùn)算符/*說(shuō)明符注解開(kāi)始分界符*/說(shuō)明符注解結(jié)束分界符(左括號(hào)列、行以及一些表達(dá)式的在端分界符)右括號(hào)列、行以及一些表達(dá)式的右端分界符+加號(hào)加法運(yùn)算或一元數(shù)的正號(hào)符-減號(hào)減法運(yùn)算或一元數(shù)的負(fù)號(hào)符單引號(hào)串界符*星號(hào)乘法運(yùn)算符,隱含維數(shù)指定符大于號(hào)關(guān)系運(yùn)算符=大于等于號(hào)關(guān)系運(yùn)算符不等于號(hào)關(guān)系運(yùn)算符:冒號(hào)標(biāo)號(hào)界符;分號(hào)語(yǔ)句分界符,逗號(hào)列表元素分界符_下橫線(xiàn)標(biāo)識(shí)符中的有效字符$美元號(hào)標(biāo)識(shí)符中的無(wú)效字符12 標(biāo)識(shí)符和保留字標(biāo)識(shí)符用于命名變量、過(guò)程、符號(hào)常量和語(yǔ)句標(biāo)號(hào),最大長(zhǎng)度是31個(gè)字符。第一個(gè)字符必須是字母,其余字符可以是字母、數(shù)字或下劃符(_)和美元符($)。隨意加入的美元符($),是完全被編譯程序忽略的,以提高一標(biāo)識(shí)符或一個(gè)常量(不過(guò)$不能是第一個(gè)字符)的可讀性。一個(gè)包括美元符號(hào)($)的標(biāo)識(shí)符或常量,完全等價(jià)于除去美元符$的同一標(biāo)識(shí)符。下面是有效標(biāo)識(shí)符的一些例子:INPUT_COUNTXGAMMLONGIDENTIFIERNUMBER3LONG$IDENIFIER$NUMBER$3INPUT$COUNTINPUTCOUNT可見(jiàn),兩個(gè)長(zhǎng)標(biāo)識(shí)符是相同的(對(duì)編譯程序而言),最下面兩行標(biāo)識(shí)符也是等價(jià)的,但不同于第一行標(biāo)識(shí)符。保留字不能用作標(biāo)識(shí)符,因?yàn)樗鼈儗?shí)際上是PL/M51語(yǔ)言的組成部分。以下是PL/M51的保留字,它們不能用作標(biāo)識(shí)符。ADDRESSINDIRECTLY_CALLABLEANDINTERRUPTATLABLEAUXILARYLITERALLYBASEDMAINBITMINUSBYMODBYTENOTCALLORCASEPLUSCONSTANTPROCEDUREDECLAREPUBLICDISABLEREGISTERDORETURNELSESTRUCTUREENABLETHENENDTOEXTERNALUSINGGOWHILEGOTOWORDIDATAXORIFPL/M51也有一組預(yù)定義標(biāo)識(shí)符,用以命名內(nèi)部過(guò)程,可以根據(jù)給出的目的來(lái)說(shuō)明這些標(biāo)識(shí)符。但一經(jīng)說(shuō)明,則具有相同名字的內(nèi)部過(guò)程就不能再用了。下面是內(nèi)部過(guò)程預(yù)說(shuō)明的標(biāo)識(shí)符,若這些標(biāo)識(shí)符之一在DECLARE語(yǔ)句中作了說(shuō)明,則在這個(gè)說(shuō)明的作用域內(nèi)相應(yīng)的內(nèi)部過(guò)程,就變成沒(méi)有用的標(biāo)識(shí)符。BOOLEANROLDECRORDOUBLESCLEXPANDSCRHIGHSHLLASTSHRLENGTHSIZELOWTESTCLEARPROPAGETETIME13 標(biāo)記、分隔符和空格的使用正如英文句子是由單詞組成的一樣,PL/M語(yǔ)句也是由標(biāo)記組成的。每個(gè)有下列諸類(lèi):1 標(biāo)識(shí)符2 保留字3 簡(jiǎn)單分界符。除下劃線(xiàn)(_)和美元符($)外,所有專(zhuān)用字符都是簡(jiǎn)單分界符。4 復(fù)合分界符兩個(gè)專(zhuān)用字符的組合。包括:、=、/*、*/。5 數(shù)值常量。6 字符串常量。顯然,在大多數(shù)情況下,一個(gè)符號(hào)結(jié)束時(shí),下一個(gè)符號(hào)緊接著出現(xiàn),例如下面賦值語(yǔ)句中:EXACT=APPROX*(OFFSET-3)/SCALE;EXCAT,APPROX,OFFSET和SCALE是標(biāo)識(shí)符,3是一數(shù)值常量,其它所有字符都是簡(jiǎn)單分界符。有時(shí)在兩標(biāo)識(shí)符、保留字或數(shù)值常量之間并不出現(xiàn)簡(jiǎn)單或復(fù)合分界符。例如:DECLAREABYTE在這種情況下,必須插入空格作為分隔符,即DECLARE A BYTE(連續(xù)多個(gè)空格可以代替單個(gè)空格使用)。同樣,注解語(yǔ)句也可當(dāng)作分隔符使用??崭褚部梢噪S意插入到標(biāo)記的兩側(cè),并不改變PL/M1語(yǔ)句的意義。因此,下面的賦值語(yǔ)句:EXACT = APPROX * (OFFSET-3) / SCALE;等價(jià)于:EXACT=APPROX*(OFFSET-3)/SCALE;14 常量常量是在程序執(zhí)行時(shí)不能變化的值。這里對(duì)數(shù)值常量和字符常量予以簡(jiǎn)單說(shuō)明。數(shù)值常量 數(shù)值常量可以用二進(jìn)制、八進(jìn)制、十進(jìn)制或十六進(jìn)制數(shù)表示,編譯程序分別通過(guò)后綴B、O(或Q)、D或H來(lái)識(shí)別它們。不加后綴的數(shù)值,通常認(rèn)為是十進(jìn)制數(shù)。如果一個(gè)常量含有在已指定了的數(shù)據(jù)基下無(wú)效的字符,則它被認(rèn)為不合法(錯(cuò)誤)而標(biāo)識(shí)出來(lái)。最大的數(shù)值字常量是:1111$1111$1111$1111B=177777Q=65535D=0FFFFH十六進(jìn)制數(shù)的第一個(gè)字符必須是一個(gè)自然數(shù),以避免與標(biāo)識(shí)符混淆。如用十六進(jìn)制表示163,必須寫(xiě)成品0AH,而不寫(xiě)成A3H,否則會(huì)被誤碼認(rèn)為標(biāo)識(shí)符。有效數(shù)值常量的例子列舉如下:12AH 2 33Q 1010B 55D 0BF3H 65535 777O 3EACH;無(wú)效的數(shù)值常量舉例如下:l 12A十六進(jìn)制數(shù)字,但沒(méi)有后綴,因此按無(wú)效的十進(jìn)制數(shù)解釋。l 12AD最后的D可以是一個(gè)后綴,但是A不是十進(jìn)制數(shù)字,如果是十六進(jìn)制數(shù),則最后應(yīng)加一后綴。l 1102B2不是一個(gè)有效的二進(jìn)制數(shù)字。l 2ADGHG不是一個(gè)有效的十六進(jìn)制數(shù)字。一個(gè)數(shù)值常量可以是一位值、一個(gè)字節(jié)或者一個(gè)字值,這取決于其大小和前后關(guān)系。字符串常量 由單引號(hào)括起來(lái)的可打印ASCII字符即構(gòu)成字符串。一個(gè)字符串中含有引號(hào)時(shí),按雙引號(hào)書(shū)寫(xiě),如串Q由兩個(gè)字符組成,一個(gè)引號(hào)再跟一個(gè)Q。字符串中允許加空格,編譯程序在存貯器中是以ASCII碼表征字符串;七位的字符碼可以通過(guò)高位補(bǔ)零轉(zhuǎn)換成八位的字節(jié);長(zhǎng)度為1的串譯成一個(gè)字節(jié)的值,長(zhǎng)度為2的串譯成雙字節(jié)的值。參見(jiàn)下面的例子:A等價(jià)于41HAG等價(jià)于4147H字符串只能作字節(jié)或字型值。由于多于2個(gè)字符的字符串將超出一個(gè)字(16位)值所能表征的能限,因此,較長(zhǎng)字符串作常量時(shí)必須以字節(jié)串的形式存貯,方可在PL/M程序中使用。字符串常量的最大長(zhǎng)度是254字符,串常量可以用來(lái)予置初值常量或作為地址分配的一部分,來(lái)指出串常量的存貯位置。15 注解說(shuō)明性的注解可與PL/M程序正交叉書(shū)寫(xiě),以提高程序的可讀性,并提供程序的文本。PL/M-51的注解是一個(gè)字符序列,左邊由字符對(duì)/*分界開(kāi)始,右邊由字符對(duì)*/分界結(jié)束。這兩個(gè)分界符表明編譯程序在其之間的任何信息不參與編譯,不把這部分信息視作程序的一部分。注解可以包含任何打印的ASCII字符,也可以包括空格、回車(chē)、換行和制表符。注解不能嵌于一個(gè)字符串常量中,否則它將被理解為串常量的一部分,而使編譯程序不能識(shí)別。除此之外,凡空格符能出現(xiàn)的地方就可用注解,即除了標(biāo)記內(nèi)的任何地方。因此,注解可以分布在整個(gè)PL/M程序中。這里,給出PL/M注解的一個(gè)簡(jiǎn)單例子:/* This procedure copies one structure to another. */在本書(shū)中,注解使用小寫(xiě)字母,以利于與由大寫(xiě)字母表示的程序代碼相區(qū)別。2 類(lèi)型與說(shuō)明符號(hào)名的說(shuō)明定義有五種類(lèi)型,即:變量、常量、文字常量(串)、標(biāo)號(hào)和過(guò)程。用在程序塊中的每個(gè)符號(hào)名只能進(jìn)行唯一的說(shuō)明,該說(shuō)明可出現(xiàn)在程序塊的開(kāi)始或者在外層程序塊中。同一程序塊中對(duì)同名進(jìn)行多次說(shuō)明是無(wú)效的。變量、常量、文字常量和過(guò)程,必須在說(shuō)明和定義后才能用在可執(zhí)行語(yǔ)句中,標(biāo)號(hào)可以通過(guò)其后跟一冒號(hào)隱含地得到說(shuō)明。過(guò)程是由PROCEDURE過(guò)程說(shuō)明語(yǔ)句和過(guò)程結(jié)束語(yǔ)句END之間的語(yǔ)句組定義的。除以上各項(xiàng)的名字外,說(shuō)明語(yǔ)句還可以描述其類(lèi)型、屬性和位置。21 變量說(shuō)明語(yǔ)句DECLARE語(yǔ)句是一種非執(zhí)行語(yǔ)句,它引入了一些對(duì)象或?qū)ο蟮募希o它們命名(有時(shí)賦值),需要時(shí)還可為它們分配存貯。DECLARE最重要的作用是說(shuō)明定義變量。變量可以是標(biāo)量(即單一的量)、數(shù)組或結(jié)構(gòu)。變量有更通用的一層含義,即變量可以是一個(gè)標(biāo)量變量,或是可以用一個(gè)標(biāo)識(shí)符引用的標(biāo)量表(數(shù)組)。標(biāo)量變量是一單獨(dú)的說(shuō)明對(duì)象,其值在編譯時(shí)不一定必須知道,它在程序執(zhí)行過(guò)程中可以變化,因而在引用時(shí)要在程序中說(shuō)明。它所使用的名字:標(biāo)識(shí)符。在數(shù)組中,所有的標(biāo)量都用同一標(biāo)識(shí)符命名,彼此之間的區(qū)別在于下標(biāo)不同,如A(0)、A(1)、A(123)等等。結(jié)構(gòu)(類(lèi)型)是標(biāo)量或數(shù)組構(gòu)成的表,它們使用同一主標(biāo)識(shí)符,相互間可以由其自身的元素標(biāo)識(shí)符字段加以區(qū)別。例如,EMPLOYEES.NAME所指的是結(jié)構(gòu)EMPLOYEES中的NAME字段。這種類(lèi)型的變量(數(shù)組和結(jié)構(gòu))將在第四章中詳細(xì)闡述。22 類(lèi)型標(biāo)量總是具有字節(jié)(BYTE)、字(WORD)或位(BIT)等幾種類(lèi)型。字節(jié)型標(biāo)量是占內(nèi)存一字節(jié)的8位二進(jìn)制數(shù);字節(jié)標(biāo)量的值是一無(wú)符號(hào)數(shù),其值的范圍為0-255,字型標(biāo)量占用內(nèi)存連續(xù)兩字節(jié)的16位二進(jìn)制數(shù),其最低有效8位存放在第一字節(jié)(低地址);字型標(biāo)量的值是無(wú)符號(hào)數(shù),其值范圍是065535,與其它PL/M-51編譯程序兼容,保留字ADDRESS可以與WORD同義地使用。位型標(biāo)量只含0(FALSE)或1(TRUE)兩種取值。它必須放在片內(nèi)RAM的32到47中的位可尋址單元或在可位尋址存貯映射的硬件寄存器中。因此,位型量只能有片內(nèi)RAM(MAIN)或寄存器(REGISTER)后綴。位型量(BIT)具有如下幾個(gè)方面重要限制:1 不能有下標(biāo),也就是說(shuō)位型數(shù)組是不存在的。2 不能是基變量(BASED)。3 在片內(nèi)RAM(MAIN)中的位型量不具有AT屬性,但映射到硬件寄存器中的位型量必須是AT確切指出的寄存器地址。4 位可以是結(jié)構(gòu)中的成員。然而,一個(gè)含有BIT成員的結(jié)構(gòu)不可含有非位型成員,它即不可以是一數(shù)組元素,又不可以是基址變量(如果它具有一個(gè)專(zhuān)用功能的位寄存器可以是AT)。注意:字節(jié)可以覆蓋位型結(jié)構(gòu),以允許BYTE語(yǔ)句對(duì)存貯單元的訪(fǎng)問(wèn)。例如:DECLARE S1 STRUCTURE(B0,B1,B3,B3,B4,B5,B6,B7)BIT);DECLARE S1_OVER BYTE AT(S1);5. 最大允許64位。對(duì)BIT型量的這些限制,不是人為給定的,它們?nèi)Q于MSC-51體系結(jié)構(gòu),而使用ASM-51,則不存在以上的限制。數(shù)據(jù)類(lèi)型的概念,不僅用于變量,而且也適用于PL/M51程序處理的每一個(gè)值,這包括過(guò)程調(diào)用返回的值和處理表達(dá)式計(jì)算得出的值。使用不同類(lèi)型的算術(shù)表達(dá)式和其它表達(dá)式將在第三章闡述。下面是幾個(gè)說(shuō)明標(biāo)量的語(yǔ)句舉例:DECLARE APPROXWORD;DECLARE (OLD,NEW)BIT;DECLARE POINTWORD,VAL12BYTE;第一行語(yǔ)句說(shuō)明其標(biāo)識(shí)符為APPROX字型的單個(gè)變量,第二行語(yǔ)句說(shuō)明了兩個(gè)標(biāo)量OLD和NEW均為位型標(biāo)量。這種語(yǔ)句稱(chēng)為“因子式說(shuō)明”語(yǔ)句,它等價(jià)于下述序列:DECLARE OLDBITDECLARE NEWBIT只有因子式說(shuō)明才能保證這兩個(gè)位型標(biāo)量在內(nèi)存中的分配是相鄰的。第三行語(yǔ)句說(shuō)明了不同類(lèi)型的兩個(gè)標(biāo)量: POINT是字型標(biāo)量,而VAL12是字節(jié)型標(biāo)量。下面語(yǔ)句對(duì)數(shù)組進(jìn)行說(shuō)明:DECLARE DOMAIN(12)BYTEAUXILIARY;DECLAREGOMMA(19)WORD;第一個(gè)語(yǔ)句說(shuō)明了在片外RAM中數(shù)組DOMAIN(AUXILIARY在本節(jié)后面的討論中加以說(shuō)明),它的12個(gè)標(biāo)量元素都是字節(jié)型,由0至11作DOMAIN名的下標(biāo)來(lái)區(qū)別,例如DOMAIN的第三個(gè)元素可用DOMAIN(2)表示,每個(gè)數(shù)組的第一個(gè)元素下標(biāo)都是0。第二個(gè)語(yǔ)句說(shuō)明了數(shù)組GAMMA,它具有19個(gè)字型標(biāo)量元素,其數(shù)組的下標(biāo)為0到18。下面語(yǔ)句說(shuō)明了具有兩個(gè)標(biāo)量成員的結(jié)構(gòu):DECLARE RECORDSTRUCTURE(KEY BYTE,INFO WORD);兩個(gè)成員分別是字節(jié)型(可由RECORD.KEY引用)和字型(由RECORD.INFO)引用。這個(gè)字型變量是該結(jié)構(gòu)的第二和第三個(gè)字節(jié)。結(jié)構(gòu)和數(shù)組在第四章還要做進(jìn)一步討論。結(jié)果一個(gè)有效的變量說(shuō)明產(chǎn)生兩個(gè)結(jié)果:(1)按名給予每個(gè)變量存貯分配。(2)認(rèn)為具有預(yù)說(shuō)明了的屬性。在程序中使用該變量時(shí),相當(dāng)于映射同一地址(基址除外)。這也要求所有對(duì)變量的引用應(yīng)遵循當(dāng)前屬性的規(guī)則,即在當(dāng)前程序塊中具有優(yōu)先權(quán)的那些屬性。這樣的原則,使編譯程序指出(在該程序塊級(jí))各種說(shuō)明與使用的不一致的錯(cuò)誤,也就是不相容的錯(cuò)誤。23 地址空間和后綴8051的存貯器有4個(gè)存貯空間:程序存貯器(CONSTANT)、片內(nèi)數(shù)據(jù)RAM(MAIN或IDATA)、特殊功能寄存器(REGISTER)和片外數(shù)據(jù)存貯器(AUXILIARY)。了解并掌握存貯器的結(jié)構(gòu),就具備了進(jìn)一步研究MCS-51系列單片機(jī)的入門(mén)條件。因?yàn)镸CS-51系列的每種單片機(jī)都圍繞著存貯器的特點(diǎn)進(jìn)行的,包括由REGISTER地址空間(存貯器映射I/O)完成I/O操作。例如在8051上有程序段:DECLARE SBUFBYTEAT(99)REGISTER;DECLAREXBYTE;X=SBUF;從串行接口讀(送到變量X)一字符,因?yàn)镾BUF是包含串行接口數(shù)據(jù)的設(shè)備寄存器。類(lèi)似地:DECLARE BIT_2_OF_PORT_2BIT AT(0A2H)REGISTER;BIT_2_OF_PORT_2=NOT BIT_2_OF_PORT_2;該程序段將對(duì)I/O口的位2做反操作。在大多數(shù)程序設(shè)計(jì)語(yǔ)言中,變量都有名字和類(lèi)型(象復(fù)數(shù)、整數(shù)、記錄等等)。PL/M51的變量不僅有名字和類(lèi)型,還有地址空間。程序書(shū)寫(xiě)中的疏忽,將引起地址空間的錯(cuò)誤分配。由于8051有多個(gè)存貯空間,地址本身還無(wú)法指定PL/M51變量的位置,必須要說(shuō)明它所在的存貯器。對(duì)應(yīng)的存貯器的說(shuō)明是由說(shuō)明語(yǔ)句的后綴指定的。后綴可以是下面的一種:MAIN指可直接尋址的片內(nèi)RAM區(qū);AUXILIARY指片外RAM區(qū);REGISTER指(存貯器映射的)硬件寄存器區(qū);IDATA指可以間接尋址的片內(nèi)RAM區(qū);CONSTANT即ROM存貯區(qū)。如果沒(méi)有說(shuō)明后綴,則一般認(rèn)為是MAIN。若后綴是IDATA,變量就駐于可間接尋址的片內(nèi)存貯器(8051字節(jié)0-127,8044的字節(jié)0-191)。若是REGISTER,則必須在其前加一個(gè)AT屬性,該屬性中的地址只能是128255之間(包括128和255),而量必須是位型或字節(jié)型。不同的后綴有不同的作用。常量(CONSTANT)后綴 它說(shuō)明變量分配在CONSTANT存貯空間,且一定是ROM區(qū)。與其它變量相反,常變量的內(nèi)容在程序執(zhí)行過(guò)程中不能改變。CONSTANT數(shù)據(jù)初始化能夠用于任何程序塊層的說(shuō)明語(yǔ)句中,但常變量名絕不可寫(xiě)在賦值語(yǔ)句左邊。PL/M51允許對(duì)常量(CONSTANT)關(guān)鍵字進(jìn)行初始化,這是為非基址變量做的,而對(duì)于基址變量(BASED)和外部變量(EXTERNAL)則禁止初始化。初始化可以用在A(yíng)T屬性后面,但是如果因此而引起多重初始化,則其結(jié)果就無(wú)法預(yù)料。初始化的一般形式為:CONSTANT(值表)這里的值表為一序列,是由逗號(hào)隔開(kāi)的值。從值表中每次取一個(gè)值,且將其賦給已說(shuō)明的標(biāo)量做初值。初始化的方法與賦值語(yǔ)句相同,對(duì)于數(shù)組或結(jié)構(gòu)的元素,其初始值必須明確給出??赡苁且蛔止?jié)或兩字節(jié)的字符串(如“A”、“NO”)或是一個(gè)下面將說(shuō)明的限定表達(dá)式(字節(jié)型數(shù)組能夠適應(yīng)更長(zhǎng)的字符串,因?yàn)槊總€(gè)元素都能表征一個(gè)字符)。限定表達(dá)式可有如下三種形式:1 由點(diǎn)操作符(.)構(gòu)成地址引用,且必須引用以前說(shuō)明了的變量。2 常量表達(dá)式只包含除了(+)或(-)以外的非運(yùn)算符,它僅進(jìn)行數(shù)值常量的操作,如2048-256+5。對(duì)一個(gè)字節(jié)初始化,常量表達(dá)式值大于255就非法。3 地址引用包含對(duì)常量表達(dá)式進(jìn)行加或減運(yùn)算表達(dá)式。說(shuō)明1:DECLARE THRESHOLDBYTECONSTANT(48)說(shuō)明字節(jié)標(biāo)量THRESHOLD在ROM中并賦以初值48。說(shuō)明語(yǔ)句:DECLARE (COUNTER,LIMIT,INCR) WORD CONSTANT(1024,0,2);說(shuō)明字型標(biāo)量COUNTER、LIMIT和INCR都在ROM中,并分別給COUNTER、LIMIT和INCR賦初值為1024、0、-2(即65534)。說(shuō)明2:DECLARE EVEN(5)BYTECONSTANT(2,4,6,8,10);說(shuō)明字節(jié)型ROM數(shù)組EVEN,并分別賦給其五個(gè)標(biāo)量初值為2、4、6、8和10。說(shuō)明3:DECLARE COORD STRUCTURE(HIGH$BOUND WORD,VALUE(3) BYTE,LOW$BOUND BYTE) CONSTANT(302,3,6,12,0);說(shuō)明結(jié)構(gòu)語(yǔ)句COORD,并把它分配在ROM中,賦其初值如下:COORD.HIGH$BOUND初值為302COORD.VALUE(0)初值為3COORD.VALUE(1)初值為6COORD.VALUE(2)初值為12COORD.LOW&BOUND初值為0如果表中出現(xiàn)字符串,則從左到右取值賦給每個(gè)標(biāo)量。一個(gè)字節(jié)型標(biāo)量存一個(gè)字符,一個(gè)字型標(biāo)量存兩個(gè)字符。如:DECLARE GERRTING(5) BYTE AT(1600) CONSTANT(HELLO);該語(yǔ)句使GREETING(0)賦予初值為ASCII碼H,GREETING(1)的初值是ASCII碼E,以此類(lèi)推。到此為止,以上各例中和值表與被說(shuō)明的標(biāo)量都是一一對(duì)應(yīng)的,而值表中元素個(gè)數(shù)也小于被定義的標(biāo)量個(gè)數(shù),因而DECLARE DATUM(100) BYTE CONSTANT(3,5,7,8);是合法的。數(shù)組DATUM四個(gè)元素分別賦初值為值表中的四個(gè)元素,而剩下元素沒(méi)有初始化。但是,值表中的元素不允許多于被說(shuō)明的標(biāo)量。下面是地址引用的應(yīng)用例子: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);其中第一個(gè)常量(CONSTANT)包含一個(gè)信息,第二個(gè)常量(CONSTANT)包含兩常量指針,第一指向完整信件頭(NOGO),第二個(gè)則僅指向其后綴(GO)。隱含數(shù)組維數(shù)說(shuō)明 當(dāng)數(shù)組賦初值時(shí),往往要使數(shù)組與列表具有相同的元素個(gè)數(shù)。借助隱含維數(shù)說(shuō)明方式,可以簡(jiǎn)化對(duì)數(shù)組維數(shù)的說(shuō)明定義(即括號(hào)內(nèi)常量)。隱含維數(shù)說(shuō)明具有形式為(*)。現(xiàn)舉例如下:DECLARE MSG(*) BYTE CONSTANT(WELCOME!);它說(shuō)明了一個(gè)在ROM中字節(jié)數(shù)組MSG,有足夠的元素來(lái)容納字符串WELCOME!(即8個(gè)元素),并用該字符串對(duì)其元素初始化。隱含維數(shù)說(shuō)明符只可用于常量(CONSTANT)后綴和要賦初值的數(shù)組,它可同任何值表一起使用,字符串常量不受限制。寄存器(REGISTER)后綴 8051 CPU和外界的相互作用,是通過(guò)訪(fǎng)問(wèn)硬件寄存器地址空間來(lái)完成的。該地址空間包含象SBUF(串行接口緩沖器)、P1(I/O端口1)以及SP(堆棧指示器)等這樣的偽變量。例如,若8051寫(xiě)一字節(jié)信息到SBUF中,該字節(jié)將經(jīng)串行口輸出。這個(gè)原則也符合于PL/M51。要訪(fǎng)問(wèn)硬件寄存器,需先說(shuō)明它為REGISTER(在A(yíng)T部分指出其確切的地址),然后使端口3復(fù)制給端口2,就可以寫(xiě)成P2=P3。有關(guān)芯片的用戶(hù)手冊(cè)提供有寄存器變量的作用。假如在8051上P0(I/O 0端口)的地址分配是80H,而對(duì)該寄存器的說(shuō)明有類(lèi)似下面的形式:DECLARE P0 BYTE AT(80H) REGISTER;Intel公司提供有文件REG51.DCL,其中包含做好的對(duì)8051芯片上所有寄存器的標(biāo)準(zhǔn)說(shuō)明語(yǔ)句。應(yīng)注意的是:為了完成各種計(jì)算和保持暫時(shí)的結(jié)果,編譯程序要使用ACC、B、PSW、DPL和DPH寄存器。雖然在程序中允許使用這些寄存器,但可能會(huì)產(chǎn)生預(yù)料之外的結(jié)果,如PSW=0FFH,這是較危險(xiǎn)的。IDATA 后綴 MCS-51結(jié)構(gòu)允許內(nèi)部RAM多達(dá)256字節(jié)。其中0-127字節(jié)既能直接尋址又能間接尋址;而128-255(在8051中不能實(shí)現(xiàn))僅能間接尋址,對(duì)這些地址的直接訪(fǎng)問(wèn)便進(jìn)入寄存器(REGISTER)空間。為使用128-255字節(jié)區(qū),得在說(shuō)明語(yǔ)句中使用IDATA后綴。帶有這種后綴的變量,只能間接尋址。因此,它可以存在于RAM內(nèi)任何部位。然而這種間接訪(fǎng)問(wèn)往往沒(méi)有直接訪(fǎng)問(wèn)效率高。MAIN 后綴 如未明確指定其后綴,則系統(tǒng)設(shè)置為MAIN后綴,即在片內(nèi)RAM中可直接尋址。帶有此后綴的變量可存于片內(nèi)RAM的地址0-127中,并可最快實(shí)現(xiàn)存貯。但為了避免過(guò)分擁擠,應(yīng)盡量少使用。AUXILIARY 后綴 對(duì)于8051可以將其片外RAM容量增加到65535個(gè)字節(jié)。附加的存貯區(qū)(RAM)是一個(gè)獨(dú)立的地址空間,說(shuō)明該存貯空間中的變量要加后綴AUXILIARY。例如:DECLARE X WORD PUBLIC AT(2000H) AUXILIARY;它說(shuō)明了X是一個(gè)在片外RAM空間2000H單元中的字型變量,帶有AUXILIARY后綴的變量,其尋址速度要比帶MAIN或IDATA后綴的變量慢。24 編輯常量(LITERALLY)當(dāng)源程序含有很多說(shuō)明語(yǔ)句時(shí),可以通過(guò)說(shuō)明一個(gè)編輯常量來(lái)節(jié)省在鍵盤(pán)上的操作時(shí)間。即:DECLARE DCL LITERALLYDECLARE;此后在編譯過(guò)程中,每當(dāng)DCL單獨(dú)出現(xiàn)(不作為一個(gè)字的組成部分)時(shí),編譯程序就用DECLARE代之。因而,可寫(xiě)成下列的說(shuō)明:DCLSWITCHBIT;DECAREABYTE;DELSIZEWORD;使用保留字LITERALLY說(shuō)明語(yǔ)句定義的一個(gè)參數(shù)“宏語(yǔ)句”,編譯時(shí)將其展開(kāi),可通過(guò)說(shuō)明一標(biāo)識(shí)符來(lái)代表一字符串,此后每當(dāng)在正文中出現(xiàn)標(biāo)識(shí)符時(shí),就以該字符串替換。這種展開(kāi)式不能用于字符串或常數(shù)中。其說(shuō)明形式為:DECLARE identifierLITERALLYstring;這里identifier是任意有效的PL/M-51標(biāo)識(shí)符;string是PL/M-51字符集中任意字符序列,但長(zhǎng)度不能超過(guò)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所得到的是一個(gè)TRUE或FALSE的布爾值。因此,語(yǔ)句:BIT_1=AB OR CD;是有意義的、是合法的PL/M51語(yǔ)句(如果AB或CD,則BIT_1為T(mén)RUE,否則 BIT_1為FALSE)。但語(yǔ)句:A=AB+CD 是沒(méi)有意義的、非法的。下例結(jié)構(gòu)是合法的:IF AB THEN . .IF BOOLEAN(4) THEN . .下例是一些非法結(jié)構(gòu):IF A THEN ./*因?yàn)锳是數(shù)值型,而不是布爾型*/IF ABIT_1 THEN /*字節(jié)型變量與位型變量比較是非法的*/布爾值與數(shù)值型值的自動(dòng)轉(zhuǎn)換只出現(xiàn)在某種特殊的情況下。如用在常量表達(dá)式里(即表達(dá)式的操作數(shù)全是數(shù)值常量)。例如:X=1;如果X是字節(jié)型變量,則賦值數(shù)字1;X是位型變量,則得一位值1(即TRUE)。因此,常量可以是位型或數(shù)值型,它取決于程序的上下文,這也適用于其它常量(如BIT_1=3是合法的)和常量表達(dá)式(如3+5-7)。34 算術(shù)運(yùn)算符PL/M-51有5 種主要算術(shù)運(yùn)算符:+,-,*,/,MOD。和普通代數(shù)一樣,這些運(yùn)算符是用來(lái)連接兩個(gè)數(shù)的,每個(gè)操作數(shù)都有一個(gè)字節(jié)型或字型。運(yùn)算符 運(yùn)算符+、-、*、/用來(lái)對(duì)位型以外的操作數(shù)進(jìn)行加、減、乘、除運(yùn)算。運(yùn)算規(guī)則如下:1 兩個(gè)操作數(shù)是同類(lèi)型的,其結(jié)果與操作數(shù)的類(lèi)型相同。但兩個(gè)操作數(shù)是字節(jié)型,則*和/結(jié)果是字型的。2 只允許有一種混合操作數(shù)的組合。一個(gè)字節(jié)型操作數(shù)可以與字型操作數(shù)組合。此時(shí)字節(jié)型操作數(shù)被擴(kuò)充成高8位全0字型操作數(shù)而產(chǎn)生一個(gè)字型值。,然后對(duì)兩個(gè)字型操作數(shù)進(jìn)行運(yùn)算。3 一個(gè)操作數(shù)整數(shù)常量,另一個(gè)為字型或字節(jié)型,那么該整數(shù)常量如果小于或等于255,就認(rèn)為是一個(gè)字節(jié)型值;如果大于255,就認(rèn)為是一個(gè)字型值,然后按規(guī)則1或2對(duì)它們進(jìn)行運(yùn)算。如果整數(shù)常量超過(guò)65535,則運(yùn)算無(wú)效。4 兩個(gè)操作數(shù)都是整數(shù)常量,其運(yùn)算取決于所出現(xiàn)的上下文。一元算子也被子定義在PL/M51里,它是加在單個(gè)操作數(shù)前的前綴。也就是說(shuō),-左邊沒(méi)有操作數(shù)的被認(rèn)為是一元減運(yùn)算。正如普通代數(shù)一樣,一元算子+運(yùn)算符沒(méi)有作用,只有+A時(shí)才對(duì)A的求值有作用。此外,除數(shù)為零的結(jié)果沒(méi)有意義。MOD與/執(zhí)行的運(yùn)算一樣,只是所得的結(jié)果不同。其結(jié)果是整除后的余項(xiàng)。例如,字型變量A和B分別賦值為35和16,相應(yīng)地,A MOD B將出現(xiàn)字型值3。MOD與運(yùn)算符/的不同之處是,它與周?chē)臄?shù)字或字母必須用空格或其它分隔符隔開(kāi)。35 關(guān)系運(yùn)算符關(guān)系運(yùn)算符用于兩個(gè)同類(lèi)型的操作數(shù)的比較。或者字節(jié)型和字型的值進(jìn)行比較。關(guān)系運(yùn)算如下:大于=大于等于不等于=等于關(guān)系運(yùn)算符總是二進(jìn)制的運(yùn)算符,使兩個(gè)操作數(shù)產(chǎn)生一個(gè)位值結(jié)果。如果兩個(gè)操作數(shù)是同一類(lèi)型,無(wú)符號(hào)的算術(shù)運(yùn)算是用于兩個(gè)字節(jié)型值,兩個(gè)字型值或兩個(gè)位型值的比較,當(dāng)兩個(gè)操作數(shù)之間已說(shuō)明的關(guān)系是真時(shí),其結(jié)果是一個(gè)位值1,否則位值是0。(65)結(jié)果是1(TRUE)(6=4)結(jié)果是0(FALSE)由關(guān)系操作所得的結(jié)果真與假的值和DO WHILE語(yǔ)句與IF語(yǔ)句在一起是很有用的。36 邏輯運(yùn)算符PL/M-51有NOT、AND、OR、XOR四個(gè)邏輯運(yùn)算符。這四個(gè)邏輯運(yùn)算符用于位型、字節(jié)型、字型操作數(shù)進(jìn)行1、8、16位的按位運(yùn)算。其中,NOT是只與操作數(shù)運(yùn)算的一元算子,它產(chǎn)生一個(gè)與操作數(shù)同類(lèi)型的結(jié)果,其結(jié)果的每一位是對(duì)位值的1的補(bǔ)碼。其余的每一運(yùn)算符都涉及兩個(gè)操作數(shù),相應(yīng)地進(jìn)行按位的與、或、異或運(yùn)算。按位“與”運(yùn)算的結(jié)果是只有當(dāng)每個(gè)操作數(shù)的相應(yīng)位都是1是才得1。按位“或”運(yùn)算的結(jié)果是,只要參加運(yùn)算的操作數(shù)中相應(yīng)位有一個(gè)是1就得1,相應(yīng)兩位同時(shí)為0其結(jié)果才為0。按位“異或”的運(yùn)算結(jié)果是,只有兩個(gè)操作數(shù)的相應(yīng)位相同時(shí)才為0(即兩個(gè)都是1或0),兩個(gè)操作數(shù)的相應(yīng)位中只要有一個(gè)是1,另一個(gè)是0,則結(jié)果就是1。此外,如果兩個(gè)操作數(shù)屬同一類(lèi)型,其結(jié)果與原操作數(shù)具有相同的類(lèi)型。它與算術(shù)、關(guān)系運(yùn)算一樣,只有操作數(shù)類(lèi)型是字節(jié)或字型時(shí),混合連接才是合法的,在這種情況下,字節(jié)型值被擴(kuò)展為高8位全為0字節(jié)。即:NOTBIT_X/*BIT_X的值是1*/結(jié)果是0NOT11001100B結(jié)果是00110011B10101010B AND 11001100B結(jié)果是10001000B10101010B OR 11001100B結(jié)果是11101110B10101010B XOR 11001100B結(jié)果是01100110B由關(guān)系運(yùn)算所得的真假值,可以由邏輯運(yùn)算符連接。例如:NOT (65)結(jié)果是0(FALSE)(65) AND (1=2)結(jié)果是0(FALSE)(65) OR (1=2)結(jié)果是1(TRUE)(LIM=Y) XOR (Z=2)結(jié)果是0(FALSE)/*如果兩個(gè)關(guān)系式(LIM=Y和Z=2)同時(shí)為真或同時(shí)為假是時(shí)上式為0,否則結(jié)果為1(TRUE)*/37 表達(dá)式求值運(yùn)算符的先后順序 PL/M51里的運(yùn)算符是有序的。其順序決定了在匯編時(shí)操作數(shù)和運(yùn)算符是怎樣分組和分解。PL/M51里的運(yùn)算符按從高到低的順序列于表3-1。也就是說(shuō),它們當(dāng)中首先起作用的在表頂部。位于同一行上的運(yùn)算符具有相同的優(yōu)先級(jí),它們按表達(dá)式從左到右的順序進(jìn)行求值。對(duì)具有多個(gè)操作符的表達(dá)式進(jìn)行求值時(shí),可以從優(yōu)先級(jí)最高的操作符開(kāi)始,處于同一外優(yōu)先級(jí)則按從左至右的順序求值。在表達(dá)式的求值中,括號(hào)的優(yōu)先級(jí)最高,然后按運(yùn)算符的優(yōu)先級(jí),同一級(jí)按從左到右的順序進(jìn)行。因此,編譯程序先對(duì)括號(hào)內(nèi)的子表達(dá)式里的操作數(shù)和運(yùn)算符進(jìn)行求值,對(duì)有多對(duì)括號(hào)時(shí),則按從里向外順序進(jìn)行。而子表達(dá)式的值,作為表達(dá)式中余下的一個(gè)操作數(shù)。括號(hào)也可用來(lái)括子表達(dá)式以外的下標(biāo)、函數(shù)的參數(shù)以及過(guò)程的引用。但它們?cè)诟邔哟斡嘞碌谋磉_(dá)式求值之前,必須先求出值來(lái)。 表3-1運(yùn)算符的順序操作符類(lèi)別 操 作 符 注 釋 括 號(hào)(,)求值順序控制: 有括號(hào)的表達(dá)式先對(duì)括號(hào)內(nèi)求值,它優(yōu)先括號(hào)外的任何操作數(shù)的求值 一元算子+,.,-單邊正號(hào)操作符,地址操作符,單邊負(fù)號(hào)操作符 算 術(shù)*,/,MOD,+,-,PLUS,MINUS乘,除,取余除.加,減 關(guān) 系,=,=,=,小于,小于等于,不等于,等于,大于等于,大于 邏 輯NOT,AND,OR,XOR邏輯非,邏輯與,邏輯或,邏輯異或關(guān)系操作符的一些說(shuō)明 代數(shù)不等式A=X=B在理論上定義是可行的,但在PL/M51里的有效表達(dá)式是A=X AND XG AND HG得到一個(gè)位型值,同樣子表達(dá)式HK也得到一個(gè)位型值。然后兩個(gè)位型值進(jìn)行邏輯與運(yùn)算。盡管出現(xiàn)了混合類(lèi)型,但該表達(dá)式是合法的(G和H不是AND的操作數(shù),因?yàn)殛P(guān)系操作符比與操作符的優(yōu)先級(jí)高)。操作數(shù)的求值順序 操作數(shù)和操作符的結(jié)合順序與操作數(shù)的求值順序不是一回事。具體分析和確定地說(shuō)明哪個(gè)操作數(shù)要受到操作符的限制。例如表達(dá)式A+B*C,其中B和C是操作符“*”的操作數(shù),而A和B*C的值是操作符“+”的操作數(shù)。在操作符“*”執(zhí)行之前,B和C的值都必須求出。同樣,復(fù)合操作數(shù)B*C的值必須在操作符“+”執(zhí)行之前求出,但究竟先求出B或是C并不明顯,實(shí)際上,A的值可以在B的C之前計(jì)算出,貯存起來(lái),在執(zhí)行“+”操作時(shí)再取出。PL/M51的規(guī)則并沒(méi)有說(shuō)明在每個(gè)句子中子表達(dá)式和操作數(shù)的求值順序,這種機(jī)動(dòng)性使編譯程序產(chǎn)生的目標(biāo)代碼最優(yōu)化。在大多數(shù)情況下,求值的順序沒(méi)有區(qū)別。但是,當(dāng)具有副作用(邊界效應(yīng))的函數(shù)用作操作數(shù)時(shí)則必須特別注意。38 賦值語(yǔ)句計(jì)算的結(jié)果,可以作為一個(gè)標(biāo)量變量的值貯存起來(lái)。在任何給定的時(shí)候,一個(gè)標(biāo)量變量都只有一個(gè)值,但該值隨著程序的執(zhí)行可以改變。PL/M51中的賦值語(yǔ)句可以改變一個(gè)變量的值。PL/M51賦

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論