51 條彙編指令
地址
21點
22小時
23點
24小時
25小時
26點
27點
28點
29點
2AH
2BH
從圖中可以看出,每個中斷程序的代碼都位於其指定的地址處。一旦中斷發生,就可以執行相應的程序。至於圖中未填充的部分(如02H),根據每個程序員的不同而不同,通常是FFH或00H。
2. 結束
END 語句標誌著源代碼的結束。當遇到END 語句時,彙編器停止運行。如果沒有END語句,程序集就會報錯。 END 語句有一個參數,可以是值0 或表達式。其格式為:
標簽: END 表達式
它的值是程序的地址,並作為特殊記錄寫入HEX文件中。如果省略該表達式,則其在HEX 文件中的值為0。
3. 均衡器
EQU和其他符號定義指令用於為程序中出現的一些符號賦值。這些符號名稱的要求與其他符號相同,即長度沒有限製,大小寫字母可以互換,並且必須以字母開頭。
由等效指令定義的符號是彙編符號表的一部分。等效指令有兩種形式。一種使用EQU,另一種使用字符“=”,即
符號名稱EQU 表達式
符號名=表達式
兩種形式的效果是相同的。符號名稱位於左側,其對應的值位於右側。值可以是參數、其他符號名稱或表達式。隻要兩次掃描找到表達式的值即可,否則引用符號名時會報錯。當表達式的值為字符串時,僅取最後兩個字符。如果字符串長度為1,則高位字節設置為0,並在程序列表中打印符號名稱的值。由等效指令定義的符號名稱不允許重複名稱。如果重新定義已定義的符號名稱,程序集將報告錯誤,並且符號名稱將按新定義的方式進行處理。程序中最好不要有重名。
示例:0469=ABC EQU 469H
0464=XYEQUABC-5
02F0=JK=752
第0754章
列表文件中最左邊的數字不是這些指令的地址,而是彙編後分配給符號名稱的值。第一個符號名稱ABC增加為469H,第二個XY賦給ABC-5,所以XY的值為469H-5=464H,JK的值為752(即2F0H),XYJK的值為XY+JK=464H +2F0H=754H
4. 設置
SET 指令與等效指令有些相似。它定義了整數類型的符號名稱。其格式為
符號名稱SET 表達式
SET偽指令和等效偽指令之間的唯一區別是SET偽指令定義的符號名稱可以在程序中定義多次而不會報告錯誤。
示例:002D=K57 SET 101101B
8707=K57套裝34567
5. 數據和字節
DATA和BYTE都是用來定義字節型存儲單元,並給字節型存儲單元賦予一個符號名稱,以便在程序中可以通過符號名稱來訪問該存儲單元,以幫助理解程序。
BYTE 和DATE 之間的區別類似於EQU 和SET。 BYTE 偽指令不能定義重複的名稱。
6. 字
WORD 偽指令與DATE 偽指令類似,不同之處在於WORD 偽指令以以下格式定義字類型符號名稱:
符號名稱WORD 表達式
0027=VAL31 字39
0021=PAR7字21H
一個字由2 個字節組成。當然,由於8051彙編語言集沒有字操作,所以程序執行時隻處理字節。 WROD 指令僅允許用戶定義被視為單詞的存儲位置。
7. 比特幣
BIT指令定義了子位類型的符號名稱,其格式為:
符號名稱BIT 表達式
這裏表達式的值是一個位地址,這個偽指令有助於符號化位地址。
例子:
002F=LOG3 位47
0014=Y731 位14H
8. 替代名稱
ALTNAME 指令為用戶提供了一種定義符號名稱來替換保留字的方法。之後,該名稱和替換的保留字都可以在程序中同等使用。任何保留名稱都可以替換。替換名稱指令的格式為:
ALTNAME 保留字,新名稱
例子:
0002=替代名稱R2 計數
013A EA MOV A,R2
013B E502 MOV A,計數
9.數據庫
DB偽指令用於定義一個連續的存儲區域,並為存儲區域中的存儲單元賦值。該偽指令的參數是存儲單元的值。表達式中的參數數量沒有限製。隻要源程序一行能容納這條偽指令,其格式為:
標簽: 數據庫表達式
隻要表達式不是字符串,每個表達式值都會分配一個字節。計算表達式值時,按16位處理,但結果隻取低8位。如果DB 指令中出現多個表達式,則必須用逗號分隔它們。
當表達式中有字符串時,使用單引號“'”作為分隔符。每個字符占用一個字節。字符串中每個字節不變地存儲,小寫字母不會轉換為大寫字母。
例如:
DB 00H 01H 03H 46H
DB“這是一個演示!”
10. 德國之聲
DW以字節為單位(十六位二進製)給存儲區域賦值。其格式為:
標簽:DW表達式
例如:
0000 3035 D46B DW 12341,54379,10110100101110B
0004 2D2E
0006 4344 4243 DW 'ABCD','BC','A'
000A 0041
000C 2868 02E8 DW 456*375h,83+295h,'YZ',72h-456
0010 595A 有限元分析法
11. DS
DS是定義存儲內容的指令。用它來定義一個存儲區域,並用指定的參數填充存儲區域。
DS 偽指令包含兩個參數。第一個參數定義存儲區域的長度(以字節為單位)。在彙編過程中,彙編器將跳過這些單元並在這些字節之後彙編其他指令。因此,當使用DS 偽指令處於活動狀態時,第一個參數被禁用,第二個參數指示在這些單元中輸入什麼值。當啟用第二個參數時,將不會處理這些字節。下麵的例子中,0173處有一個DS 9,所以空出9個字節,下一條指令彙編到017C; 017C處空出1BH單元,這些字節用27H填充。
DS指令的格式如下:
標簽:DS表達式1、表達式2
表達式1定義了存儲區域的長度(以字節為單位)。這個論點不能省略。表達式2是可選的,其值的低8位用於填充定義的存儲區域。
如果省略,則這部分存儲單元將不被處理。
例子:
0000 04 公司A
0001 DS 9
000A 04 公司A
000B DS 1BH,27H
0026 04 公司
12. 包括
INCLUDE指令用於鏈接源文件,即將一個源文件插入到另一個源文件中。它有一個參數指示要插入的文件名,可以包括驅動器名和路徑名。如果文件沒有擴展名,則默認為ASM。但要插入的文件必須打開。如果文件打開操作失敗,則會發生致命錯誤,程序集將停止運行。相反,彙編器讀取文件的內容並將其作為源代碼進行處理。當遇到文件結束符時,彙編器返回到INCLUDE 指令繼續處理源程序。插入的文件在程序列表中以“I”開頭。
該宏彙編版本支持級別嵌套。您可以使用INCLUDE 指令在程序中插入任意數量的文件。不過,一般來說,DOS允許打開的文件數量是有限的。如果用戶需要打開更多的文件,他必須在CONFIG中。將FILES=40或更多值添加到SYS文件中。如果嵌套超過8 層或打開的文件過多,則會發生致命錯誤,程序集將停止運行。
INCLUDE 指令提供了一種模塊化編程的方法。當彙編器處理主程序時,模塊被插入。雖然這並不等同於鏈接和組裝可重定位目標模塊,但它具有與插入源類似的功能。該文件不應包含END指令,否則,程序集將提前停止運行,並且END指令隻能出現在主程序中。另外,在彙編主程序之前,必須先彙編所有附加的源文件,生成相應的HEX和LST文件。由於附加文件沒有END指令,因此在彙編附加文件時,彙編器會顯示:“No end statements”錯誤,但不影響與主程序的鏈接。
以下是使用INCLUDE 偽指令的示例。主程序的源文件是MAIN。 ASM 是:
;主.ASM
組織27H
啟動:
CLR A
MOV R3,A
包括MOD1
INC R5
包含MOD2.ASM
十月R3
結束開始
主程序是一個帶有END指令的完整源文件。程序中有兩個INCLUDE指令,分別添加兩個附加文件MOD1. ASM 和MOD2。 ASM 鏈接到主程序。下麵是兩個文件。
;MOD1.ASM
莫夫R2,#31H
莫夫R5,#18H
;MOD2.ASM
莫夫R6,#47H
ANL A,#07H
MOV R1,A
注意MOD1。 ASM 和MOD2。 ASM 沒有END 指令。
彙編時必須先編譯MOD1。 ASM 和MOD2。 ASM 彙編,然後彙編MAIN。 ASM,由於最後兩個文件沒有END偽指令,所以彙編時會出現錯誤信息。忽略它並繼續以下工作以獲得正確的結果。
以下是生成的列表文件:
Cybernetic Micro Systems 8051 係列彙編器,版本3.03 第1 頁
;MOD2.ASM
莫夫R6,#47H
ANL A,#07H
MOV R1,A
96年8月27日
;主.ASM
0027 組織27H
啟動:
0027 E4 CLR A
第0028章
我包括MOD1
我;MOD1.ASM
I0029 7A31 MOV R2,#31H
I002B 7D18 MOV R5,#18H
我
002D 0D INC R5
我包括MOD2.ASM
我;MOD2.ASM
I002E 7E47 MOV R6,#47H
I0030 5407 ANL A,#07H
I0032 F9 MOV R1,A
第0033章1B十月R3
0027 結束開始
Cybernetic Micro Systems 8051 係列彙編器,版本3.03 第2 頁
96年8月27日
;%T 符號名稱類型值
開始。 。 0027號
;%Z
00 錯誤(0000)
十三、標題
TITLE 指令用於在列表文件的標題處創建標題。其格式為:
$TITLE 標題行
這裏的標量線是出現在頁麵頭部的標量,與通常的字符串定義不同。這裏標量行沒有被引用。程序集從$TITLE 之後的第一個可打印字符開始,回車符之間的字符串用作標量。標量的最大長度為60 個字符。如果省略基本標量行,則標題行將為空行。如果TITLE 指令位於頁麵上,則它所描述的標量行包含在該頁麵中;否則,標題將出現在下一頁的頁眉中。
14. 頁麵
PAGE 指令用於形成一個新的指令來定義一側的行數。其格式為:
$PAGE表達式
如果表達式是默認的,將開始一個新頁麵。如果有表達式,每頁的行數將被重新定義。編譯開始時,頁長為66行。除輸出頁外,一頁上剩餘的55行用於打印源程序。此格式適用於標準打印紙。
如果參數值小於66,頁麵上可打印的源代碼行數將相應減少。最小頁長為12。如果小於12,則每頁隻打印一行源程序。
頁長度變量是一個16 位字節,因此每個頁最多可以定義65535 行。此時,分頁打印變為連續打印。當在屏幕上顯示程序列表或在卷紙上打印程序列表時,經常使用連續打印。如果開始彙編時使用/N選項,則頁長為65535。
15.列表和NOLIST
它們的格式是:
$列表
$NOLIST
LIST偽指令導致在彙編時生成程序列表,但即使不使用該指令,彙編也會自動生成列表。但是,如果在使用NOLIST 指令後需要繼續主列表,則必須使用LIST 指令。
NOLIST指令導致在彙編期間不生成列表,並且包含該指令以及遵循該指令的所有語句都不會被輸入到列表文件中。當不需要任何列表文件並且不需要顯示程序列表時,在開始彙編時可以不添加。 l 附加項,並在源代碼第一行添加NOLIST指令。
使用NOLIST指令和附加項/L的區別在於NOLIST指令可以添加到源程序中並與LIST指令配合使用,以防止源程序的某些部分生成列表。如果沒有附加項/L,將不會生成程序列表。然而,無論是否存在$NOLIST指令,程序彙編過程中檢測到的錯誤都會在屏幕上顯示錯誤的源代碼行和錯誤消息。
16.無代碼
其格式為$NOCODE
NOCODE 偽指令導致條件彙編器結構在彙編期間不生成真值為假的條件列表。下麵介紹條件裝配結構。如果沒有此指令,程序集將生成所有條件的列表,無論它們的真值是否為true。但如果條件為假,則不會生成目標代碼。 NOCODE 指令使彙編列表僅列出彙編器使用的那些部件。因此,當使用NOCODE指令時,程序列表和源程序並不逐行對應。