第5章 匯編語言C語言混合編程_第1頁
第5章 匯編語言C語言混合編程_第2頁
第5章 匯編語言C語言混合編程_第3頁
第5章 匯編語言C語言混合編程_第4頁
第5章 匯編語言C語言混合編程_第5頁
已閱讀5頁,還剩187頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第第5章章 匯編語言程序設(shè)計匯編語言程序設(shè)計第5章 匯編語言程序設(shè)計n5.1匯編語言概述n5.2 偽操作n5.3 分支、循環(huán)、子程序n5.4 匯編語言上機環(huán)境n5.5 匯編語言C語言混合編程5.1 匯編語言概述 匯編語言:匯編語言:CPU提供的二進制機器指令的助記符的集合。提供的二進制機器指令的助記符的集合。匯編編譯器:把匯編語言源文件匯編成機器可執(zhí)行的二進匯編編譯器:把匯編語言源文件匯編成機器可執(zhí)行的二進制機器語言。制機器語言。特點:程序執(zhí)行速度快,程序代碼生成量少。特點:程序執(zhí)行速度快,程序代碼生成量少。缺點:不易學(xué)習的編程語言,可讀性較差,屬于低級語言缺點:不易學(xué)習的編程語言,可讀性較差

2、,屬于低級語言,需要對硬件有深刻的了解。,需要對硬件有深刻的了解。匯編語言概述一般用匯編語言編寫驅(qū)動程序、需要嚴格計算執(zhí)行時間的一般用匯編語言編寫驅(qū)動程序、需要嚴格計算執(zhí)行時間的程序以及需要加速執(zhí)行的程序。程序以及需要加速執(zhí)行的程序。設(shè)計匯編程序除了直接使用匯編指令,還需使用偽操作、設(shè)計匯編程序除了直接使用匯編指令,還需使用偽操作、偽指令等輔助進行程序設(shè)計。偽指令等輔助進行程序設(shè)計。偽操作:是一些特殊的指令助記符偽操作:是一些特殊的指令助記符, 只在匯編過程中起作只在匯編過程中起作用用,一旦匯編結(jié)束一旦匯編結(jié)束,偽操作的使命也就完成,不被匯編成機偽操作的使命也就完成,不被匯編成機器代碼。器代碼

3、。 如:數(shù)據(jù)定義、分配存儲區(qū)、指示程序結(jié)束等。如:數(shù)據(jù)定義、分配存儲區(qū)、指示程序結(jié)束等。偽指令:不是真正的機器指令,編譯器對源程序進行匯編偽指令:不是真正的機器指令,編譯器對源程序進行匯編處理時將被替換成相應(yīng)的匯編指令。處理時將被替換成相應(yīng)的匯編指令。本章介紹本章介紹ARM匯編器常用的偽操作、偽指令。匯編器常用的偽操作、偽指令。匯編語言概述 匯編語言基本語法:匯編語言基本語法:標號標號 操作碼操作碼 操作數(shù)操作數(shù)1, 操作數(shù)操作數(shù)2, ;注釋注釋標號標號 :如有必須頂格寫:如有必須頂格寫, 代表地址,代表地址,讓匯編器來計算程序轉(zhuǎn)移讓匯編器來計算程序轉(zhuǎn)移的地址的地址; 操作碼:指令操作碼:指令

4、|偽操作偽操作|偽指令偽指令 :前面至少有一個空格;:前面至少有一個空格;操作數(shù):可以是變量、常量、指令地址、數(shù)據(jù)地址,而操作數(shù)操作數(shù):可以是變量、常量、指令地址、數(shù)據(jù)地址,而操作數(shù)1通常是本指令的執(zhí)行結(jié)果存儲處。通常是本指令的執(zhí)行結(jié)果存儲處。ARM匯編語言程序的每行語句由匯編語言程序的每行語句由14個部分組成。格式如下:個部分組成。格式如下: LABEL OPERATION OPERAND ;COMMENT 標號域標號域 操作助記符域操作助記符域 操作數(shù)域操作數(shù)域 注釋域注釋域 (1)標號域標號域(Label) 標號域用來表示指令的地址、變量、過程名、數(shù)據(jù)的地址和常量。標號域用來表示指令的地

5、址、變量、過程名、數(shù)據(jù)的地址和常量。 標號是一個自行設(shè)計的標識符或名稱,語句標號可以是大小寫字母標號是一個自行設(shè)計的標識符或名稱,語句標號可以是大小寫字母混合,通常以字母開頭,由字母、數(shù)字、下劃線等組成?;旌?,通常以字母開頭,由字母、數(shù)字、下劃線等組成。 語句標號不能與寄存器名、指令助記符、偽指令語句標號不能與寄存器名、指令助記符、偽指令(操作操作)助記符、變助記符、變量名同名。量名同名。語句標號必須在一行的開頭書寫,不能留空格。語句標號必須在一行的開頭書寫,不能留空格。匯編語言概述 (2)操作助記符域操作助記符域(OPERATION) 操作助記符域可以為指令、偽操作、宏指令或偽指令的助記符。

6、操作助記符域可以為指令、偽操作、宏指令或偽指令的助記符。 ARM匯編器對大小寫敏感,在匯編語言程序設(shè)計中,每一條指匯編器對大小寫敏感,在匯編語言程序設(shè)計中,每一條指令的助記符可以全部用大寫、或全部用小寫,但不允許在一條令的助記符可以全部用大寫、或全部用小寫,但不允許在一條指令中大、小寫混用。指令中大、小寫混用。 所有的指令都不能在行的開頭書寫,必須在指令的前面有空格,所有的指令都不能在行的開頭書寫,必須在指令的前面有空格,然后再書寫指令。然后再書寫指令。 指令助記符和后面的操作數(shù)或操作寄存器之間必須有空格,不可指令助記符和后面的操作數(shù)或操作寄存器之間必須有空格,不可以在這之間使用逗號。以在這之

7、間使用逗號。偽操作是偽操作是ARM匯編語言程序里的一些特殊助記符,其作用匯編語言程序里的一些特殊助記符,其作用 主要是為完成匯編程序做的各種準備工作,在源程序進行主要是為完成匯編程序做的各種準備工作,在源程序進行 匯編時由匯編程序處理,而不是程序運行期間由機器執(zhí)行。匯編時由匯編程序處理,而不是程序運行期間由機器執(zhí)行。偽指令是偽指令是ARM匯編語言程序里的特殊指令助記符,也不在程匯編語言程序里的特殊指令助記符,也不在程序運行期間由機器執(zhí)行。它們在匯編時將被合適的機器指令序運行期間由機器執(zhí)行。它們在匯編時將被合適的機器指令代替成代替成Thumb指令,從而實現(xiàn)真正的指令操作。指令,從而實現(xiàn)真正的指令

8、操作。 宏指令是一段獨立的程序代碼,可插在源程序中,它通過宏指令是一段獨立的程序代碼,可插在源程序中,它通過偽操作來定義。宏在使用之前必須提前定義好,宏之間可偽操作來定義。宏在使用之前必須提前定義好,宏之間可互相調(diào)用,也可遞歸調(diào)用。互相調(diào)用,也可遞歸調(diào)用。通過直接書寫宏名來使用宏,并根據(jù)宏指令的格式設(shè)置相通過直接書寫宏名來使用宏,并根據(jù)宏指令的格式設(shè)置相應(yīng)的輸入?yún)?shù)。宏定義本身不會產(chǎn)生代碼,只是在調(diào)用它應(yīng)的輸入?yún)?shù)。宏定義本身不會產(chǎn)生代碼,只是在調(diào)用它時把宏體插入到源程序中。調(diào)用宏時通過實際的指令來代時把宏體插入到源程序中。調(diào)用宏時通過實際的指令來代替宏體實現(xiàn)相關(guān)的一段代碼。替宏體實現(xiàn)相關(guān)的一

9、段代碼。 9 (3)操作數(shù)域操作數(shù)域(OPERAND) 操作數(shù)域表示操作的對象,操作數(shù)可以是常量、變量、標號、操作數(shù)域表示操作的對象,操作數(shù)可以是常量、變量、標號、寄存器名或表達式,不同對象之間必須用逗號寄存器名或表達式,不同對象之間必須用逗號“,”分開。分開。立即數(shù)用立即數(shù)用“#”字開頭,還可以使用字開頭,還可以使用EQU指示字來定義常數(shù)。指示字來定義常數(shù)。例:例: MOV R0, #0 x12 ; R0 = 0 x12 MOV R1, #A ; R1 = 字母字母A的的ASCII碼碼 NVIC_IRQ0_ENABLE EQU 0 x1122;標號頂格寫標號頂格寫 MOV R1, #NVIC

10、_IRQ0_ENABLE ; 把立即數(shù)傳送到把立即數(shù)傳送到R1中中(4)注釋域(注釋域(COMMENT) 注釋域用來說明語句的功能,以注釋域用來說明語句的功能,以“;”開始。匯編程序?qū)﹂_始。匯編程序?qū)Α埃弧币砸院蟮牟糠植挥鑵R編。后的部分不予匯編。 例例 1 指令和偽操作書寫格式的舉例指令和偽操作書寫格式的舉例 AREA EX4_3,CODE,READONLY ;前面必須有空格;前面必須有空格 GBLA DATA ;前面必須有空格;前面必須有空格 DATA SETA 0 x20 ;DATA變量名變量名前面不能留空格前面不能留空格 ADD R0,R1,R2 ;全部大寫,正確;全部大寫,正確 ADD

11、 R0,R1,r2 ;寄存器小寫,正確;寄存器小寫,正確 add R0,R1,r2 ;指令助記符小寫,寄存器大寫或小寫,正確;指令助記符小寫,寄存器大寫或小寫,正確 Add R0,R1,r2 ;寄存器小寫,正確;指令助記符大小寫混合,不正確;寄存器小寫,正確;指令助記符大小寫混合,不正確例1:Thumb2匯編語言程序結(jié)構(gòu);文件名文件名:TEST1.S ,計算,計算15+8=? AREA |test1.s|,CODE,READONLY;聲明只讀代碼段聲明只讀代碼段 EXPORT _Vectors ;聲明全局變量聲明全局變量,用于向量表入口用于向量表入口 EXPORT Reset_Handler

12、;全局變量,用于復(fù)位指針全局變量,用于復(fù)位指針_Vectors DCD 0 x11223344 ;地址地址0 x0,向量表第向量表第0字,字,MSP初值初值 DCD Reset_Handler ;地址地址0 x4,標號的地址值,標號的地址值,PC初值初值 Reset_Handler PROC ;復(fù)位中斷服務(wù)程序復(fù)位中斷服務(wù)程序,PROCP函數(shù)起始函數(shù)起始START MOV R0,#15 ;R0 = 15 MOV R1,#8 ; R1 =8 ADD R0,R0,R1; R0 = R0 + R1 B START ;跳轉(zhuǎn)到;跳轉(zhuǎn)到START處處 ENDP ;函數(shù)結(jié)束函數(shù)結(jié)束,函數(shù)偽操作可省略函數(shù)偽操

13、作可省略 END 標號頂格寫使用使用“;”進行注釋,可行首進行注釋,可行首偽操作實際代碼段聲明文件結(jié)束與源程序格式有關(guān)的偽操作F1、AREA偽操作:定義一個代碼段或數(shù)據(jù)段。偽操作:定義一個代碼段或數(shù)據(jù)段。 ARM程序采程序采用分段式設(shè)計,一個源程序至少包含一個代碼段。語法:用分段式設(shè)計,一個源程序至少包含一個代碼段。語法: AREA |段名段名| , CODE|DATA,attr段名非數(shù)字開頭、無標點時段名非數(shù)字開頭、無標點時“|”可省略可省略;CODE|DATA指定代碼段或數(shù)據(jù)段指定代碼段或數(shù)據(jù)段;還有還有NOINIT表示數(shù)據(jù)段表示數(shù)據(jù)段是未初始化的或初始化為零。是未初始化的或初始化為零。a

14、ttr屬性如:屬性如:nREADONLY,只讀;,只讀;nREADWRITE,可讀寫;,可讀寫;nALIGN=數(shù)字表達式,值數(shù)字表達式,值0-31,按,按2的表達式冪次方對齊的表達式冪次方對齊方式,如方式,如0為為1字節(jié)對齊、字節(jié)對齊、1為為2字節(jié)對齊、字節(jié)對齊、2為為4字節(jié)對齊等字節(jié)對齊等(省略為(省略為4字節(jié)對齊)。字節(jié)對齊)。與源程序格式有關(guān)的偽操作2、PROC/ENDP函數(shù)起始函數(shù)起始/結(jié)束標志,例:結(jié)束標志,例:Reset_Handler PROC ;函數(shù)起始標志;函數(shù)起始標志START MOV R0,#15 ;R0 = 15 MOV R1,#8 ; R1 =8 ADDS R0,R0

15、,R1; R0 = R0 + R1 B START ENDP ;函數(shù)結(jié)束標志;函數(shù)結(jié)束標志 可以不用可以不用PROC/ENDP,使用的好處程序結(jié)構(gòu)清晰。,使用的好處程序結(jié)構(gòu)清晰。3、END偽操作:告訴編譯器已經(jīng)到了源程序的結(jié)尾。偽操作:告訴編譯器已經(jīng)到了源程序的結(jié)尾。第5章 匯編語言程序設(shè)計n5.1匯編語言概述n5.2 偽操作n5.3 分支、循環(huán)、子程序n5.4 匯編語言上機環(huán)境n5.5 匯編語言C語言混合編程ARM匯編器的偽操作在在ARM匯編語言程序里,有一些特殊指令助記符,這些助匯編語言程序里,有一些特殊指令助記符,這些助記符與指令系統(tǒng)的助記符不同,沒有相對應(yīng)的操作碼,通記符與指令系統(tǒng)的助

16、記符不同,沒有相對應(yīng)的操作碼,通常稱這些特殊指令助記符為偽操作。常稱這些特殊指令助記符為偽操作。偽操作不像機器指令那樣在程序運行期間由機器執(zhí)行,偽偽操作不像機器指令那樣在程序運行期間由機器執(zhí)行,偽操作在源程序中的作用是為完成匯編程序作各種準備工作操作在源程序中的作用是為完成匯編程序作各種準備工作的,這些偽操作僅在匯編過程中起作用,一旦匯編結(jié)束,的,這些偽操作僅在匯編過程中起作用,一旦匯編結(jié)束,偽操作的使命就完成。偽操作的使命就完成。在在ARM的匯編程序中,有如下幾種偽操作:的匯編程序中,有如下幾種偽操作: 符號定義(符號定義(Symbol Definition)偽操作)偽操作 數(shù)據(jù)定義(數(shù)據(jù)定

17、義(Data Definition)偽操作)偽操作 匯編控制(匯編控制(Assembly Control)偽操作)偽操作 框架描述(框架描述(Frame Description)偽操作)偽操作 信息報告信息報告(Reporting) 偽操作偽操作 其它(其它(Miscellaneous)偽操作。)偽操作。ARM匯編器的偽操作5.2.1 符號定義偽操作符號定義偽操作用于定義符號定義偽操作用于定義ARM匯編程序中的變量、對變量賦值匯編程序中的變量、對變量賦值以及定義寄存器的別名等操作。常見的符號定義偽操作有如以及定義寄存器的別名等操作。常見的符號定義偽操作有如下幾種:下幾種: 用于定義全局變量的用

18、于定義全局變量的 GBLA、GBLL和和GBLS。 用于定義局部變量的用于定義局部變量的 LCLA、LCLL和和LCLS。 用于對變量賦值的用于對變量賦值的 SETA、SETL、SETS。 1. 全局變量聲明全局變量聲明GBLA、GBLL和和GBLS 格格 式:式:GBLA(GBLL或或GBLS)全局變量名)全局變量名 功功 能:能:GBLA、GBLL和和GBLS偽操作用于定義一個偽操作用于定義一個ARM程序中的程序中的全局變量,并將其初始化。全局變量,并將其初始化。GBLA偽操作用于定義一個全局的偽操作用于定義一個全局的數(shù)值數(shù)值變量,并初始化為變量,并初始化為0;GBLL偽操作用于定義一個全

19、局的偽操作用于定義一個全局的邏輯邏輯變量,并初始化為變量,并初始化為F(假);(假);GBLS偽操作用于定義一個全局的偽操作用于定義一個全局的字符串字符串變量,并初始化為空;變量,并初始化為空;5.2.1 符號定義偽操作 例例 2 使用示例:使用示例: GBLA A1 ;定義一個全局的數(shù)值變量,變量名為;定義一個全局的數(shù)值變量,變量名為A1 A1 SETA 0 x0F ;將該變量賦值為;將該變量賦值為0 x0F GBLL A2 ;定義一個全局的邏輯變量,變量名為;定義一個全局的邏輯變量,變量名為A2 A2 SETL TRUE ;將該變量賦值為真;將該變量賦值為真 GBLS A3 ;定義一個全局

20、的字符串變量,變量名為;定義一個全局的字符串變量,變量名為A3 A3 SETS “Testing” ;將該變量賦值為;將該變量賦值為“Testing” 5.2.1 符號定義偽操作5.2.1 符號定義偽操作 2. LCLA、LCLL和和LCLS 格式:格式:LCLA(LCLL或或LCLS)局部變量名)局部變量名 功功 能:能:LCLA、LCLL和和LCLS偽操作用于定義一個偽操作用于定義一個ARM程序中程序中的局部變量,并將其初始化。的局部變量,并將其初始化。LCLA偽操作用于定義一個局部的偽操作用于定義一個局部的數(shù)值數(shù)值變量,并初始化為變量,并初始化為0;LCLL偽操作用于定義一個局部的偽操作

21、用于定義一個局部的邏輯邏輯變量,并初始化為變量,并初始化為F(假);(假);LCLS偽操作用于定義一個局部的偽操作用于定義一個局部的字符串字符串變量,并初始化為空;變量,并初始化為空;21 例例 3 使用示例:使用示例:LCLA Test4 ;聲明一個局部的數(shù)值變量,變量名為;聲明一個局部的數(shù)值變量,變量名為Test4Test4 SETA 0 xaa ;將該變量賦值為;將該變量賦值為0 xaaLCLL Test5 ;聲明一個局部的邏輯變量,變量名為;聲明一個局部的邏輯變量,變量名為Test5Test5 SETL TRUE ;將該變量賦值為真;將該變量賦值為真LCLS Test6 ;定義一個局部

22、的字符串變量,變量名為;定義一個局部的字符串變量,變量名為Test6Test6 SETS “Testing” ;將該變量賦值為;將該變量賦值為“Testing” 5.2.1 符號定義偽操作3. SETA、SETL和和SETS 格格 式:變量名式:變量名SETA(SETL或或SETS)表達式)表達式 功功 能:偽操作能:偽操作SETA、SETL、SETS用于給一個已經(jīng)定義用于給一個已經(jīng)定義的全局變量或局部變量賦值。的全局變量或局部變量賦值。SETA偽操作用于給一個偽操作用于給一個數(shù)值數(shù)值變量賦值;變量賦值;SETL偽操作用于給一個偽操作用于給一個邏輯邏輯變量賦值;變量賦值;SETS偽操作用于給一

23、個偽操作用于給一個字符串字符串變量賦值;變量賦值;235.2.1 符號定義偽操作 例例 4 使用示例:使用示例: LCLA Test3 ;聲明一個局部的數(shù)值變量,變量名為;聲明一個局部的數(shù)值變量,變量名為Test3 Test3 SETA 0 xaa ;將該變量賦值為;將該變量賦值為0 xaa LCLL Test4 ;聲明一個局部的邏輯變量,變量名為;聲明一個局部的邏輯變量,變量名為Test4 Test4 SETL TRUE ;將該變量賦值為真;將該變量賦值為真5.2.1 符號定義偽操作 4. RLIST 格格 式:名稱式:名稱 RLIST 寄存器列表寄存器列表 功功 能:能:RLIST偽操作可

24、用于對一個通用寄存器列表定義名稱,偽操作可用于對一個通用寄存器列表定義名稱,使用該偽操作定義的名稱可在使用該偽操作定義的名稱可在ARM指令指令LDM/STM中使用。中使用。 在在LDM/STM指令中,列表中的寄存器訪問次序為根據(jù)寄存器的指令中,列表中的寄存器訪問次序為根據(jù)寄存器的編號由低到高,而與列表中的寄存器排列次序無關(guān)。編號由低到高,而與列表中的寄存器排列次序無關(guān)。 5.2.1 符號定義偽操作 例例 5 使用示例:使用示例: RegList RLIST R0-R5,R8,R10 ;將寄存器列表名稱定;將寄存器列表名稱定義為義為RegList, 在程序中使用:在程序中使用: STMFD SP

25、!,RegList ;存儲列表到堆棧;存儲列表到堆棧 LDMIA R5,RegList ;加載列表;加載列表265.2.1 符號定義偽操作5.2.1 符號定義偽操作(總結(jié))符號符號:標號、變量、常量、寄存器別名、函數(shù)名標號、變量、常量、寄存器別名、函數(shù)名;n標號是指令的符號地址只在代碼段中被定義;n變量是操作數(shù)的符號地址可在數(shù)據(jù)段和代碼段中定義;符號定義偽操作符號定義偽操作:n定義變量、常量、寄存器別名的操作,及其賦值的操作。符號定義偽操作(總結(jié))1、全局級變量定義偽操作:、全局級變量定義偽操作:GBLA、GBLL和和GBLS 語法:語法: nX為A定義一個全局數(shù)值變量并初始化為0;nX為L定

26、義一個全局邏輯變量并初始化為FULS;nX為S定義一個全局字符串變量并初始化為空串;2、局部變量定義偽操作:、局部變量定義偽操作:LCLA、LCLL和和LCLS 語法:語法: nX:A指數(shù)值、L指邏輯、S指字符串n局部變量定義要在局部如一個宏內(nèi)( MACRO-MEND)。3、變量的賦值偽操作:、變量的賦值偽操作:SETA、 SETL、 SETS 語法:語法: n數(shù)值用0 x開頭的十六進制數(shù),n邏輯值:TRUE、FULS,n字符串用雙引號圍起來“”。符號定義偽操作(總結(jié))例例1:全局級變量定義與賦值:全局級變量定義與賦值 GBLA Test1;定義全局數(shù)字變量Test1Test1 SETA 0

27、xaa ;將Test1變量賦值為0 xaa GBLL Test2;定義全局邏輯變量Test2Test2 SETL TRUE;將該變量賦值為真例例2:局部變量需在宏內(nèi)定義與賦值:局部變量需在宏內(nèi)定義與賦值: MACRO ;宏開始標記$IRQ_Label HANDLER $IRQ_Exception; HANDLER宏名 LCLS Test3 ;宏內(nèi)定義局部字符串Test3 SETS Testing ;Test3=“Testing” MEND ;宏結(jié)束標記符號定義偽操作(總結(jié))4、寄存器別名定義偽操作:、寄存器別名定義偽操作:RLIST,將一個或幾個通用寄,將一個或幾個通用寄存器定義一個名稱,如該

28、名稱可在存器定義一個名稱,如該名稱可在LDM/STM指令中使用。指令中使用。語法:語法: RegListName RLIST R0-R6,R8,R10-R125、常量定義偽操作:、常量定義偽操作:EQU(可用(可用*代替),將一個數(shù)值或寄代替),將一個數(shù)值或寄存器的值賦給常量、標號。語法:存器的值賦給常量、標號。語法: 符號名符號名 EQU 表達式表達式n表達式值給常量、標號。n賦值以后的常量,可以用作數(shù)據(jù)地址、代碼地址、位地址或者直接當做一個立即數(shù)使用。例: const1 EQU 0X1234 ;const1值為值為1234 MOV R0,#const1 ;R0 = 1234符號定義偽操作(

29、總結(jié))6、工程級標號定義偽操作:、工程級標號定義偽操作:EXPORT(或(或GLOBAL),該全局標號可在其他的文件中引用。語法:該全局標號可在其他的文件中引用。語法: EXPORT symbol WEAKnsymbol,標號名。nWEAK選項聲明其他同名標號優(yōu)先于該標號被引用。例:例: EXPORT Stest ;聲明一個可全局引用的標號聲明一個可全局引用的標號Stest7、其他:、其他:CN為協(xié)處理器的寄存器定義名稱為協(xié)處理器的寄存器定義名稱CP為協(xié)處理器定義名稱DN/SN為雙精度/單精度VFP的寄存器定義名稱FN為FPA浮點寄存器定義名稱5.2.2 數(shù)據(jù)定義偽操作 數(shù)據(jù)定義偽操作用于為特

30、定的數(shù)據(jù)分配存儲單元,同時可完成已數(shù)據(jù)定義偽操作用于為特定的數(shù)據(jù)分配存儲單元,同時可完成已分配存儲單元的初始化。常見的數(shù)據(jù)定義偽操作有如下幾種:分配存儲單元的初始化。常見的數(shù)據(jù)定義偽操作有如下幾種: DCB 分配一片連續(xù)的分配一片連續(xù)的字節(jié)字節(jié)存儲單元并初始化。存儲單元并初始化。 DCW(DCWU)分配一片連續(xù)的)分配一片連續(xù)的半字半字存儲單元并初始化。存儲單元并初始化。 DCD(DCDU)分配一片連續(xù)的)分配一片連續(xù)的字字存儲單元并初始化。存儲單元并初始化。 DCQ(DCQU)分配一片以)分配一片以8字節(jié)為單位字節(jié)為單位的連續(xù)的存儲單元并初始化。的連續(xù)的存儲單元并初始化。 DCFS(DCFS

31、U)為)為單精度浮點數(shù)單精度浮點數(shù)分配一片連續(xù)的字存儲單元并初始化。分配一片連續(xù)的字存儲單元并初始化。 DCFD(DCFDU)為)為雙精度浮點數(shù)雙精度浮點數(shù)分配一片連續(xù)的字存儲單元并初始化。分配一片連續(xù)的字存儲單元并初始化。5.2.2 數(shù)據(jù)定義偽操作 SPACE 分配一片連續(xù)的存儲單元。分配一片連續(xù)的存儲單元。 FIELD定義一個結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域。定義一個結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域。 MAP定義一個結(jié)構(gòu)化的內(nèi)存表首地址。定義一個結(jié)構(gòu)化的內(nèi)存表首地址。 LTORG定義一個數(shù)據(jù)緩沖池定義一個數(shù)據(jù)緩沖池(literal pool)的開始。的開始。33 1. DCB 格格 式:標號式:標號 DCB

32、表達式表達式 功功 能:能:DCB偽操作用于分配一片連續(xù)的字節(jié)存儲單元并用偽操偽操作用于分配一片連續(xù)的字節(jié)存儲單元并用偽操作中指定作中指定 的表達式初始化。其中,表達式可以為的表達式初始化。其中,表達式可以為0255的數(shù)值或字的數(shù)值或字符串。符串。 DCB也可用也可用“=”代替。代替。使用示例:使用示例:Str DCB “This is a test!” ;分配一片連續(xù)的字節(jié)存儲單元并初始;分配一片連續(xù)的字節(jié)存儲單元并初始化?;?。5.2.2 數(shù)據(jù)定義偽操作5.2.2 數(shù)據(jù)定義偽操作 2. DCW(DCWU) 格格 式:標號式:標號DCW(或(或DCWU)表達式)表達式 功功 能:能:DCW(或

33、(或DCWU)偽操作用于分配一片連續(xù)的半字存儲)偽操作用于分配一片連續(xù)的半字存儲單元并用偽操作中指定的表達式初始化。其中,表達式可以為程單元并用偽操作中指定的表達式初始化。其中,表達式可以為程序標號或數(shù)值表達式。用序標號或數(shù)值表達式。用DCW分配的字存儲單元是半字對齊的分配的字存儲單元是半字對齊的,而用,而用DCWU分配的字存儲單元并不嚴格按照半字對齊。分配的字存儲單元并不嚴格按照半字對齊。使用示例:使用示例: DataTest DCW 1,2,3 ;分配一片連續(xù)的半字存儲單元并初始化;分配一片連續(xù)的半字存儲單元并初始化。35 3. DCD(或(或DCDU) 格格 式:標號式:標號DCD(或(

34、或DCDU)表達式)表達式 功功 能:能:DCD(或(或DCDU)偽操作用于分配一片連續(xù)的字存儲)偽操作用于分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。其中,表達式可以為單元并用偽操作中指定的表達式初始化。其中,表達式可以為程序標號或數(shù)值表達式。程序標號或數(shù)值表達式。DCD也可用也可用“&”代替。用代替。用DCD分配分配的字存儲單元是字對齊的,而用的字存儲單元是字對齊的,而用DCDU分配的字存儲單元并不分配的字存儲單元并不嚴格按照字對齊。嚴格按照字對齊。使用示例:使用示例: DataTest DCD 4,5,6 ;分配一片連續(xù)的字存儲單元并初始化;分配一片連續(xù)的字存儲單元并

35、初始化。5.2.2 數(shù)據(jù)定義偽操作4. DCQ(或或DCQU) 格格 式:標號式:標號 DCQ(或(或DCQU)表達式)表達式 功功 能:能:DCQ(或(或DCQU)偽操作用于分配一片以)偽操作用于分配一片以8個字節(jié)為單個字節(jié)為單位的連續(xù)存儲區(qū)域并用偽操作中指定的表達式初始化。用位的連續(xù)存儲區(qū)域并用偽操作中指定的表達式初始化。用DCQ分配的存儲單元是字對齊的,而用分配的存儲單元是字對齊的,而用DCQU分配的存儲單分配的存儲單元并不嚴格按照字對齊。元并不嚴格按照字對齊。使用示例:使用示例: DataTest DCQ 100 ;分配一片連續(xù)的存儲單元并初始化為指;分配一片連續(xù)的存儲單元并初始化為指

36、定的值。定的值。5.2.2 數(shù)據(jù)定義偽操作5. DCFS(或(或DCFSU) 格格 式:標號式:標號DCFS(或(或DCFSU)表達式)表達式 功功 能:能:DCFS(或(或DCFSU)偽操作用于為單精度浮點數(shù)分配)偽操作用于為單精度浮點數(shù)分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。每個單精度浮點數(shù)占據(jù)一個字單元。用每個單精度浮點數(shù)占據(jù)一個字單元。用DCFS分配的字存儲單分配的字存儲單元是字對齊的,而用元是字對齊的,而用DCFSU分配的字存儲單元并不嚴格按照分配的字存儲單元并不嚴格按照字對齊。字對齊。使用示例:使用示例:Fdata

37、Test DCFS 2E5,-5E7 ;分配一片連;分配一片連 續(xù)的字存儲單元并續(xù)的字存儲單元并初始化為指定的單精度數(shù)。初始化為指定的單精度數(shù)。 5.2.2 數(shù)據(jù)定義偽操作6. DCFD(或(或DCFDU) 格格 式:標號式:標號 DCFD(或(或DCFDU)表達式)表達式 功功 能:能:DCFD(或(或DCFDU)偽操作用于為雙精度的浮點數(shù))偽操作用于為雙精度的浮點數(shù)分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。每個雙精度的浮點數(shù)占據(jù)兩個字單元。用。每個雙精度的浮點數(shù)占據(jù)兩個字單元。用DCFD分配的字存分配的字存儲單元是字對齊的

38、,而用儲單元是字對齊的,而用DCFDU分配的字存儲單元并不嚴格分配的字存儲單元并不嚴格按照字對齊。按照字對齊。使用示例:使用示例:FdataTest DCFD 2E115,-5E7 ;分配一片連續(xù)的字存儲單元并初;分配一片連續(xù)的字存儲單元并初始化為指定的雙精度數(shù)。始化為指定的雙精度數(shù)。 5.2.2 數(shù)據(jù)定義偽操作 7. SPACE 格格 式:標號式:標號 SPACE 表達式表達式 功功 能:能:SPACE偽操作用于分配一片連續(xù)的存儲區(qū)域并初始偽操作用于分配一片連續(xù)的存儲區(qū)域并初始化為化為0。其中,表達式為要分配的字節(jié)數(shù)。其中,表達式為要分配的字節(jié)數(shù)。SPACE也可用也可用“”代替。代替。使用示

39、例:使用示例:DataSpace SPACE 100 ;分配連續(xù);分配連續(xù)100字節(jié)的存儲單元并初始化字節(jié)的存儲單元并初始化為為0。5.2.2 數(shù)據(jù)定義偽操作5.2.2 數(shù)據(jù)定義偽操作8. MAP 格格 式:式:MAP表達式表達式,基址寄存器,基址寄存器 功功 能:能:MAP偽操作用于定義一個結(jié)構(gòu)化的內(nèi)存表的首地址。偽操作用于定義一個結(jié)構(gòu)化的內(nèi)存表的首地址。MAP也可用也可用“”代替。表達式可以為程序中的標號或數(shù)學(xué)代替。表達式可以為程序中的標號或數(shù)學(xué)表達式,基址寄存器為可選項,表達式,基址寄存器為可選項, 當基址寄存器選項不存在時當基址寄存器選項不存在時,表達式的值即為內(nèi)存表的首地址,當該選,

40、表達式的值即為內(nèi)存表的首地址,當該選 項存在時,內(nèi)存項存在時,內(nèi)存表的首地址為表達式的值與基址寄存器的和。表的首地址為表達式的值與基址寄存器的和。MAP偽操作通偽操作通常與常與FIELD偽操作配合使用來定義結(jié)構(gòu)化的內(nèi)存表。偽操作配合使用來定義結(jié)構(gòu)化的內(nèi)存表。使用示例:使用示例:MAP 0 x100,R0 ;定義結(jié)構(gòu)化內(nèi)存表首地址的值為;定義結(jié)構(gòu)化內(nèi)存表首地址的值為0 x100R0。419. FILED 格格 式:標號式:標號 FIELD 表達式表達式 功功 能:能:FIELD偽操作用于定義一個結(jié)構(gòu)化內(nèi)存表中的偽操作用于定義一個結(jié)構(gòu)化內(nèi)存表中的 數(shù)據(jù)域數(shù)據(jù)域。FILED也可用也可用“#”代替。表

41、達式的值為當前數(shù)據(jù)域在內(nèi)存表中代替。表達式的值為當前數(shù)據(jù)域在內(nèi)存表中所占的字節(jié)數(shù)。所占的字節(jié)數(shù)。 5.2.2 數(shù)據(jù)定義偽操作MAP偽操作定義內(nèi)存表的首地址,偽操作定義內(nèi)存表的首地址,F(xiàn)IELD偽操作定義內(nèi)存表偽操作定義內(nèi)存表中的各個數(shù)據(jù)域,并可以為每個數(shù)據(jù)域指定一個標號供其它的中的各個數(shù)據(jù)域,并可以為每個數(shù)據(jù)域指定一個標號供其它的指令引用。指令引用。FIELD偽操作常與偽操作常與MAP偽操作配合使用來定義結(jié)構(gòu)化的內(nèi)存?zhèn)尾僮髋浜鲜褂脕矶x結(jié)構(gòu)化的內(nèi)存表。表。43由由MAP偽操作和偽操作和FIELD偽操作配合定義的內(nèi)存表有偽操作配合定義的內(nèi)存表有3種:種: (1)表達式是一個基于絕對地址的內(nèi)存表表

42、達式是一個基于絕對地址的內(nèi)存表,例如:例如: MAP 0 x100 ;定義結(jié)構(gòu)化內(nèi)存表首地址的值為;定義結(jié)構(gòu)化內(nèi)存表首地址的值為0 x100。 A FIELD 4 ;定義;定義A的長度為的長度為4字節(jié),位置為字節(jié),位置為0 x100 B FIELD 4 ;定義;定義B的長度為的長度為4字節(jié),位置為字節(jié),位置為0 x104 S FIELD 16 ;定義;定義S的長度為的長度為16字節(jié),位置為字節(jié),位置為0 x108 5.2.2 數(shù)據(jù)定義偽操作5.2.2 數(shù)據(jù)定義偽操作分析:上面的偽操作序列定義了一個內(nèi)存表,其首地址為固定分析:上面的偽操作序列定義了一個內(nèi)存表,其首地址為固定地址地址0 x100,

43、該內(nèi)存表中包含,該內(nèi)存表中包含3個數(shù)據(jù)域:個數(shù)據(jù)域:A長度為長度為4字節(jié),相字節(jié),相對表首的相對地址為對表首的相對地址為0;B的長度為的長度為4 字節(jié),相對地址為字節(jié),相對地址為4;S的長度為的長度為16字節(jié),相對地址為字節(jié),相對地址為8。在指令中可以這樣引用內(nèi)存表中的數(shù)據(jù)域:在指令中可以這樣引用內(nèi)存表中的數(shù)據(jù)域: LDR R0,=A ;使用偽指令讀??;使用偽指令讀取A的地址,地址是的地址,地址是 0 x100LDR R1,R0 ;將;將A地址處對應(yīng)的內(nèi)容加載到地址處對應(yīng)的內(nèi)容加載到R145 (2)表達式是一個數(shù)值,是一個基于相對地址的內(nèi)存表,例如:表達式是一個數(shù)值,是一個基于相對地址的內(nèi)存表

44、,例如:MAP 0 x04,R9 ;定義結(jié)構(gòu)化內(nèi)存表首地址的值為;定義結(jié)構(gòu)化內(nèi)存表首地址的值為R9寄存器寄存器的值。的值。 DATA1 FIELD 4 ;定義;定義A的長度為的長度為4字節(jié),相對位置為字節(jié),相對位置為0 DATA2 FIELD 8 ;定義;定義B的長度為的長度為8字節(jié),相對位置為字節(jié),相對位置為4 STRING FIELD 96 ;定義;定義S的長度為的長度為96字節(jié),相對位置為字節(jié),相對位置為12 5.2.2 數(shù)據(jù)定義偽操作可通過下面的指令訪問地址范圍超過可通過下面的指令訪問地址范圍超過4KB的數(shù)據(jù)。的數(shù)據(jù)。 LDR R9,=0 x900 ;定義內(nèi)存表的地址,首地址是;定義內(nèi)

45、存表的地址,首地址是0 x904 ADR R0,DATA1 ;在程序中,讀??;在程序中,讀取DATA1的地址的地址0 x908 LDR R2,R0 ;讀取;讀取DATA1數(shù)據(jù)數(shù)據(jù) LDR R9,=0 x2000 ;同一個內(nèi)存表,重新定義為;同一個內(nèi)存表,重新定義為0 x2004 ADR R1,DATA2 ;讀??;讀取DATA2的地址,是的地址,是 0 x2008 STR R9,R1 ;把;把R9的地址存儲到的地址存儲到DATA2475.2.2 數(shù)據(jù)定義偽操作 分析:上面的偽操作序列定義了一個內(nèi)存表,其首地址是基分析:上面的偽操作序列定義了一個內(nèi)存表,其首地址是基于寄存器于寄存器R9中的內(nèi)容,而

46、不是一個固定地址,通過在中的內(nèi)容,而不是一個固定地址,通過在LDR指令中指定不同的基址寄存器值,定義的內(nèi)存表結(jié)構(gòu)可在指令中指定不同的基址寄存器值,定義的內(nèi)存表結(jié)構(gòu)可在程序中有多個實例??啥啻问褂贸绦蛑杏卸鄠€實例??啥啻问褂肔DR指令,用以實現(xiàn)不同指令,用以實現(xiàn)不同的程序?qū)嵗?。的程序?qū)嵗?85.2.2 數(shù)據(jù)定義偽操作 (3)表達式是一個標號,基于)表達式是一個標號,基于PC的內(nèi)存表。例如的內(nèi)存表。例如 DATA SPACE 100 ;分配;分配100字節(jié)的內(nèi)存單元,并初始化為字節(jié)的內(nèi)存單元,并初始化為0。 MAP DATA ;內(nèi)存表的首地址為;內(nèi)存表的首地址為DATA內(nèi)存單元內(nèi)存單元 A FI

47、ELD 4 ;定義;定義A的長度為的長度為4字節(jié),相對位置為字節(jié),相對位置為0 B FIELD 4 ;定義;定義B的長度為的長度為4字節(jié),相對位置為字節(jié),相對位置為4 S FIELD 4 ;定義;定義S的長度為的長度為4字節(jié),相對位置為字節(jié),相對位置為8 可通過下面的指令訪問地址范圍不超過可通過下面的指令訪問地址范圍不超過4KB的數(shù)據(jù)。的數(shù)據(jù)。 LDR R5,B ;相當于;相當于LDR R5,PC,#4 5.2.2 數(shù)據(jù)定義偽操作5.2.2 數(shù)據(jù)定義偽操作分析:這里內(nèi)存表中各數(shù)據(jù)域的實際內(nèi)存地址是基于分析:這里內(nèi)存表中各數(shù)據(jù)域的實際內(nèi)存地址是基于PC寄存器寄存器的值,而不是基于一個固定的地址。

48、的值,而不是基于一個固定的地址。PC的值不是固定的,但的值不是固定的,但分配的內(nèi)存單元是固定的,也就是說,分配的內(nèi)存單元是固定的,也就是說,PC的值加上一個偏移的值加上一個偏移量的值才是內(nèi)存單元的值,這樣偏移量的值便是不固定的。量的值才是內(nèi)存單元的值,這樣偏移量的值便是不固定的。在使用在使用LDR指令訪問表中的數(shù)據(jù)域時,不必使用基址寄存器指令訪問表中的數(shù)據(jù)域時,不必使用基址寄存器。50 10. LTORG 格格 式:式:LTORG 功功 能:用于聲明一個數(shù)據(jù)緩沖池能:用于聲明一個數(shù)據(jù)緩沖池(也稱為文字池也稱為文字池)的開始,當?shù)拈_始,當程序中使用程序中使用LDR之類的指令時,數(shù)據(jù)緩沖區(qū)的使用可

49、能越界。為之類的指令時,數(shù)據(jù)緩沖區(qū)的使用可能越界。為防止越界發(fā)生,可使用防止越界發(fā)生,可使用LTORG偽操作定義數(shù)據(jù)緩沖池。偽操作定義數(shù)據(jù)緩沖池。ARM匯匯編編譯器一般把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一個代碼編編譯器一般把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一個代碼段開始之前,或者段開始之前,或者END偽操作之前。偽操作之前。LTORG偽操作通常放在無偽操作通常放在無條件跳轉(zhuǎn)指令之后條件跳轉(zhuǎn)指令之后, 或者子程序返回指令之后或者子程序返回指令之后,這樣處理器就不會這樣處理器就不會錯誤地將數(shù)據(jù)緩沖池錯誤地將數(shù)據(jù)緩沖池 中的數(shù)據(jù)當作指令來執(zhí)行。中的數(shù)據(jù)當作指令來執(zhí)行。5.2.2 數(shù)據(jù)定義偽操作5

50、.2.2 數(shù)據(jù)定義偽操作例如例如: AREA LTORG_EX,CODE,READONLY START BL FUNC1 FUNC1 LDR R1,=0 x8000 ;子程序;子程序 MOV PC,LR ;子程序結(jié)束;子程序結(jié)束 LTORG ;定義數(shù)據(jù)緩沖池;定義數(shù)據(jù)緩沖池 DATA SPACE 40 ;從當前位置開始分配;從當前位置開始分配40個字個字節(jié)并初始化為節(jié)并初始化為0 END525.2.2 數(shù)據(jù)定義偽操作(總結(jié))數(shù)據(jù)定義偽操作一般用于為特定的數(shù)據(jù)分配存儲單元,同數(shù)據(jù)定義偽操作一般用于為特定的數(shù)據(jù)分配存儲單元,同時可完成已分配存儲單元的初始化。時可完成已分配存儲單元的初始化。DCB

51、分配一片連續(xù)的分配一片連續(xù)的字節(jié)存儲單元字節(jié)存儲單元并用指定的數(shù)據(jù)初始化并用指定的數(shù)據(jù)初始化nDCW(DCWU) 半字存儲單元nDCD(DCDU) 字存儲單元nDCQ(DCQU) 雙字存儲單元nDCFD(DCFDU) 雙精度浮點數(shù)的字存儲單元nDCFS(DCFSU) 單精度浮點數(shù)的字存儲單元DCD為例,語法:為例,語法: 標號標號 DCD expr,expr -標號可省略;標號可省略; - expr表達式可多個,可是程序標號或數(shù)值表達式;表達式可多個,可是程序標號或數(shù)值表達式;數(shù)據(jù)定義偽操作(總結(jié))DCD偽操作舉例偽操作舉例: _Vectors DCD _initial_sp DCD Rese

52、t_Handler ;標號省略;標號省略 DCD 0 DCD 4,5,6SPACE偽操作:偽操作:分配一片連續(xù)的存儲區(qū)并初始化分配一片連續(xù)的存儲區(qū)并初始化0,語法:,語法: 標號名標號名 SPACE 表達式表達式n標號名,可選項。n表達式,分配的字節(jié)數(shù)。例:分配連續(xù)例:分配連續(xù)100字節(jié)的存儲單元并初始化為字節(jié)的存儲單元并初始化為0。 DataSpace SPACE 100數(shù)據(jù)定義偽操作(總結(jié))MAP 定義一個結(jié)構(gòu)化的內(nèi)存表首地址,語法:定義一個結(jié)構(gòu)化的內(nèi)存表首地址,語法: MAP expr,base-registernexpr表達式存儲到結(jié)構(gòu)化內(nèi)存表首地址nbase-register,指定一

53、個寄存器,包含這一項時,結(jié)構(gòu)化內(nèi)存表的首地址為expr和base-register值的和。FIELD 定義一個結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域,語法:定義一個結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域,語法: label FIELD exprnlabel標號名,可選項。nexpr表達式,F(xiàn)IELD指定的域所占內(nèi)存單元字節(jié)數(shù)。MAP偽操作通常與偽操作通常與FIELD偽操作配合使用來定義結(jié)構(gòu)化的偽操作配合使用來定義結(jié)構(gòu)化的內(nèi)存表。內(nèi)存表。數(shù)據(jù)定義偽操作(總結(jié))例:定義一個內(nèi)存表,首地址為固定地址例:定義一個內(nèi)存表,首地址為固定地址0 x100。該結(jié)構(gòu)化。該結(jié)構(gòu)化內(nèi)存表包含內(nèi)存表包含3個域:個域:A的長度為的長度為16個字節(jié),位

54、置為個字節(jié),位置為0 x100;B的長度為的長度為32個字節(jié),位置為個字節(jié),位置為0 x110;S的長度為的長度為256個字節(jié),個字節(jié),位置為位置為0 x130。n MAP 0 x100;結(jié)構(gòu)化內(nèi)存表首地址的值為0 x100nA FIELD 16;定義A的長度為16字節(jié),位置為0 x100nB FIELD 32;定義B的長度為32字節(jié),位置為0 x110nS FIELD 256;定義S的長度為256字節(jié),位置為0 x1305.2.3 匯編控制偽操作匯編控制偽操作用于控制匯編程序的執(zhí)行流程,常用的匯編控制匯編控制偽操作用于控制匯編程序的執(zhí)行流程,常用的匯編控制偽操作包括以下幾條:偽操作包括以下幾

55、條: IF、ELSE、ENDIF WHILE、WEND MACRO、MEND、MEXIT5.2.3 匯編控制偽操作 1. IF、ELSE、ENDIF 格格 式:式: IF 邏輯表達式邏輯表達式 指令序列指令序列1 ELSE 指令序列指令序列2 ENDIF功功 能:能:IF、ELSE、ENDIF偽操作能根據(jù)條件的成立與否決定是偽操作能根據(jù)條件的成立與否決定是否執(zhí)行某個指令序列。當否執(zhí)行某個指令序列。當IF后面的邏輯表達式為真,則執(zhí)行指后面的邏輯表達式為真,則執(zhí)行指令序列令序列1,否則執(zhí)行指令序列,否則執(zhí)行指令序列2。其中,。其中,ELSE及指令序列及指令序列2可以可以沒有,此時,當沒有,此時,當

56、IF后面的邏輯表達式為真,則執(zhí)行指令序列后面的邏輯表達式為真,則執(zhí)行指令序列1,否則繼續(xù)執(zhí)行后面的指令。,否則繼續(xù)執(zhí)行后面的指令。IF、 ELSE、ENDIF偽操作可以偽操作可以嵌套使用。嵌套使用。58 2. WHILE、WEND 格格 式:式:WHILE 邏輯表達式邏輯表達式 指令序列指令序列 WEND 功功 能:能:WHILE、WEND偽操作能根據(jù)條件的成立與否決定偽操作能根據(jù)條件的成立與否決定是否循環(huán)執(zhí)行某個指令序列。當是否循環(huán)執(zhí)行某個指令序列。當WHILE后面的邏輯表達式為真后面的邏輯表達式為真,則執(zhí)行指令序列,該指令序列執(zhí)行完畢后,再判斷邏輯表達,則執(zhí)行指令序列,該指令序列執(zhí)行完畢后

57、,再判斷邏輯表達式的值,若為真則繼續(xù)執(zhí)行,一直到邏輯表達式的值為假。式的值,若為真則繼續(xù)執(zhí)行,一直到邏輯表達式的值為假。WHILE、WEND偽操作可以嵌套使用。偽操作可以嵌套使用。5.2.3 匯編控制偽操作使用示例:使用示例:GBLA Counter ;聲明一個全局的數(shù)學(xué)變量,變量名為;聲明一個全局的數(shù)學(xué)變量,變量名為Counter Counter SETA 3 ;由變量;由變量Counter控制循環(huán)次數(shù)控制循環(huán)次數(shù) WHILE Counter 10 ;指令序列;指令序列 counter SETA counter+1 WEND605.2.3 匯編控制偽操作 3. MACRO、MEND、MEXI

58、T 格格 式:式: MACRO $標號標號 宏名宏名 $參數(shù)參數(shù)1,$參數(shù)參數(shù)2, 指令序列指令序列 MEXIT 指令序列指令序列 MEND功功 能:能:MACRO、MEND偽操作可以將一段代碼定義為一個偽操作可以將一段代碼定義為一個整體,稱為宏指令,然后就可以在程序中通過宏指令多次調(diào)整體,稱為宏指令,然后就可以在程序中通過宏指令多次調(diào)用該段代碼。其中,用該段代碼。其中,$標號在宏指令被展開時,標號會被替換標號在宏指令被展開時,標號會被替換為用戶定義的符號,宏指令可以使用一個或多個參數(shù),當宏為用戶定義的符號,宏指令可以使用一個或多個參數(shù),當宏指令被展開時,這些參數(shù)被相應(yīng)的值替換。指令被展開時,

59、這些參數(shù)被相應(yīng)的值替換。5.2.3 匯編控制偽操作宏指令的使用方式和功能與子程序有些相似,子程序可以提供宏指令的使用方式和功能與子程序有些相似,子程序可以提供模塊化的程序設(shè)計、節(jié)省存儲空間并提高運行速度。但在使模塊化的程序設(shè)計、節(jié)省存儲空間并提高運行速度。但在使用子程序結(jié)構(gòu)時需要保護現(xiàn)場,從而增加了系統(tǒng)的開銷,因用子程序結(jié)構(gòu)時需要保護現(xiàn)場,從而增加了系統(tǒng)的開銷,因此,在代碼較短且需要傳遞的參數(shù)較多時,可以使用宏指令此,在代碼較短且需要傳遞的參數(shù)較多時,可以使用宏指令代替子程序。包含在代替子程序。包含在MACRO和和MEND之間的指令序列稱為之間的指令序列稱為宏定義體,在宏定義體的第一行應(yīng)聲明宏

60、的原型(包含宏名宏定義體,在宏定義體的第一行應(yīng)聲明宏的原型(包含宏名、所需的參數(shù)),然后就可以在匯編程序中通過宏名來調(diào)用、所需的參數(shù)),然后就可以在匯編程序中通過宏名來調(diào)用該指令序列。該指令序列。625.2.3 匯編控制偽操作 MEXIT用于從宏定義中跳轉(zhuǎn)出去。在源程序被編譯時,匯編用于從宏定義中跳轉(zhuǎn)出去。在源程序被編譯時,匯編器將宏調(diào)用展開,用宏定義中的指令序列代替程序中的宏調(diào)器將宏調(diào)用展開,用宏定義中的指令序列代替程序中的宏調(diào)用,并將實際參數(shù)的值傳遞給宏定義中的形式參數(shù)。用,并將實際參數(shù)的值傳遞給宏定義中的形式參數(shù)。MACRO、MEND偽操作可以嵌套使用。偽操作可以嵌套使用。宏的標號使用方法:標號

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論