新聞中心

51單片機匯編偽指令

作者: 時間:2016-11-22 來源:網(wǎng)絡(luò) 收藏
0、 ALTNAME

功能:這一偽指令用來自定義名字,以替換源程序中原來的保留字,替換的保留字均可等效地用于子程序中。

本文引用地址:http://m.butianyuan.cn/article/201611/319696.htm

格式:ALTNAME保留字自定義名

注意:自定義名與保留字之間首字符必須相同。

1、BIT

功能:指令用于將一個位地址賦給指定的符號名。

指令格式:符號名 BIT 位地址經(jīng)BIT 指令定義過的位符號名不能更改。

例如:X_ON BIT 60H ;定義一個絕對位地址

X_OFF BIT 24h.2 ;定義一個絕對位地址
BIT---定義位命令

格式: 字符名稱 BIT位地址

功能用于給字符名稱定義位地址。

SPK BIT P3.7 經(jīng)定義后,允許在指令中用SPK代替P3.7。

2、 BSEG
功能:絕對選擇指令指令BSEG選擇絕對位尋址數(shù)據(jù)段

指令格式如下:BSEG [AT 絕對地址表達(dá)式]

3、CODE

功能:用于將程序存儲器ROM 地址賦給指定的符號名。

指令格式:符號名 CODE 表達(dá)式

例如:RESET CODE 00H
4、CSEG
功能:絕對選擇指令CSEG選擇絕對代碼段;

指令格式如下:CSEG [AT 絕對地址表達(dá)式]

5、DATA(BYTE)

功能:指令用于將一個內(nèi)部RAM 的地址賦給指定的符號名

指令格式:符號名 DATA 表達(dá)式

數(shù)值表達(dá)式的值應(yīng)在0~255 之間,表達(dá)式必須是一個簡單再定位表達(dá)式。

例如:REGBUF DATA(BYTE) 40H

PORT0DATA(BYTE) 80H

DATA與BYTE的區(qū)別:

DATA與BYTE是相類似的偽指令。當(dāng)程序運行到DATA偽指令定義的符號名時,該符號名將被顯示;而由BYTE定義的符號名不被顯示。
6、DB
功能:DB偽指令用于定義一個連續(xù)的存儲區(qū),給該存儲區(qū)的存儲單元賦值。該偽指令的參數(shù)即為存儲單元的

值,在表達(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

DB This is a demo!

7、DBIT

功能:在內(nèi)部數(shù)據(jù)區(qū)的BIT 段以位為單位保留存儲空間。

指令格式:[標(biāo)號:] DBIT 數(shù)值表達(dá)式其操作類似于DB。
8、DS
功能:DS為定義存儲內(nèi)容的偽指令,用它定義一個存儲區(qū),并用指定的參數(shù)填滿該存儲區(qū)。DS偽指令包含兩

個變元,第一個變元定義了存儲區(qū)的長度的字節(jié)數(shù),在匯編時,匯編程序?qū)⑻^這些單元把其它指令匯編在

這些字節(jié)之后,因此在使用DS偽指令時第一個變元不可活力第二個變元表示在這些單元中真入什么值,第

二個變元可以活力活力時這些字節(jié)將不處理。下例中0173處有一條DS 9,則空出9個字節(jié),下一第指令被匯

編到017C處;在017C處空出1BH個單元,在這些字節(jié)中被27H所填充。DS指令的格式如下:

標(biāo)號: DS 表達(dá)式1,表達(dá)式2

表達(dá)式1定義了存儲區(qū)的長度(以字節(jié)為單位)。這個變元不能省略。表達(dá)式2是可選擇的,它的值低8位

用以填入所定義的存儲區(qū)。若省略則這部分存儲單元不處理。

例: 0000 04 INC A

0001 DS 9

000A 04 INC A

000B DS 1BH,27H

0026 04 INC A

DS ---預(yù)留存儲區(qū)命令

格式:〔標(biāo)號:〕 DS 表達(dá)式值
其功能是從指定地址開始,定義一個存儲區(qū),以備源程序使用。

存儲區(qū)預(yù)留的存儲單元數(shù)由表達(dá)式的值決定。

TMP: DS 1

從標(biāo)號TEP地址處開始保留1個存儲單元(字節(jié))。

9、DSEG
功能:絕對選擇指令DSEG內(nèi)部絕對數(shù)據(jù)段

指令格式如下:DSEG [AT 絕對地址表達(dá)式]

10、DW
功能:DW為以字節(jié)為單元(十六位二進制)來給一個的存儲區(qū)賦值,

其格式為: 標(biāo)號: DW 表達(dá)式
例如: 0000 3035 D46B DW 12341,54379,10110100101110B
11、END
功能:END語句標(biāo)志源代碼的結(jié)束,匯編程序遇到END語句即停止運行。若沒有END語句,匯編將報錯。END語

句有一個參數(shù),可以是數(shù)值0,也可以是表達(dá)式,

其格式是: 標(biāo)號: END 表達(dá)式

它的值就是程序的地址并且作為一個特殊的記錄寫入HEX文件。若這個表達(dá)式省略,HEX文件中其值就是0。

12、EQU(=)

存器名賦給一個指定符號名。

指令格式: 符號名 EQU(=)表達(dá)式 符號名 EQU(=) 寄存器名

經(jīng)過EQU 指令賦值的符號可在程序的其它地方使用,以代替其賦值。

例如:MAX EQU 2000

則在程序的其它地方出現(xiàn)MAX,就用2000 代替。

表達(dá)式必須是一個簡單再定位表達(dá)式。
用 EQU 指令賦值以后的字符名,可以用作數(shù)據(jù)地址、代碼地址、位地址或者直接當(dāng)做一個立即數(shù)使用。
13、EXTRN

EXTRN 是與PUBLIC 配套使用的,要調(diào)用其它模塊的函數(shù),就必須先在模塊前聲明。

指令格式:EXTRN 段類型(符號,符號······)

例如:EXTRN CODE (TONGXING,ZHUANHUAN)

調(diào)用外部TONGXING和ZHUANHUAN 程序。

14、IDATA

IDATA 指令用于將一個間接尋址的內(nèi)部RAM 地址賦給指定的符號名。

指令格式:符號名 IDATA 表達(dá)式

例如:FULLER IDATA 60H
15、IF

條件偽操作格式:

IF表達(dá)式

[程序塊1]

[ELSE]

[程序塊2]

ENDIF

當(dāng)IF指令中的表達(dá)式為真時,被匯編的代碼段是程序塊1;當(dāng)IF指令中的表達(dá)式為假時,被匯編的代碼段是

程序塊2。在一個條件結(jié)構(gòu)中,僅有一個代碼段被匯編,其它的則被忽略。

16、INCLUDE

功能:利用此偽指令可將一個源文件插入到當(dāng)前源文件中一起匯編,最終成為一個完整的源程序。

格式:INCLUDE[驅(qū)動器名:][路徑名]文件名

注意:1、文件名中若沒有擴展名,則系統(tǒng)默認(rèn)是。ASM(該文件必須是能打開的)。

2、被插入的源程序中不能包含END偽指令,否則匯編會停止運行。被鏈接文件的每一行,

在程序清單中以“I“開頭。

3、鏈接偽指令可有8級嵌套,若要求嵌套的多,則要修改DOS中的CONFIG。SYS文件的FILES參 數(shù)。

17、ISEG

功能:絕對選擇指令I(lǐng)SEG內(nèi)部間接尋址絕對數(shù)據(jù)段idata

指令格式如下:ISEG [AT 絕對地址表達(dá)式]
18、MACRO

宏指令格式

[宏指令名]MACRO[形式參數(shù),。。。]

代碼段

ENDM

宏調(diào)用格式

[宏指令名][實在參數(shù),。。。]
19、LIST
它們的格式為:

$LIST
功能:LIST偽指令使匯編時主生程序清單,但即使不用該指令,匯編也會自動產(chǎn)生清單。但如果使用了NOLIST偽指令后需要繼續(xù)主生清單則必須使用LIST偽指令。
20、NAME

功能:用來給當(dāng)前模塊命名。

指令格式:NAME 模塊名

例如:NAME TIMER

定義一個模塊名為TIMER 的模塊。
21、NOCODE

其格式為$NOCODE

NOCODE偽指令使得在匯編時,條件匯編程序結(jié)構(gòu)中那些真值為假的條件不產(chǎn)生清單。有關(guān)條件匯編結(jié)構(gòu)在下

面介紹。如果沒有這條偽指令,匯編將主生所有條件下的清單,不論其真值是否為真。但是假的條件,不產(chǎn)

生目標(biāo)碼。而NOCODE偽指令使匯編清單中只列出那些由匯編程序用到的部分,因此,當(dāng)使用NOCODE偽指令

時,程序清單與源程序并非逐行對應(yīng)。
22、NOLIST

它們的格式為:
$NOLIST

功能:NOLIST偽指令使匯編時不產(chǎn)生清單,所有包含此偽指令及在這條偽指令之后的語句都不進入列表文

件。當(dāng)不需要任何列表文件,并且不需要顯示程序清單時,可以在啟動匯編時不加.L附加項,且在源代碼

的第一行加上NOLIST指令。使用NOLIST偽指令與附加項/L不同之處是NOLIST偽指令可加在源程序中,與LIST

偽指令配合使用,使源程序中某些部分不產(chǎn)生清單。而不加附加項/L則不產(chǎn)生任何程序清單。不過,不管有

無$NOLIST偽指令,程序在匯編時檢查到的錯誤都將在屏幕上顯示出錯的源代碼行及錯誤信息
23、PAGE
功能: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。
24、PUBLIC

功能:聲明可被其它模塊使用的公共函數(shù)名。

指令格式:PUBLIC 符號 [,符號,符號[,······]]

PUBLIC 后可跟多個函數(shù)名,用逗號格開。每個函數(shù)名都必須是在模塊內(nèi)定義過的。

例如:PUBLIC INTER,_OUTER

其中_OUTER 可供C 調(diào)用。
25、RSEG

功能:再定位段選擇指令為RSEG,用于選擇一個已在前面定義過的再定義段作為當(dāng)前段,

指令格式:RSEG 段名

段名必須是在前面聲明過的再定位段。

例如:

DATAS SEGMENT DATA :聲明一個再定位DATA 段

CODES SEGMENT CODE ;聲明一個再定位CODE 段

BSEG AT 60H RSEG CODES ;選擇前面聲明的再定位CODE 段作為當(dāng)前段。


絕對段選擇指令
CSEG---絕對代碼段
DSEG---內(nèi)部絕對數(shù)據(jù)段
XSEG---外部絕對數(shù)據(jù)段
ISEG ---內(nèi)部間接尋址數(shù)據(jù)段
BSEG---絕對位尋址數(shù)據(jù)段
格式:
CSEG[AT 絕對地址表達(dá)式]
DSEG[AT 絕對地址表達(dá)式]
XSEG[AT 絕對地址表達(dá)式]
ISEG [AT 絕對地址表達(dá)式]
BSEG[AT 絕對地址表達(dá)式]


括號內(nèi)是可選項,用來指定當(dāng)前絕對段的基地址。 CSEG AT 0000H AJMPMAIN

26、SEGMENT

功能:SEGMENT 指令用來聲明一個再定位段和一個可選的再定位類型。

指令格式:再定位段型 SEGMENT 段類型(再定位類型) 段類型用于指定所聲明的段將處的儲存器地址空間,可用的段類型有CODE/XDATA/DATA/IDATA 和BIT。

例如: FLAG SEGMENT BIT PONITER SEGMENT IDATA

27、SET

功能:SET 指令類似于EQU 指令,不同的是SET 指令定義過的符號可重定義。

指令格式:符號名 SET 表達(dá)式 符號名 SET 寄存器名

例如:MAX SET 2000 MAX SET 3000
28、TTILE
功能:TITLE偽指令用于在列表文件頁頭建立一個標(biāo)題,其格式為: $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)在下頁頁頭。

29、XDATA

功能:XDATA 指令用于將一個外部RAM 的地址賦給指定的符號名。 指令格式:符號名 XDATA 表達(dá)式

例如:RSEG XSEG1 ;選擇一個外部數(shù)據(jù)段 ORG 100H

MING DS 10 ;在標(biāo)號MING 處保留10 個字節(jié) HOUR XDATA MING+5

MUNIT XDATA HOUR+5

30、XSEG

功能:絕對選擇指令XSEG外部絕對數(shù)據(jù)段xdata 指令格式如下:

XSEG [AT 絕對地址表達(dá)式]
31、USING指令

USING指令通知匯編器使用8051的哪一個工作寄存器組。
格式:USING表達(dá)式(值必須為0-3,默認(rèn)值為0。)
USING0 使用第0組工作寄存器。
32、ORG指令

ORG指令用來改變匯編器的計數(shù)器,從而設(shè)定一個新的程序起始地址。
格式:ORG表達(dá)式 表達(dá)式必須是絕對或簡單再定位表達(dá)式。
ORG0000H AJMPMAIN 設(shè)定 MAIN 程序的起始地址為 0000H。
數(shù)據(jù)定義偽操作格式:

[ 標(biāo)號: ] 數(shù)據(jù)定義名[ 表達(dá)式1,表達(dá)式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

數(shù)據(jù)段DSEG

外部段XSEG

功能段FSEG

段BSEG


說明: (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é)包含的值 表達(dá)式不是字符串時,每個表達(dá)式賦給一個字節(jié),是字符串時,用單引號 “ “作為分隔符。

DW 用于定義一個字(16位) 每個表達(dá)式占16位。如果表達(dá)式中的存貯內(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)題不加 ““,其最大長度60字符。若副標(biāo)題行省略,

格式: $SUBTTL [副標(biāo)題行] 原來定義的副標(biāo)題行作廢。

$PAGE 用于形成或定義新的一頁或行數(shù) 匯編時頁長為66行(適合于格式: $PAGE [表達(dá)式] 標(biāo)準(zhǔn)打印紙) 。表達(dá)式最大為65535,最小為12, 表達(dá)式缺省,則從新的一頁開始。

$LIST 使源程序匯編時,產(chǎn)生程序清單 匯編時無此指令照樣產(chǎn)生清單。 格式: $LIST

$NOLIST 使源程序匯編時不產(chǎn)生程序清單 格式: $NOLIST

$NOCODE 源程序匯編時,條件匯編程序值 沒有此指令匯編時,不論其值是為假的不產(chǎn)生清單。真、假的條件都不產(chǎn)生目標(biāo)碼。 格式: $NOCODE

如果在匯編中沒有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 DPTR , #TABLE
MOV A , #4
MOVC A , @A+DPTR
CLR P0.0
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 DPTR , #TABLE
MOV A , #4
MOVC A , @A+DPTR
CLR P0.0
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.INC

LOOKUPTABLE SETMENT CODE
RSEG LOOKUPTABLE

TABLE: DB 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H

ASM_TEST.ASM

NAME ASMTEST
$include(LOOKUPTABLE.INC)

?PR?TSEG?ASM_TEST SEGMENT CODE
PUBLIC ASM_LOOKUP_ROUTINE

RSEG ?PR?TSEG?ASM_TEST
using 0

ASM_LOOKUP_ROUTINE:

MOV DPTR, #TABLE ; DPTR指向查表的起始位置
MOV A, #4 ; A是從查表的起始位置的偏移量
MOVC A, @A + DPTR ; 把第A+1項送到累加器中

RET
END

TEST.C

extern void ASM_LOOKUP_ROUTINE(void);
void main(void)
{
ASM_LOOKUP_ROUTINE(); // 調(diào)用查表子程序

while(1);
}




關(guān)鍵詞: 51單片機匯編偽指

評論


技術(shù)專區(qū)

關(guān)閉