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