51單片機匯編偽指令
功能:
格式:
注意:
1、BIT
功能:指令用于將一個位地址賦給指定的符號名。
指令格式:符號名 BIT 位地址經(jīng)BIT 指令定義過的位符號名不能更改。
例如:X_ON
格式:
功能用于給字符名稱定義位地址。
SPK
2、 BSEG
指令格式如下:BSEG [AT 絕對地址表達(dá)式]
3、CODE
功能:用于將程序存儲器ROM 地址賦給指定的符號名。
指令格式:符號名
例如:RESET
指令格式如下:CSEG [AT 絕對地址表達(dá)式]
5、DATA(BYTE)
功能:指令用于將一個內(nèi)部RAM 的地址賦給指定的符號名
指令格式:符號名 DATA
數(shù)值表達(dá)式的值應(yīng)在0~255 之間,表達(dá)式必須是一個簡單再定位表達(dá)式。
例如:REGBUF
DATA與BYTE的區(qū)別:
DATA與BYTE是相類似的偽指令。
值,在表達(dá)式中對變元個數(shù)沒有限制,只要此條偽指令能容納在源程序的一行內(nèi),其格式為:標(biāo)號: DB 表
達(dá)式只要表達(dá)式不是字符串,每一表達(dá)式值都被賦給一個字節(jié)。計算表達(dá)式值時按16位處理,但其結(jié)果只取
低8位,若多個表達(dá)式出現(xiàn)在一個DB偽指令中,它們必須以逗號分開。表達(dá)式中有字符串時,以單引號“”
作分隔符,每個字符占一個字節(jié),字符串不加改變地被存在各字節(jié)中,并不將小寫字母轉(zhuǎn)換成大寫字母。
例如:DB 00H 01H 03H 46H
7、DBIT
功能:在內(nèi)部數(shù)據(jù)區(qū)的BIT 段以位為單位保留存儲空間。
指令格式:[標(biāo)號:] DBIT 數(shù)值表達(dá)式其操作類似于DB。
個變元,第一個變元定義了存儲區(qū)的長度的字節(jié)數(shù),在匯編時,匯編程序?qū)⑻^這些單元把其它指令匯編在
這些字節(jié)之后,因此在使用DS偽指令時第一個變元不可活力第二個變元表示在這些單元中真入什么值,第
二個變元可以活力活力時這些字節(jié)將不處理。下例中0173處有一條DS 9,則空出9個字節(jié),下一第指令被匯
編到017C處;在017C處空出1BH個單元,在這些字節(jié)中被27H所填充。DS指令的格式如下:
表達(dá)式1定義了存儲區(qū)的長度(以字節(jié)為單位)。這個變元不能省略。表達(dá)式2是可選擇的,它的值低8位
用以填入所定義的存儲區(qū)。若省略則這部分存儲單元不處理。
例: 0000 04 INC A
DS ---預(yù)留存儲區(qū)命令
格式:
存儲區(qū)預(yù)留的存儲單元數(shù)由表達(dá)式的值決定。
TMP:
從標(biāo)號TEP地址處開始保留1個存儲單元(字節(jié))。
9、DSEG
指令格式如下:DSEG [AT 絕對地址表達(dá)式]
10、DW
其格式為:
句有一個參數(shù),可以是數(shù)值0,也可以是表達(dá)式,
其格式是: 標(biāo)號: END 表達(dá)式
它的值就是程序的地址并且作為一個特殊的記錄寫入HEX文件。若這個表達(dá)式省略,HEX文件中其值就是0。
12、EQU(=)
存器名賦給一個指定符號名。
指令格式:
經(jīng)過EQU 指令賦值的符號可在程序的其它地方使用,以代替其賦值。
例如:MAX EQU 2000
則在程序的其它地方出現(xiàn)MAX,就用2000 代替。
表達(dá)式必須是一個簡單再定位表達(dá)式。
EXTRN 是與PUBLIC 配套使用的,要調(diào)用其它模塊的函數(shù),就必須先在模塊前聲明。
指令格式:EXTRN 段類型(符號,符號······)
例如:EXTRN
調(diào)用外部TONGXING和ZHUANHUAN 程序。
14、IDATA
IDATA 指令用于將一個間接尋址的內(nèi)部RAM 地址賦給指定的符號名。
指令格式:符號名
例如:FULLER
條件偽操作格式:
當(dāng)IF指令中的表達(dá)式為真時,被匯編的代碼段是程序塊1;當(dāng)IF指令中的表達(dá)式為假時,被匯編的代碼段是
程序塊2。
16、INCLUDE
功能:
格式:
注意:1、文件名中若沒有擴展名,則系統(tǒng)默認(rèn)是。ASM(該文件必須是能打開的)。
17、ISEG
功能:絕對選擇指令I(lǐng)SEG內(nèi)部間接尋址絕對數(shù)據(jù)段idata
指令格式如下:ISEG [AT 絕對地址表達(dá)式]
宏指令格式
代碼段
宏調(diào)用格式
它們的格式為:
功能:LIST偽指令使匯編時主生程序清單,但即使不用該指令,匯編也會自動產(chǎn)生清單。但如果使用了NOLIST偽指令后需要繼續(xù)主生清單則必須使用LIST偽指令。
功能:用來給當(dāng)前模塊命名。
指令格式:NAME 模塊名
例如:NAME TIMER
定義一個模塊名為TIMER 的模塊。
其格式為$NOCODE
NOCODE偽指令使得在匯編時,條件匯編程序結(jié)構(gòu)中那些真值為假的條件不產(chǎn)生清單。有關(guān)條件匯編結(jié)構(gòu)在下
面介紹。如果沒有這條偽指令,匯編將主生所有條件下的清單,不論其真值是否為真。但是假的條件,不產(chǎn)
生目標(biāo)碼。而NOCODE偽指令使匯編清單中只列出那些由匯編程序用到的部分,因此,當(dāng)使用NOCODE偽指令
時,程序清單與源程序并非逐行對應(yīng)。
它們的格式為:
功能:NOLIST偽指令使匯編時不產(chǎn)生清單,所有包含此偽指令及在這條偽指令之后的語句都不進入列表文
件。當(dāng)不需要任何列表文件,并且不需要顯示程序清單時,可以在啟動匯編時不加.L附加項,且在源代碼
的第一行加上NOLIST指令。使用NOLIST偽指令與附加項/L不同之處是NOLIST偽指令可加在源程序中,與LIST
偽指令配合使用,使源程序中某些部分不產(chǎn)生清單。而不加附加項/L則不產(chǎn)生任何程序清單。不過,不管有
無$NOLIST偽指令,程序在匯編時檢查到的錯誤都將在屏幕上顯示出錯的源代碼行及錯誤信息
功能:PAGE偽指令用于形成新的一中定義一面的行數(shù)。其格式為:$PAGE 表達(dá)式
若表達(dá)式缺省則開始新的一頁,若有表達(dá)式,則每頁行數(shù)重新定義。匯編開始時頁長為66行。一頁中除出頁外,剩余55行用于打印源程序,這一格式適用于標(biāo)準(zhǔn)打印紙。如果變元值小于66,頁內(nèi)可打印的源代碼行將相應(yīng)減少。頁長最小值為12。若小于12時,每頁內(nèi)除頁上只打印一行源程序。頁長變元是16位字節(jié),因而每頁最長可定義到65535行,這時分頁打印變?yōu)檫B續(xù)打印,在屏幕顯示程序清單或在卷筒紙上打印程序清單時,常常使用連續(xù)打印,如果在啟動匯編時用/N選項,頁長就是65535。
功能:聲明可被其它模塊使用的公共函數(shù)名。
指令格式:PUBLIC 符號 [,符號,符號[,······]]
PUBLIC 后可跟多個函數(shù)名,用逗號格開。每個函數(shù)名都必須是在模塊內(nèi)定義過的。
例如:PUBLIC
其中_OUTER 可供C 調(diào)用。
功能:再定位段選擇指令為RSEG,用于選擇一個已在前面定義過的再定義段作為當(dāng)前段,
指令格式:RSEG 段名
段名必須是在前面聲明過的再定位段。
例如:
DATAS SEGMENT DATA :聲明一個再定位DATA 段
CODES SEGMENT CODE ;聲明一個再定位CODE 段
BSEG AT 60H
絕對段選擇指令
CSEG---絕對代碼段
DSEG---內(nèi)部絕對數(shù)據(jù)段
XSEG---外部絕對數(shù)據(jù)段
ISEG ---內(nèi)部間接尋址數(shù)據(jù)段
BSEG---絕對位尋址數(shù)據(jù)段
格式:
CSEG
DSEG
XSEG
ISEG
BSEG
括號內(nèi)是可選項,用來指定當(dāng)前絕對段的基地址。
功能:SEGMENT 指令用來聲明一個再定位段和一個可選的再定位類型。
指令格式:再定位段型
例如:
功能:SET 指令類似于EQU 指令,不同的是SET 指令定義過的符號可重定義。
指令格式:符號名 SET 表達(dá)式
例如:MAX SET 2000
功能:TITLE偽指令用于在列表文件頁頭建立一個標(biāo)題,其格式為:
這里標(biāo)量行就是將出現(xiàn)在頁頭的標(biāo)量與通常的字符串定義不同。這里標(biāo)量行不加引號。匯編從$TITLE 之后的第一個可打印字符開始,到回車符之間的字符串作為標(biāo)量標(biāo)量的最大長度是60個字符,基標(biāo)量行省略,則標(biāo)題行為空行。若TITLE偽指令在一頁,它說明的標(biāo)量行包含在本頁,否則,標(biāo)題將出現(xiàn)在下頁頁頭。
功能:XDATA 指令用于將一個外部RAM 的地址賦給指定的符號名。
例如:RSEG XSEG1 ;選擇一個外部數(shù)據(jù)段
MING DS 10 ;在標(biāo)號MING 處保留10 個字節(jié)
MUNIT XDATA HOUR+5
功能:絕對選擇指令XSEG外部絕對數(shù)據(jù)段xdata
XSEG [AT 絕對地址表達(dá)式]
USING指令通知匯編器使用8051的哪一個工作寄存器組。
格式:
USING
ORG指令用來改變匯編器的計數(shù)器,從而設(shè)定一個新的程序起始地址。
格式:
ORG
數(shù)據(jù)定義偽操作格式:
代碼段(CSEG)
數(shù)據(jù)段(DESG)
外部段(XSEG)
功能段(FSEG)
位
表-8
如果在匯編中沒有REG52。INC的包含文件,以下的程序出錯:
NAME ASMTEST
$include(LOOKUPTABLE.INC)
;$include(REG52.INC)
?PR?TSEG?ASM_TEST SEGMENT CODE
PUBLIC ASM_LOOKUP_ROUTINE
RSEG ?PR?TSEG?ASM_TEST
using 0
ASM_LOOKUP_ROUTINE:
MOV
MOV
MOVC A , @A+DPTR
CLR
RET
END
錯誤提示是:ASM_TEST.ASM(15): error A45: UNDEFINED SYMBOL
在匯編程序中包含文件的定義
NAME ASMTEST
$include(LOOKUPTABLE.INC)
$include(REG52.INC)
?PR?TSEG?ASM_TEST SEGMENT CODE
PUBLIC ASM_LOOKUP_ROUTINE
RSEG ?PR?TSEG?ASM_TEST
using 0
ASM_LOOKUP_ROUTINE:
MOV
MOV
MOVC A , @A+DPTR
CLR
RET
END
如果兩個include沒有空行,會出現(xiàn)以下的錯誤提示:
assembling ASM_TEST.ASM...
ASM_TEST.ASM(3): error A34: , EXPECTED
ASM_TEST.ASM(3): error A34: , EXPECTED
ASM_TEST.ASM(3): error A34: , EXPECTED
ASM_TEST.ASM(3): error A9: SYNTAX ERROR
ASM_TEST.ASM(3): error A34: , EXPECTED
ASM_TEST.ASM(14): error A45: UNDEFINED SYMBOL
ASM_TEST.ASM - 6 Error(s), 0 Warning(s).
從C中訪問位于匯編函數(shù)中的表格
TEST.C: 包含調(diào)用匯編函數(shù)的C程序。
ASM_TEST.ASM: 包含使用查表的匯編函數(shù)。
LOOKUPTABLE.INC: 包含查表。
每個文件的內(nèi)容如下面所示。為了將查表定義在一個固定的地址0x1000,打開工程-選項(Project-Options),選擇Target-BL51 Locate。在代碼段(Code Segment)字段中輸入段名(起始地址)。例如在本例中,你應(yīng)該輸入LOOKUPTABLE(0x1000)。對于你的程序,你可能需要從MAP文件(*.M51)中查找段名。
LOOKUPTABLE SETMENT CODE
RSEG LOOKUPTABLE
TABLE: DB 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H
NAME ASMTEST
$include(LOOKUPTABLE.INC)
?PR?TSEG?ASM_TEST SEGMENT CODE
PUBLIC ASM_LOOKUP_ROUTINE
RSEG ?PR?TSEG?ASM_TEST
using
ASM_LOOKUP_ROUTINE:
extern void ASM_LOOKUP_ROUTINE(void);
void main(void)
{
}
評論