官术网_书友最值得收藏!

3.3 偽操作指令

偽操作指令是一類特殊指令,它不是真正的單片機(jī)系統(tǒng)指令,沒有機(jī)器碼與偽指令對(duì)應(yīng)。它存在于源程序中,但目標(biāo)程序中并沒有這些偽指令的代碼,偽指令也因此而得名。偽指令是為了方便程序設(shè)計(jì)人員編程而設(shè)計(jì)的,在源程序中的作用是為完成匯編程序而做的各種準(zhǔn)備工作,告訴匯編器如何完成匯編過程和一些規(guī)定的操作,控制匯編器的輸入輸出和數(shù)據(jù)定位等。它僅在匯編過程中起作用,一旦匯編結(jié)束,偽指令的使命也即隨之完成。

偽指令語(yǔ)句主要由3部分組成,其一般格式為:

    符號(hào)名        偽指令助記符       操作數(shù)

其中,符號(hào)名通常是代表專用寄存器名、通用寄存器變量、常數(shù)名、標(biāo)志位或控制位名、復(fù)位矢量或中斷矢量的一個(gè)字符串,其在書寫時(shí)需要頂格,其后每部分之間用一個(gè)或一個(gè)以上的空格隔開,另外還需注意的是,一條語(yǔ)句只能占用一行,而不能分行。

在匯編程序MPASM中,有下列4類偽指令:

(1)數(shù)據(jù)偽指令:主要用于程序寄存器的定位和定義數(shù)據(jù)的名稱等。

(2)列表偽指令:用于控制列表文件的指定標(biāo)題、換頁(yè)等。

(3)控制偽指令:即條件匯編,用于控制匯編的路徑。

(4)宏匯編指令:用于控制宏定義體中的運(yùn)行和數(shù)據(jù)定位。

下面將對(duì)這幾類偽指令分別予以介紹。

1.數(shù)據(jù)偽指令

(1)DATA定義程序存儲(chǔ)器的值

      格式:〔<標(biāo)號(hào)>〕DATA<操作數(shù)>,[<操作數(shù)>…]
      例:  DATA 3, 4+AB

(2)DEFINE定義字符串變量

      格式:#DEFINE.<變量名>[<字符串>]

說(shuō)明:用于定義文本替換的標(biāo)號(hào),用一定的變量名字替換源代碼中的字符串,以使程序更加簡(jiǎn)潔,并且易于修改。

例:#DEFINE COUNT 07H;將程序中所有出現(xiàn)的用于定義循環(huán)次數(shù)的 07H都用COUNT代替。

(3)UNDEFINE取消己定義的字符串變量

      格式:#UNDEFINE<變量名>

說(shuō)明:用于取消以前定義過的文本替換標(biāo)號(hào)。

(4)SET對(duì)標(biāo)號(hào)賦值

      格式:<標(biāo)號(hào)>SET<表達(dá)式>

說(shuō)明:用SET可對(duì)標(biāo)號(hào)任意重新賦值,這與后面的CONSTANT偽指令不同。

      例:WIDTH SET9
      HEIGHT SET 12H
      WIDTH SET HEIGHT+8

(5)EQU對(duì)寄存器f和標(biāo)號(hào)賦值

      格式:<標(biāo)號(hào)>EQU<表達(dá)式>

說(shuō)明:為標(biāo)號(hào)或寄存器賦值,標(biāo)號(hào)一旦由EQU賦值,該值就不能再重新定義。

      例:COUNT EQU 21H

(6)RES保留某段程序存儲(chǔ)區(qū)

      格式:RES<單元個(gè)數(shù)>

說(shuō)明:保留10個(gè)空白字節(jié)。

      例:RES  10

(7)INCLUDE包含其他外部源文件

      格式:INCLUDE“文件名”
      INCLUDE<文件名>

說(shuō)明:用于把指定文件讀入源程序中作為源程序代碼的一部分,直到檢測(cè)到文件結(jié)束符時(shí)為止,再恢復(fù)到原源程序中的代碼處。此偽指令可允許嵌套使用,最多可嵌套6層。文件名必須用雙引號(hào)或尖括號(hào)給出。

      例:INCLUDE“c∶\PIC\sysdefs.inc”
          INCLUDE<math.h>

(8)RADIX進(jìn)制定義指令

      格式:RADIX<進(jìn)制表達(dá)式>

說(shuō)明:用于設(shè)置常數(shù)數(shù)制的基數(shù),有效的為十六進(jìn)制、十進(jìn)制、八進(jìn)制,默認(rèn)為十六進(jìn)制。

      例:RADIX DEC;十進(jìn)制
      RADIX HEX;十六進(jìn)制
      RADIX OCT;八進(jìn)制

(9)CONSTANT定義符號(hào)常數(shù)

      格式:CONSTANT<標(biāo)號(hào)>[=<表達(dá)式>,<標(biāo)號(hào)>[=<表達(dá)式>]…]

說(shuō)明:用于對(duì)表達(dá)式中的常量符號(hào)進(jìn)行定義,常量符號(hào)一旦被定義,在程序中就將被重新設(shè)置。這與偽指令VARIABLE不同,后者的值能在程序中修改。

      例:VARIABLE MINVOLTAGE=12
      CONSTANT  MAXVOLTAGE=24
      …
      VARIABLE   MINVOLTAGE=5
      CONSTANT   DIFFVOLTAGE=MAXVOLTAGE—MINVOLTAGE

2.列表偽指令

(1)LIST列表選擇指令

      格式:LIST<選擇項(xiàng)>,…,<選擇項(xiàng)>

說(shuō)明:用來(lái)設(shè)置各種匯編參數(shù)以控制匯編過程或?qū)α斜砦募M(jìn)行格式化。需注意的是,此偽指令的所有參數(shù)只能在一行內(nèi)完成,參數(shù)的數(shù)值都用十進(jìn)制數(shù)設(shè)置。

LIST列表選擇偽指令可以選用的部分參數(shù)如表3-2所示。

表3-2 LIST選項(xiàng)表

      例:LISTF=1NHX8M,R=DEC,P=16F877

(2)PAGE分頁(yè)命令

      格式:PAGE

說(shuō)明:在列表文件中產(chǎn)生分頁(yè)效果,即下面的文件輸出將從新頁(yè)面開始。

(3)TITLE程序標(biāo)頭命令

      格式:TITLE‘程序標(biāo)頭’

說(shuō)明:用于指定在列表文件中作為每一頁(yè)開頭第一行的程序標(biāo)題,標(biāo)頭最長(zhǎng)不超過60個(gè)字符。

      例:TITLE‘This is for PIC16F877 demo’

3.控制偽指令

(1)ORG存放單元起始地址

      格式:<標(biāo)號(hào)>ORG<地址表達(dá)式>

說(shuō)明:ORG用于指定該偽指令后面的源程序存放的起始地址,也就是匯編后的目標(biāo)機(jī)器碼存放的首地址。若ORG后面不帶地址參數(shù),則默認(rèn)為零。若ORG帶標(biāo)號(hào),則地址參數(shù)也賦值給該標(biāo)號(hào)。在一個(gè)源程序中,可以根據(jù)需要多次使用ORG偽指令來(lái)定位。

      例:ORG   00H
      GOTO   MAIN
      …
      ORG 01H
      DISPLAY
      MOVLW 05H

(2)END結(jié)束偽指令

      格式:END

說(shuō)明:指令末的偽指令END是通知匯編程序MPASM結(jié)束對(duì)源程序(.ASM)的匯編,即使后面還有語(yǔ)句,也不再予以匯編。在一個(gè)源程序中必須有END偽指令,而且只能有一個(gè)END,放在整個(gè)程序的最后。

(3)IF條件匯編命令

      格式:IF<條件表達(dá)式>
            <源程序行>
          <ELSE>
            <源程序行>
          ENDIF

說(shuō)明:如果條件表達(dá)式為真,則匯編器將編譯IF和ELSE之間的語(yǔ)句,反之編譯ELSE和ENDIF之間的語(yǔ)句。ELSE可以默認(rèn)。

      例: IF   COUNT=20
            MOVLW  6
            WOVWF  DISP
          ELSE
            MOVLW  7
            MOVWF  DISP
          ENDIF

(4)WHILE條件循環(huán)命令

      格式:WHILE<條件表達(dá)式>
            …
            ENDW

說(shuō)明:當(dāng)條件表達(dá)式滿足條件時(shí),即對(duì)WHILE與ENDW之間的源程序進(jìn)行匯編,反之跳過。該循環(huán)最多允許有100行語(yǔ)句,最大循環(huán)次數(shù)為256次。

      例:VARIABLE  i
          WHILE  i<count
          MOVLW i
          i=i+1
          ENDW

4.MACRO宏定義

      格式:<標(biāo)號(hào)>MACRO[<參數(shù)1>,…,<參數(shù)N>]
       (宏體)
          ENDM

說(shuō)明:宏指令可以對(duì)一個(gè)指令序列進(jìn)行定義,定義后的宏指令可以在源程序中調(diào)用。通過宏調(diào)用,可以把被定義后的宏指令序列源程序代碼插入到主程序中,另外,宏定義還可以嵌套使用。從表面上看,宏與程序類似,但宏定義只能使程序看起來(lái)更簡(jiǎn)潔一些,從而避免一些程序段在源程序中,此時(shí)它本身并不節(jié)省內(nèi)存空間。當(dāng)匯編器編譯后,主程序每使用一次宏,程序存儲(chǔ)器就要開銷相應(yīng)大小的空間,而子程序則不需要,這也是宏與子程序的最大區(qū)別。宏的使用分為宏定義和宏調(diào)用兩個(gè)部分,舉例如下:

      例:① 宏定義:
              DISP   MACRO  X, Y, Z
                    MOVLW  10H
                    MOVWF  X
                Y   BSF  FLAG:7
                    GOTO  Y
                    Z
                    ENDM
          ② 宏調(diào)用:
                  DISP DATE,LOOP,(CALL DISPLAY)

說(shuō)明:DATA,LOOP,(CALL DISPLAY)分別相當(dāng)于宏定義中的參數(shù)X,Y,Z。

          ③ 匯編后的源代碼:
                        MOVLW 10H
                        MOVWF DATE
                  LOOP  BSF  FLAG.7
                        GOTO  LOOP
                        CALL DISPLAY
主站蜘蛛池模板: 衡南县| 綦江县| 双牌县| 岳阳县| 丘北县| 杭锦旗| 蓝山县| 湘西| 垣曲县| 日照市| 来凤县| 玉门市| 曲麻莱县| 丰镇市| 满洲里市| 开江县| 布拖县| 玛曲县| 呼图壁县| 罗源县| 南澳县| 梓潼县| 四川省| 漠河县| 章丘市| 三明市| 白银市| 师宗县| 文山县| 南雄市| 安平县| 平塘县| 湄潭县| 大同县| 体育| 剑河县| 黔江区| 邵阳市| 荔浦县| 丹东市| 丹江口市|