ASM-51宏匯編使用手冊
ASM-51 宏匯編主要用來開發(fā)Inter8051系列單片機,它具有宏處理,數(shù)據(jù)處理,列表處理和條件處理等多種功能。源程序的編寫完全采用 Inter標(biāo)準助記符和行格式。在編寫程序過程中,可借助于文本編輯(Windows的記事本)或文字處理軟件Word等編輯, 經(jīng)ASM-51匯編后生成列表輸出文件(.LST)和目標(biāo)代碼文件(.HEX)。 此目標(biāo)代碼文件(.HEX)可直接用CZS-51或MedWin、Keil、Debug8051進行模擬/調(diào)試,或直接用于硬件仿真器上運行。當(dāng)然,這也是要燒寫到單片機ROM中的代碼。
??? 1、 宏匯編語言的基本語法
??? 1、1? 宏匯編的特點
??? ASM-51宏匯編完全支持Inter助記符的匯編語言,它含有宏語句,英文大小寫字母,變量名,標(biāo)號等不受限制,有二,十,十六進制和串參數(shù)類型,有匯編控制指令和多層條件語句,程序邏輯分段, 還有模塊化程序設(shè)計的連接功能,匯編速度快等特點。
??? 1、2 匯編處理過程
??? (1) 用行編輯EDLIN或文字處理軟件WS或全屏幕編輯軟件PE等,編輯宏匯編
語言源程序,它的文件擴展名為。ASM。
??? (2) 用ASM-51宏匯編程序?qū)ι鲜鲈闯绦蛭募M行匯編,產(chǎn)生擴展名為.LST的列表輸出文件和擴展名為.HEX的目標(biāo)代碼文件(.HEX)。 列表輸出文件包含源程序語句所匯編成的代碼,以及有關(guān)的地址,語句和符號表等。 目標(biāo)代碼文件包含源程序語句所匯編成的代碼, 不包含任何符號信息或助記符。 進行模擬/調(diào)試,或直接用于硬件仿真器上運行。
??? 1、3 語句
??? 匯編語言可分為兩類語句:指令性語句和指示性語句。
??? (1)指令性語句
??? 這一類語句是指在匯編過程中能生成指令代碼的語句(如 MOV ,DEC等)。其格式為:
???? [標(biāo)號:] [指令助記符] [操作數(shù)] [;注釋]
??? 其中方括號[? ]中為選擇項。下同。
??? (2)指示性語句
??? 這一類語句即通常所說的偽指令,它指示匯編程序后面的指示性語句如何產(chǎn)生代碼。
??? ASM-51宏匯編完全支持Inter助記符的匯編語言,因此匯編程序的格式,指令完全與8051匯編語言一樣,這里不再介紹它們的指令系統(tǒng)。
??? 1、4 常量與數(shù)值運算
??? (1) 常量及其表示
??? 常量,就是在匯編時已經(jīng)確定的值。 在匯編語言中,常量主要用作指令性語句中的直接操作數(shù),也可用于存儲器操作的組成部分(如位移量),或者為偽指令中的變量輸初值。
?? 為便于程序設(shè)計,常量有多種表示形式:二、十、十六進制數(shù)和字符串等,它們的格式各不相同,并采用不同的基數(shù)標(biāo)記加以區(qū)分。表--1列出其格式。?
? 表--1
數(shù)據(jù)形式???? 格?? 式???? 取值范圍????? 例 如??????? 備?? 注
?2進制????? ********B????? 0,1??????? 10011100B
10進制?????? ******????? 0,1,2...9??? 45723?????? 缺省基數(shù)標(biāo)記
16進制?????? ****H?????? 0,1...E,F(xiàn)??? 0CDE3H????? 最前面一個字符應(yīng)是0--9
ASCII??????? '**'???????? ASCII??????? 'AD'?????? 只有DB命令中使用
?
??? 常量以數(shù)值形式直接寫在匯編語言的語句中稱為字面常量, 若預(yù)先為它定義一個符號名,然后在語句中用符號名來表示該常量稱符號常量。使用符號常量的優(yōu)點可改善程序的可讀性,它的定義需要使用偽操作命令"EQU"或“=“。
??? (2) 數(shù)值運算
??? 宏匯編中,所有參數(shù)值均被認為是整數(shù),并以16位的形式存放,表示的范圍是0---65535,所有算術(shù)操作均對整數(shù)以補碼形式運算。
??? (1) 基本運算
??? 匯編語言對常量允許進行算術(shù)運算,邏輯運算,分離運算等三種類型的運算。如表--2所示。?
?表--2???????????????? 基本運算
? 運? 算??? 操?? 作?????? 含? 義?????????? 以ADD為例
??? 算??????? +?????????? 加操作???????? ADD? A,R1+36
??????????????? -?????????? 減操作???????? ADD? A,R1-2EH
??????????????? *?????????? 乘操作???????? ADD? A,R1*0E3H
??? 術(shù)??????? /?????????? 除操作???????? ADD? A,R1/23
???????????? MOD????????? 模除?????????? ADD? A,R1 MOD 12
???????????? SHR????????? 右移?????????? ADD? A,R1 SHR 3
???????????? SHL????????? 左移?????????? ADD? A,R1 SHL 2
??? 邏?????? AND????????? 與操作???????? ADD? A,R1 AND 10000101B
???????????? OR?????????? 或操作???????? ADD? A,R1 OR 00110000B
???????????? XOR????????? 異或操作?????? ADD? A,R1 XOR 36H
??? 輯?????? NOT????????? 非操作???????? ADD? A, NOT 45H
??? 分?????? HIGH???????? 高字節(jié)分離???? ADD? A, HIGH 05E2H
??? 離?????? LOW????????? 低字節(jié)分離???? ADD? A, LOW 77F0H
?
說明:?? R1為符號常量。
??? (2) 綜合運算
??? 綜合運算規(guī)則 1: 計算表達式時,所有的運算全部從左到右順序進行,遇到操作數(shù)就進行運算,不考慮優(yōu)先關(guān)系,括號有助于視覺理解,但不改變表達式的?計算順序。
??? 例如:???? R1 SET NOT(0C5FH OR 000CH)
????????????? 其結(jié)果應(yīng)為 0F3ACH。
??? 綜合運算規(guī)則 2: 當(dāng)兩個操作數(shù)之間沒有參數(shù)相隔時, 第二個操作符優(yōu)先于第一個操作符計算。
??? 例如:??? R1 SET NOT 10011010B
???????????? 其結(jié)果應(yīng)為 65H。
??? 1、5 程序分段
??? 8051系列的處理器的結(jié)構(gòu), 把內(nèi)存分成五個獨立的內(nèi)存段, 即代碼段(段名CSEG),數(shù)據(jù)段(段名DSEG), 外部段(段名XSEG), 功能段(段名FSEG)和位段(段名BSEG)等。 各個段在源程序中的次序可以任意,段的數(shù)目可以根據(jù)需要確定,原則上不受限制。程序中的所有段都必須用段名開頭,段結(jié)束語句ENDS結(jié)束。
??? 1、6 源文件
??? 源文件是由匯編語言代碼和匯編程序指令組成的 ASCII 字符文件, 擴展名為。ASM。源文件的每一語句行,最多有四個域。每一行的長度不超過80個字符, 且以“回車“鍵結(jié)束。
??? 1、7 列表輸出文件和目標(biāo)代碼文件
??? (1) 目標(biāo)代碼文件(.HEX)
??? 目標(biāo)代碼文件(.HEX)是ASCII文件,它只包含由各種程序語句所生成的代碼,而不包含任何信息或助記符。 該文件是能夠在處理器上運行的實際機器指令碼。
??? 目標(biāo)代碼文件格式如下:
??????? :cc????? aaaa?????? tt??? dd?? aa?? dd???? ss????
??????? 計數(shù)器????????? 數(shù)據(jù)類型????? 記錄地址??????????? 回車
??????????????? 記錄地址???????????? 代碼的字節(jié)??? 和校驗
??? 目標(biāo)代碼文件(.HEX)的每一行以一個冒號開始, 后面跟著的數(shù)字和符號分別表示十六進制數(shù)據(jù)的計數(shù)器(cc),記錄第一個數(shù)據(jù)字節(jié)的16位地址(aaaa),目標(biāo)記錄的數(shù)據(jù)類型(tt),代碼的實際字節(jié)(dd),計數(shù)器從第一個數(shù)據(jù)字節(jié)到最后的所有字節(jié)值累加和的相反數(shù)即和校驗(ss)等等。
??? (2)列表輸出文件(.LST)
??? 列表輸出文件也是個ASCII文件,它由源程序和目標(biāo)代碼文件組成, 可作為程序文檔也可被打印。
??? 列表輸出文件是分頁顯示,打印的,其長度由缺省值或偽指令$PAGE決定。 每頁一開始指出匯編程序的類型,版本以及頁號等。
??? 2、 偽操作指令
??? 匯編語言中的指示性語句(偽指令),不象指令性語句會產(chǎn)生目標(biāo)代碼, 它主要是用來“控制指揮“匯編程序如何把指令性語句翻譯成目標(biāo)代碼。除本身偽指令申請分配一部分存貯空間作數(shù)據(jù)區(qū)和堆棧區(qū)外,不產(chǎn)生任何目標(biāo)代碼。
??? 按照它們的功能,大致分成七類: 符號定義偽操作,段定義偽操作,數(shù)據(jù)定義崐偽操作,列表偽操作,條件偽操作,宏處理偽操作以及其它操作等。如表--3所示。
?
??? 表--3??????? 偽操作指令
序號???? 分??? 類????????????? 偽? 操? 作? 指? 令
?1??? 符號定義偽操作?????? EQU,=,DATA,BYTE,WORD,BIT,SET
?2??? 段定義偽操作???????? ORG,END,CSEG,DSEG,XSEG,F(xiàn)SEG,ENDS
?3??? 數(shù)據(jù)定義偽操作?????? DB,DW,DS
?4??? 列表偽操作?????????? $TITLE,$SUBTTL,$PAGE,$LIST,$NOLIST,$NOCODE
?5??? 條件偽操作?????????? IF,ELSE,ENDIF
?6??? 宏處理偽操作???????? MACRO,ENDM
?7??? 其????? 它?????????? ALTNAME,INCLUDE
?
??? 2、1 符號定義偽操作
??? 符號定義偽操作及其格式:????? 符號名? 符號定義名? 常量或表達式
??? 其中符號定義名可以為EQU,=,DATA,BYTE,WORD,BIT,SET等。下面就是這些符
號定義偽操作的用法及說明。如表--4所示。
?
??? 表--4??????? 符號定義偽操作
符號定義名????????? 用????????? 法????????????????? 說??????? 明
? EQU???????? 為常量,符號名等定義符號化常量名??? 符號名不能重名定義
?? =????????? 為常量,符號名等定義符號化常量名??? 符號名不能重名定義
? DATA??????? 用來為一個字節(jié)類型的符號定值?????? 符號名不能重名定義
? BYTE??????? 用來為一個字節(jié)類型的符號定值?????? 符號名不能重名定義
? WORD??????? 用來為一個字類型的符號定值???????? 符號名不能重名定義
???????????????????????????????????????????????? 8051中沒有字操作
? BIT???????? 用來定義一個字位類型
? SET???????? 用來定義整數(shù)類型的符號名?????????? 符號名可重名定義
?
??? DATA與BYTE的區(qū)別: DATA與BYTE是相類似的偽指令。 當(dāng)程序運行到DATA偽指令定義的符號名時,該符號名將被顯示;而由BYTE定義的符號名不被顯示。
??? 2、2 段定義偽操作
??? (1)? ORG? 用于設(shè)置或改變程序計數(shù)器的值。
??? 其格式為:??????????? ORG??? 常數(shù)或表達式
??? 例如:? ORG? 0008H
??????????? ORG? $+5
??? 其中$表示程序計數(shù)器的當(dāng)前值。
??? (2)? END? 表示源代碼結(jié)束。
??? 其格式為:??????????? END? 常數(shù)或表達式
??? 匯編程序遇到END語句即停止運行。 若程序中沒有END,則在匯編源程序時顯出錯
??? (3)? 8051系列的處理器把內(nèi)存結(jié)構(gòu)分成五個段,代碼段CSEG,數(shù)據(jù)段DSEG,外部段XSEG,功能段FSEG和位段BSEG等,其用法及區(qū)別如 表--5所示。
??? 在匯編以上各段所定義的符號時,系統(tǒng)根據(jù)符號所在不同段,賦與不同類型的字母,如表--6所示。
??? 2、3? 數(shù)據(jù)定義偽操作
??? 數(shù)據(jù)定義偽操作格式:
???????? [ 標(biāo)號: ]?? 數(shù)據(jù)定義名? [ 表達式1,表達式2,。。。 ]
??? 其中數(shù)據(jù)定義名可為DB,DW,DS等。
??? 如表--7所示,數(shù)據(jù)定義偽操作的含義及說明。
?
??? 表--5??????????? 段定義偽操作
? 段??????????????????? 用????? 法????? 及????? 區(qū)????? 別
代碼段(CSEG)?? 包含由處理器所執(zhí)行的程序。段名可缺省。有目標(biāo)代碼生成。
數(shù)據(jù)段(DESG)?? 由內(nèi)部工作寄存器的處理器的RAM組成。用來對程序使用的數(shù)據(jù)地址賦符號名,大多以O(shè)RG,DATA,BYTE,WORD,EDNS等組成。???? 無目標(biāo)碼生成。
外部段(XSEG)?? 由外部工作寄存區(qū)和RAM組成。使用方法同數(shù)據(jù)段。無目標(biāo)碼生成。
功能段(FSEG)?? 由特殊寄存器位置組成(如:輸入/輸出部件,計時器,中斷控制和連續(xù)的寄存器部件接口等)。無目標(biāo)代碼生成。
位? 段(BSEG)?? 由一些獨立的位組成,可以用布爾函數(shù)實現(xiàn)。 該段地址被解釋為位地址。無目標(biāo)代碼生成。
?
??? 表--6????????????? 程序分段的類型符號
?? 段?????????? 標(biāo)號(Label) 字節(jié)型操作數(shù)(Byte)? 字型操作數(shù)(Word)
代碼段CSEG????? L??????????????? D??????????????????? W
數(shù)據(jù)段DSEG????? D??????????????? D??????????????????? W
外部段XSEG????? X??????????????? X??????????????????? E
功能段FSEG????? F??????????????? F??????????????????? G
位? 段BSEG????? B??????????????? B??????????????????? B
?
??? 說明:?? (1)在不同的段中類型符號不同;
??????????? (2)字節(jié)型操作數(shù)(Byte)一般通過DATA指令賦給符號; 字型操作數(shù)
一般通過WORD指令賦給符號;
??????????? (3)如果各段中用BYTE賦值,則在各段中符號全以S表示;在SIM51模
擬/調(diào)試中的符號區(qū)顯示功能中,對BYTE賦值的將被跳過。
??????????? (4)在各段中,位類型可以用BIT指令賦給。
?
?? 表--7?????????? 數(shù)據(jù)定義偽操作
數(shù)據(jù)定義名??????? 含????????? 義??????????????? 說??????????????? 明
??? DB??? 用于定義一個字節(jié)包含的值????? 表達式不是字符串時,每個表達式賦給一個字節(jié),是字符串時,用單引號 “ ' “ 作為分隔符。
??? DW??? 用于定義一個字(16位)??? 每個表達式占16位。 如果表達式中的存貯內(nèi)容為字符串,只取最后兩個字符。若字符串只有一個字符,高字節(jié)置“0“。
??? DS????? 定義一個存貯區(qū)???? 通常用在代碼段中,作為程序的一部分。若用在數(shù)據(jù)段,外部段,則作為位置標(biāo)志使用。
??????? 表--8????????????? 列表偽操作
?? 偽指令????????? 含義及格式??????????????????? 說????????????? 明
?? $TITLE??? 給源程序指定一個標(biāo)題??????????? 標(biāo)題不加 “? “,其最大長度
???????????? 格式: $TITLE [標(biāo)題行]?????????? 60個字符。若標(biāo)題行省略, 原來定義的標(biāo)題行作廢。
?? $SUBTTL? 給源程序指定一個副標(biāo)題?????????? 副標(biāo)題不加 “? “,其最大長
??????????? 格式: $SUBTTL [副標(biāo)題行]???????? 度60字符。若副標(biāo)題行省略,原來定義的副標(biāo)題行作廢。
?? $PAGE??? 用于形成或定義新的一頁或行數(shù)???? 匯編時頁長為66行(適合于格式: $PAGE [表達式] 標(biāo)準打印紙)。表達式最大為65535,最小為12, 表達式缺省,則從新的一頁開始。
?? $LIST???? 使源程序匯編時,產(chǎn)生程序清單??? 匯編時無此指令照樣產(chǎn)生清單。
???????????? 格式: $LIST
?? $NOLIST?? 使源程序匯編時不產(chǎn)生程序清單
???????????? 格式: $NOLIST
?? $NOCODE?? 源程序匯編時,條件匯編程序值??? 沒有此指令匯編時,不論其值是為假的不產(chǎn)生清單。真、假的條件都不產(chǎn)生目標(biāo)碼。
???????????? 格式: $NOCODE
??? 2、4? 列表偽操作
??? 如表--8所示,列表偽操作的含義,格式及說明。
??? 2、5 條件偽操作
??? 條件偽操作格式:
?????????? IF?? 表達式
?????????????? [ 程序塊1 ]
?????????? [ ELSE ]
?????????????? [ 程序塊2 ]
?????????? ENDIF
?? 當(dāng)IF指令中的表達式為真時,被匯編的代碼段是程序塊1;當(dāng)IF指令中的表達式為假時,被匯編的代碼段是程序塊2。 在一個條件結(jié)構(gòu)中,僅有一個代碼段被匯編,其它的則被忽略。
??? 2、6 宏處理操作
??? 在源程序中,如果有一段程序需要多次使用,為使程序不重復(fù)書寫這段程序,可用宏定義把所需要重復(fù)出現(xiàn)的程序塊定義成宏指令,此后在宏指令出現(xiàn)的地方,宏匯編程序總是自動地把它們替換成相應(yīng)的代碼段。
??? (1) 宏指令格式
??????? [ 宏指令名 ]? MACRO? [形式參數(shù),。。。]
????????????????????? 代碼段
????????????????????? ENDM
??? 在宏定義中,使用了“形式參數(shù)“,它們引用宏指令時被給出的一些名字或數(shù)值(實在參數(shù))所替換。使用形式參數(shù)給宏指令帶來了很大的靈活性。
??? (2)宏調(diào)用格式
??????? [ 宏指令名 ]? [實在參數(shù),。。。]
??? 注意:1、當(dāng)有兩個以上的實參數(shù)時,它們之間要用逗號,空格或列表符隔開。
????? 2、實參數(shù)項將對應(yīng)替換宏指令中形式參數(shù)。如果形式參數(shù)為標(biāo)號時,則在宏調(diào)用中,實參也應(yīng)為標(biāo)號,且要求實參是唯一的。如果宏定義中有自己的標(biāo)號,則在宏調(diào)用時,匯編程序自動地把標(biāo)號變成唯一的標(biāo)號。
??? 2、7 其他
??? (1) 替換名 ALTNAME
??? 功能: 這一偽指令用來自定義名字,以替換源程序中原來的保留字,替換的保留字均可等效地用于子程序中。
??? 格式: ALTNAME? 保留字? 自定義名
??? 注意: 自定義名與保留字之間首字符必須相同。?
??? (2) 附加文件的鏈結(jié) INCLUDE
??? 功能: 利用此偽指令可將一個源文件插入到當(dāng)前源文件中一起匯編,最終成為一個完整的源程序。
??? 格式: INCLUDE? [ 驅(qū)動器名: ]? [ 路徑名 ]? 文件名
??? 注意:1、文件名中若沒有擴展名,則系統(tǒng)默認是。ASM(該文件必須是能打開的)。
???????? 2、被插入的源程序中不能包含END偽指令,否則匯編會停止運行。被鏈接文件的每一行,在程序清單中以“I“開頭。
???????? 3、鏈接偽指令可有8級嵌套, 若要求嵌套的多, 則要修改 DOS 中的
CONFIG。SYS文件的FILES參數(shù)。
??? 3 宏匯編運行
??? 3、1 系統(tǒng)運行環(huán)境
??? ASM-51宏匯編要在IBM-PC及其兼容機上運行(至少128K字節(jié)的RAM);具有一個軟驅(qū)動器或硬驅(qū)動器,采用ANSI標(biāo)準終端(包括鍵盤,顯示控制器,打印機,至少一個RS-232異步通訊接口)。軟件有PC-DOS,MS-DOS 2。0 以上版本,ASM_51系統(tǒng)。
??? 3、2 宏匯編程序的運行
??? 以 8051 宏匯編為例,在DOS系統(tǒng)的提示符下鍵入
??? A> ASM51? 文件名。ASM
等錯誤的個數(shù)出現(xiàn)后 ,鍵入
??? 4 匯編的使用
??? 使用ASM-51宏匯編是將8051源程序匯編生成列表輸出文件和目標(biāo)代碼文件,供模擬/調(diào)試時使用。我們使用的宏匯編完全采用Inter標(biāo)準助記符和行格式,因此在編寫源程序時,可以使用宏匯編中的偽指令, 以增加源程序的運行速度和可讀性。也可以直接用 Inter 標(biāo)準助記符來編寫源程序。再經(jīng)過ASM-51宏匯編進行匯編,便可得到列表輸出文件和目標(biāo)代碼文件。
??? 匯編的格式如下:
??? > ASM51? 文件名。ASM? [ 可選項 ]
??? 其中可選項為: /L, /H, /S, /P, /N
??? /L 表示源程序匯編后不生成列表冊輸出文件(.LST),只顯示在屏幕上。
??? /H 表示源程序匯編后不生成目標(biāo)代碼文件(.HEX)。
??? /S 表示源程序匯編后不生成符號表。
??? /P 表示源程序匯編后生成符號表。
??? /N 表示源程序匯編后,程序是連續(xù)的顯示。
??? 如果沒有選擇項,則表示產(chǎn)生列表輸出文件和目標(biāo)代碼文件,且在LST文件后面列出符號表。 生成的目標(biāo)代碼便可以進行模擬/調(diào)試,如果在模擬/調(diào)試中發(fā)現(xiàn)錯誤,則源程序要經(jīng)過修改,重新匯編,然后再進行模擬/調(diào)試,直到完全正確。
??? 若程序匯編過程中有錯誤,則給出出錯信息(出錯信息見附錄)。 生成的目標(biāo)代碼可以進行模擬/調(diào)試/燒寫。?
?????? 附錄??? ASM-51 匯編出錯信息表
1? Address Out of Range 一個被計值的目標(biāo)地址超出了當(dāng)前語句的范圍。
2? Badly Formed Argument 數(shù)字規(guī)定的類型中有非法數(shù)字存在。
3? Illefal Equale 有不允許的類型約定。
4? Label Name Conflicts With Symbol Name 在程序中有兩個符號相同。
5? Label Address Changed On Pass 2。 源程序在此錯誤之前,還有一些錯誤。
6? Missing Argument in Expression 表達式中算術(shù)運算符后面沒有操作數(shù)。
7? Missing END Statrment 匯編的源程序結(jié)尾未發(fā)現(xiàn)END語句。
8? Multiply Defined Label 源程序中定義了兩個標(biāo)號。
9? Unbalanced Parentheses 表達式中多余或缺少括號。
10 Undefined Symbol 語句中的符號名可能拼錯或未被定義。
11 Unrecognized Statemen or Undefined Argument 未定義參數(shù)的指令或代碼。
12 Value Out of Range 有一個非法的值來說明一個有著可能值限制的語句。??
評論