版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第5章章 匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序設(shè)計(jì)第5章 匯編語(yǔ)言程序設(shè)計(jì)n5.1匯編語(yǔ)言概述n5.2 偽操作n5.3 分支、循環(huán)、子程序n5.4 匯編語(yǔ)言上機(jī)環(huán)境n5.5 匯編語(yǔ)言C語(yǔ)言混合編程5.1 匯編語(yǔ)言概述 匯編語(yǔ)言:匯編語(yǔ)言:CPU提供的二進(jìn)制機(jī)器指令的助記符的集合。提供的二進(jìn)制機(jī)器指令的助記符的集合。匯編編譯器:把匯編語(yǔ)言源文件匯編成機(jī)器可執(zhí)行的二進(jìn)匯編編譯器:把匯編語(yǔ)言源文件匯編成機(jī)器可執(zhí)行的二進(jìn)制機(jī)器語(yǔ)言。制機(jī)器語(yǔ)言。特點(diǎn):程序執(zhí)行速度快,程序代碼生成量少。特點(diǎn):程序執(zhí)行速度快,程序代碼生成量少。缺點(diǎn):不易學(xué)習(xí)的編程語(yǔ)言,可讀性較差,屬于低級(jí)語(yǔ)言缺點(diǎn):不易學(xué)習(xí)的編程語(yǔ)言,可讀性較差
2、,屬于低級(jí)語(yǔ)言,需要對(duì)硬件有深刻的了解。,需要對(duì)硬件有深刻的了解。匯編語(yǔ)言概述一般用匯編語(yǔ)言編寫驅(qū)動(dòng)程序、需要嚴(yán)格計(jì)算執(zhí)行時(shí)間的一般用匯編語(yǔ)言編寫驅(qū)動(dòng)程序、需要嚴(yán)格計(jì)算執(zhí)行時(shí)間的程序以及需要加速執(zhí)行的程序。程序以及需要加速執(zhí)行的程序。設(shè)計(jì)匯編程序除了直接使用匯編指令,還需使用偽操作、設(shè)計(jì)匯編程序除了直接使用匯編指令,還需使用偽操作、偽指令等輔助進(jìn)行程序設(shè)計(jì)。偽指令等輔助進(jìn)行程序設(shè)計(jì)。偽操作:是一些特殊的指令助記符偽操作:是一些特殊的指令助記符, 只在匯編過(guò)程中起作只在匯編過(guò)程中起作用用,一旦匯編結(jié)束一旦匯編結(jié)束,偽操作的使命也就完成,不被匯編成機(jī)偽操作的使命也就完成,不被匯編成機(jī)器代碼。器代碼
3、。 如:數(shù)據(jù)定義、分配存儲(chǔ)區(qū)、指示程序結(jié)束等。如:數(shù)據(jù)定義、分配存儲(chǔ)區(qū)、指示程序結(jié)束等。偽指令:不是真正的機(jī)器指令,編譯器對(duì)源程序進(jìn)行匯編偽指令:不是真正的機(jī)器指令,編譯器對(duì)源程序進(jìn)行匯編處理時(shí)將被替換成相應(yīng)的匯編指令。處理時(shí)將被替換成相應(yīng)的匯編指令。本章介紹本章介紹ARM匯編器常用的偽操作、偽指令。匯編器常用的偽操作、偽指令。匯編語(yǔ)言概述 匯編語(yǔ)言基本語(yǔ)法:匯編語(yǔ)言基本語(yǔ)法:標(biāo)號(hào)標(biāo)號(hào) 操作碼操作碼 操作數(shù)操作數(shù)1, 操作數(shù)操作數(shù)2, ;注釋注釋標(biāo)號(hào)標(biāo)號(hào) :如有必須頂格寫:如有必須頂格寫, 代表地址,代表地址,讓匯編器來(lái)計(jì)算程序轉(zhuǎn)移讓匯編器來(lái)計(jì)算程序轉(zhuǎn)移的地址的地址; 操作碼:指令操作碼:指令
4、|偽操作偽操作|偽指令偽指令 :前面至少有一個(gè)空格;:前面至少有一個(gè)空格;操作數(shù):可以是變量、常量、指令地址、數(shù)據(jù)地址,而操作數(shù)操作數(shù):可以是變量、常量、指令地址、數(shù)據(jù)地址,而操作數(shù)1通常是本指令的執(zhí)行結(jié)果存儲(chǔ)處。通常是本指令的執(zhí)行結(jié)果存儲(chǔ)處。ARM匯編語(yǔ)言程序的每行語(yǔ)句由匯編語(yǔ)言程序的每行語(yǔ)句由14個(gè)部分組成。格式如下:個(gè)部分組成。格式如下: LABEL OPERATION OPERAND ;COMMENT 標(biāo)號(hào)域標(biāo)號(hào)域 操作助記符域操作助記符域 操作數(shù)域操作數(shù)域 注釋域注釋域 (1)標(biāo)號(hào)域標(biāo)號(hào)域(Label) 標(biāo)號(hào)域用來(lái)表示指令的地址、變量、過(guò)程名、數(shù)據(jù)的地址和常量。標(biāo)號(hào)域用來(lái)表示指令的地
5、址、變量、過(guò)程名、數(shù)據(jù)的地址和常量。 標(biāo)號(hào)是一個(gè)自行設(shè)計(jì)的標(biāo)識(shí)符或名稱,語(yǔ)句標(biāo)號(hào)可以是大小寫字母標(biāo)號(hào)是一個(gè)自行設(shè)計(jì)的標(biāo)識(shí)符或名稱,語(yǔ)句標(biāo)號(hào)可以是大小寫字母混合,通常以字母開(kāi)頭,由字母、數(shù)字、下劃線等組成?;旌?,通常以字母開(kāi)頭,由字母、數(shù)字、下劃線等組成。 語(yǔ)句標(biāo)號(hào)不能與寄存器名、指令助記符、偽指令語(yǔ)句標(biāo)號(hào)不能與寄存器名、指令助記符、偽指令(操作操作)助記符、變助記符、變量名同名。量名同名。語(yǔ)句標(biāo)號(hào)必須在一行的開(kāi)頭書寫,不能留空格。語(yǔ)句標(biāo)號(hào)必須在一行的開(kāi)頭書寫,不能留空格。匯編語(yǔ)言概述 (2)操作助記符域操作助記符域(OPERATION) 操作助記符域可以為指令、偽操作、宏指令或偽指令的助記符。
6、操作助記符域可以為指令、偽操作、宏指令或偽指令的助記符。 ARM匯編器對(duì)大小寫敏感,在匯編語(yǔ)言程序設(shè)計(jì)中,每一條指匯編器對(duì)大小寫敏感,在匯編語(yǔ)言程序設(shè)計(jì)中,每一條指令的助記符可以全部用大寫、或全部用小寫,但不允許在一條令的助記符可以全部用大寫、或全部用小寫,但不允許在一條指令中大、小寫混用。指令中大、小寫混用。 所有的指令都不能在行的開(kāi)頭書寫,必須在指令的前面有空格,所有的指令都不能在行的開(kāi)頭書寫,必須在指令的前面有空格,然后再書寫指令。然后再書寫指令。 指令助記符和后面的操作數(shù)或操作寄存器之間必須有空格,不可指令助記符和后面的操作數(shù)或操作寄存器之間必須有空格,不可以在這之間使用逗號(hào)。以在這之
7、間使用逗號(hào)。偽操作是偽操作是ARM匯編語(yǔ)言程序里的一些特殊助記符,其作用匯編語(yǔ)言程序里的一些特殊助記符,其作用 主要是為完成匯編程序做的各種準(zhǔn)備工作,在源程序進(jìn)行主要是為完成匯編程序做的各種準(zhǔn)備工作,在源程序進(jìn)行 匯編時(shí)由匯編程序處理,而不是程序運(yùn)行期間由機(jī)器執(zhí)行。匯編時(shí)由匯編程序處理,而不是程序運(yùn)行期間由機(jī)器執(zhí)行。偽指令是偽指令是ARM匯編語(yǔ)言程序里的特殊指令助記符,也不在程匯編語(yǔ)言程序里的特殊指令助記符,也不在程序運(yùn)行期間由機(jī)器執(zhí)行。它們?cè)趨R編時(shí)將被合適的機(jī)器指令序運(yùn)行期間由機(jī)器執(zhí)行。它們?cè)趨R編時(shí)將被合適的機(jī)器指令代替成代替成Thumb指令,從而實(shí)現(xiàn)真正的指令操作。指令,從而實(shí)現(xiàn)真正的指令
8、操作。 宏指令是一段獨(dú)立的程序代碼,可插在源程序中,它通過(guò)宏指令是一段獨(dú)立的程序代碼,可插在源程序中,它通過(guò)偽操作來(lái)定義。宏在使用之前必須提前定義好,宏之間可偽操作來(lái)定義。宏在使用之前必須提前定義好,宏之間可互相調(diào)用,也可遞歸調(diào)用?;ハ嗾{(diào)用,也可遞歸調(diào)用。通過(guò)直接書寫宏名來(lái)使用宏,并根據(jù)宏指令的格式設(shè)置相通過(guò)直接書寫宏名來(lái)使用宏,并根據(jù)宏指令的格式設(shè)置相應(yīng)的輸入?yún)?shù)。宏定義本身不會(huì)產(chǎn)生代碼,只是在調(diào)用它應(yīng)的輸入?yún)?shù)。宏定義本身不會(huì)產(chǎn)生代碼,只是在調(diào)用它時(shí)把宏體插入到源程序中。調(diào)用宏時(shí)通過(guò)實(shí)際的指令來(lái)代時(shí)把宏體插入到源程序中。調(diào)用宏時(shí)通過(guò)實(shí)際的指令來(lái)代替宏體實(shí)現(xiàn)相關(guān)的一段代碼。替宏體實(shí)現(xiàn)相關(guān)的一
9、段代碼。 9 (3)操作數(shù)域操作數(shù)域(OPERAND) 操作數(shù)域表示操作的對(duì)象,操作數(shù)可以是常量、變量、標(biāo)號(hào)、操作數(shù)域表示操作的對(duì)象,操作數(shù)可以是常量、變量、標(biāo)號(hào)、寄存器名或表達(dá)式,不同對(duì)象之間必須用逗號(hào)寄存器名或表達(dá)式,不同對(duì)象之間必須用逗號(hào)“,”分開(kāi)。分開(kāi)。立即數(shù)用立即數(shù)用“#”字開(kāi)頭,還可以使用字開(kāi)頭,還可以使用EQU指示字來(lái)定義常數(shù)。指示字來(lái)定義常數(shù)。例:例: MOV R0, #0 x12 ; R0 = 0 x12 MOV R1, #A ; R1 = 字母字母A的的ASCII碼碼 NVIC_IRQ0_ENABLE EQU 0 x1122;標(biāo)號(hào)頂格寫標(biāo)號(hào)頂格寫 MOV R1, #NVIC
10、_IRQ0_ENABLE ; 把立即數(shù)傳送到把立即數(shù)傳送到R1中中(4)注釋域(注釋域(COMMENT) 注釋域用來(lái)說(shuō)明語(yǔ)句的功能,以注釋域用來(lái)說(shuō)明語(yǔ)句的功能,以“;”開(kāi)始。匯編程序?qū)﹂_(kāi)始。匯編程序?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匯編語(yǔ)言程序結(jié)構(gòu);文件名文件名:TEST1.S ,計(jì)算,計(jì)算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,標(biāo)號(hào)的地址值,標(biāo)號(hào)的地址值,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 標(biāo)號(hào)頂格寫使用使用“;”進(jìn)行注釋,可行首進(jìn)行注釋,可行首偽操作實(shí)際代碼段聲明文件結(jié)束與源程序格式有關(guān)的偽操作F1、AREA偽操作:定義一個(gè)代碼段或數(shù)據(jù)段。偽操作:定義一個(gè)代碼段或數(shù)據(jù)段。 ARM程序采程序采用分段式設(shè)計(jì),一個(gè)源程序至少包含一個(gè)代碼段。語(yǔ)法:用分段式設(shè)計(jì),一個(gè)源程序至少包含一個(gè)代碼段。語(yǔ)法: AREA |段名段名| , CODE|DATA,attr段名非數(shù)字開(kāi)頭、無(wú)標(biāo)點(diǎn)時(shí)段名非數(shù)字開(kāi)頭、無(wú)標(biāo)點(diǎn)時(shí)“|”可省略可省略;CODE|DATA指定代碼段或數(shù)據(jù)段指定代碼段或數(shù)據(jù)段;還有還有NOINIT表示數(shù)據(jù)段表示數(shù)據(jù)段是未初始化的或初始化為零。是未初始化的或初始化為零。a
14、ttr屬性如:屬性如:nREADONLY,只讀;,只讀;nREADWRITE,可讀寫;,可讀寫;nALIGN=數(shù)字表達(dá)式,值數(shù)字表達(dá)式,值0-31,按,按2的表達(dá)式冪次方對(duì)齊的表達(dá)式冪次方對(duì)齊方式,如方式,如0為為1字節(jié)對(duì)齊、字節(jié)對(duì)齊、1為為2字節(jié)對(duì)齊、字節(jié)對(duì)齊、2為為4字節(jié)對(duì)齊等字節(jié)對(duì)齊等(省略為(省略為4字節(jié)對(duì)齊)。字節(jié)對(duì)齊)。與源程序格式有關(guān)的偽操作2、PROC/ENDP函數(shù)起始函數(shù)起始/結(jié)束標(biāo)志,例:結(jié)束標(biāo)志,例:Reset_Handler PROC ;函數(shù)起始標(biāo)志;函數(shù)起始標(biāo)志START MOV R0,#15 ;R0 = 15 MOV R1,#8 ; R1 =8 ADDS R0,R0
15、,R1; R0 = R0 + R1 B START ENDP ;函數(shù)結(jié)束標(biāo)志;函數(shù)結(jié)束標(biāo)志 可以不用可以不用PROC/ENDP,使用的好處程序結(jié)構(gòu)清晰。,使用的好處程序結(jié)構(gòu)清晰。3、END偽操作:告訴編譯器已經(jīng)到了源程序的結(jié)尾。偽操作:告訴編譯器已經(jīng)到了源程序的結(jié)尾。第5章 匯編語(yǔ)言程序設(shè)計(jì)n5.1匯編語(yǔ)言概述n5.2 偽操作n5.3 分支、循環(huán)、子程序n5.4 匯編語(yǔ)言上機(jī)環(huán)境n5.5 匯編語(yǔ)言C語(yǔ)言混合編程ARM匯編器的偽操作在在ARM匯編語(yǔ)言程序里,有一些特殊指令助記符,這些助匯編語(yǔ)言程序里,有一些特殊指令助記符,這些助記符與指令系統(tǒng)的助記符不同,沒(méi)有相對(duì)應(yīng)的操作碼,通記符與指令系統(tǒng)的助
16、記符不同,沒(méi)有相對(duì)應(yīng)的操作碼,通常稱這些特殊指令助記符為偽操作。常稱這些特殊指令助記符為偽操作。偽操作不像機(jī)器指令那樣在程序運(yùn)行期間由機(jī)器執(zhí)行,偽偽操作不像機(jī)器指令那樣在程序運(yùn)行期間由機(jī)器執(zhí)行,偽操作在源程序中的作用是為完成匯編程序作各種準(zhǔn)備工作操作在源程序中的作用是為完成匯編程序作各種準(zhǔn)備工作的,這些偽操作僅在匯編過(guò)程中起作用,一旦匯編結(jié)束,的,這些偽操作僅在匯編過(guò)程中起作用,一旦匯編結(jié)束,偽操作的使命就完成。偽操作的使命就完成。在在ARM的匯編程序中,有如下幾種偽操作:的匯編程序中,有如下幾種偽操作: 符號(hào)定義(符號(hào)定義(Symbol Definition)偽操作)偽操作 數(shù)據(jù)定義(數(shù)據(jù)定
17、義(Data Definition)偽操作)偽操作 匯編控制(匯編控制(Assembly Control)偽操作)偽操作 框架描述(框架描述(Frame Description)偽操作)偽操作 信息報(bào)告信息報(bào)告(Reporting) 偽操作偽操作 其它(其它(Miscellaneous)偽操作。)偽操作。ARM匯編器的偽操作5.2.1 符號(hào)定義偽操作符號(hào)定義偽操作用于定義符號(hào)定義偽操作用于定義ARM匯編程序中的變量、對(duì)變量賦值匯編程序中的變量、對(duì)變量賦值以及定義寄存器的別名等操作。常見(jiàn)的符號(hào)定義偽操作有如以及定義寄存器的別名等操作。常見(jiàn)的符號(hào)定義偽操作有如下幾種:下幾種: 用于定義全局變量的用
18、于定義全局變量的 GBLA、GBLL和和GBLS。 用于定義局部變量的用于定義局部變量的 LCLA、LCLL和和LCLS。 用于對(duì)變量賦值的用于對(duì)變量賦值的 SETA、SETL、SETS。 1. 全局變量聲明全局變量聲明GBLA、GBLL和和GBLS 格格 式:式:GBLA(GBLL或或GBLS)全局變量名)全局變量名 功功 能:能:GBLA、GBLL和和GBLS偽操作用于定義一個(gè)偽操作用于定義一個(gè)ARM程序中的程序中的全局變量,并將其初始化。全局變量,并將其初始化。GBLA偽操作用于定義一個(gè)全局的偽操作用于定義一個(gè)全局的數(shù)值數(shù)值變量,并初始化為變量,并初始化為0;GBLL偽操作用于定義一個(gè)全
19、局的偽操作用于定義一個(gè)全局的邏輯邏輯變量,并初始化為變量,并初始化為F(假);(假);GBLS偽操作用于定義一個(gè)全局的偽操作用于定義一個(gè)全局的字符串字符串變量,并初始化為空;變量,并初始化為空;5.2.1 符號(hào)定義偽操作 例例 2 使用示例:使用示例: GBLA A1 ;定義一個(gè)全局的數(shù)值變量,變量名為;定義一個(gè)全局的數(shù)值變量,變量名為A1 A1 SETA 0 x0F ;將該變量賦值為;將該變量賦值為0 x0F GBLL A2 ;定義一個(gè)全局的邏輯變量,變量名為;定義一個(gè)全局的邏輯變量,變量名為A2 A2 SETL TRUE ;將該變量賦值為真;將該變量賦值為真 GBLS A3 ;定義一個(gè)全局
20、的字符串變量,變量名為;定義一個(gè)全局的字符串變量,變量名為A3 A3 SETS “Testing” ;將該變量賦值為;將該變量賦值為“Testing” 5.2.1 符號(hào)定義偽操作5.2.1 符號(hào)定義偽操作 2. LCLA、LCLL和和LCLS 格式:格式:LCLA(LCLL或或LCLS)局部變量名)局部變量名 功功 能:能:LCLA、LCLL和和LCLS偽操作用于定義一個(gè)偽操作用于定義一個(gè)ARM程序中程序中的局部變量,并將其初始化。的局部變量,并將其初始化。LCLA偽操作用于定義一個(gè)局部的偽操作用于定義一個(gè)局部的數(shù)值數(shù)值變量,并初始化為變量,并初始化為0;LCLL偽操作用于定義一個(gè)局部的偽操作
21、用于定義一個(gè)局部的邏輯邏輯變量,并初始化為變量,并初始化為F(假);(假);LCLS偽操作用于定義一個(gè)局部的偽操作用于定義一個(gè)局部的字符串字符串變量,并初始化為空;變量,并初始化為空;21 例例 3 使用示例:使用示例:LCLA Test4 ;聲明一個(gè)局部的數(shù)值變量,變量名為;聲明一個(gè)局部的數(shù)值變量,變量名為Test4Test4 SETA 0 xaa ;將該變量賦值為;將該變量賦值為0 xaaLCLL Test5 ;聲明一個(gè)局部的邏輯變量,變量名為;聲明一個(gè)局部的邏輯變量,變量名為Test5Test5 SETL TRUE ;將該變量賦值為真;將該變量賦值為真LCLS Test6 ;定義一個(gè)局部
22、的字符串變量,變量名為;定義一個(gè)局部的字符串變量,變量名為Test6Test6 SETS “Testing” ;將該變量賦值為;將該變量賦值為“Testing” 5.2.1 符號(hào)定義偽操作3. SETA、SETL和和SETS 格格 式:變量名式:變量名SETA(SETL或或SETS)表達(dá)式)表達(dá)式 功功 能:偽操作能:偽操作SETA、SETL、SETS用于給一個(gè)已經(jīng)定義用于給一個(gè)已經(jīng)定義的全局變量或局部變量賦值。的全局變量或局部變量賦值。SETA偽操作用于給一個(gè)偽操作用于給一個(gè)數(shù)值數(shù)值變量賦值;變量賦值;SETL偽操作用于給一個(gè)偽操作用于給一個(gè)邏輯邏輯變量賦值;變量賦值;SETS偽操作用于給一
23、個(gè)偽操作用于給一個(gè)字符串字符串變量賦值;變量賦值;235.2.1 符號(hào)定義偽操作 例例 4 使用示例:使用示例: LCLA Test3 ;聲明一個(gè)局部的數(shù)值變量,變量名為;聲明一個(gè)局部的數(shù)值變量,變量名為Test3 Test3 SETA 0 xaa ;將該變量賦值為;將該變量賦值為0 xaa LCLL Test4 ;聲明一個(gè)局部的邏輯變量,變量名為;聲明一個(gè)局部的邏輯變量,變量名為Test4 Test4 SETL TRUE ;將該變量賦值為真;將該變量賦值為真5.2.1 符號(hào)定義偽操作 4. RLIST 格格 式:名稱式:名稱 RLIST 寄存器列表寄存器列表 功功 能:能:RLIST偽操作可
24、用于對(duì)一個(gè)通用寄存器列表定義名稱,偽操作可用于對(duì)一個(gè)通用寄存器列表定義名稱,使用該偽操作定義的名稱可在使用該偽操作定義的名稱可在ARM指令指令LDM/STM中使用。中使用。 在在LDM/STM指令中,列表中的寄存器訪問(wèn)次序?yàn)楦鶕?jù)寄存器的指令中,列表中的寄存器訪問(wèn)次序?yàn)楦鶕?jù)寄存器的編號(hào)由低到高,而與列表中的寄存器排列次序無(wú)關(guān)。編號(hào)由低到高,而與列表中的寄存器排列次序無(wú)關(guān)。 5.2.1 符號(hào)定義偽操作 例例 5 使用示例:使用示例: RegList RLIST R0-R5,R8,R10 ;將寄存器列表名稱定;將寄存器列表名稱定義為義為RegList, 在程序中使用:在程序中使用: STMFD SP
25、!,RegList ;存儲(chǔ)列表到堆棧;存儲(chǔ)列表到堆棧 LDMIA R5,RegList ;加載列表;加載列表265.2.1 符號(hào)定義偽操作5.2.1 符號(hào)定義偽操作(總結(jié))符號(hào)符號(hào):標(biāo)號(hào)、變量、常量、寄存器別名、函數(shù)名標(biāo)號(hào)、變量、常量、寄存器別名、函數(shù)名;n標(biāo)號(hào)是指令的符號(hào)地址只在代碼段中被定義;n變量是操作數(shù)的符號(hào)地址可在數(shù)據(jù)段和代碼段中定義;符號(hào)定義偽操作符號(hào)定義偽操作:n定義變量、常量、寄存器別名的操作,及其賦值的操作。符號(hào)定義偽操作(總結(jié))1、全局級(jí)變量定義偽操作:、全局級(jí)變量定義偽操作:GBLA、GBLL和和GBLS 語(yǔ)法:語(yǔ)法: nX為A定義一個(gè)全局?jǐn)?shù)值變量并初始化為0;nX為L(zhǎng)定
26、義一個(gè)全局邏輯變量并初始化為FULS;nX為S定義一個(gè)全局字符串變量并初始化為空串;2、局部變量定義偽操作:、局部變量定義偽操作:LCLA、LCLL和和LCLS 語(yǔ)法:語(yǔ)法: nX:A指數(shù)值、L指邏輯、S指字符串n局部變量定義要在局部如一個(gè)宏內(nèi)( MACRO-MEND)。3、變量的賦值偽操作:、變量的賦值偽操作:SETA、 SETL、 SETS 語(yǔ)法:語(yǔ)法: n數(shù)值用0 x開(kāi)頭的十六進(jìn)制數(shù),n邏輯值:TRUE、FULS,n字符串用雙引號(hào)圍起來(lái)“”。符號(hào)定義偽操作(總結(jié))例例1:全局級(jí)變量定義與賦值:全局級(jí)變量定義與賦值 GBLA Test1;定義全局?jǐn)?shù)字變量Test1Test1 SETA 0
27、xaa ;將Test1變量賦值為0 xaa GBLL Test2;定義全局邏輯變量Test2Test2 SETL TRUE;將該變量賦值為真例例2:局部變量需在宏內(nèi)定義與賦值:局部變量需在宏內(nèi)定義與賦值: MACRO ;宏開(kāi)始標(biāo)記$IRQ_Label HANDLER $IRQ_Exception; HANDLER宏名 LCLS Test3 ;宏內(nèi)定義局部字符串Test3 SETS Testing ;Test3=“Testing” MEND ;宏結(jié)束標(biāo)記符號(hào)定義偽操作(總結(jié))4、寄存器別名定義偽操作:、寄存器別名定義偽操作:RLIST,將一個(gè)或幾個(gè)通用寄,將一個(gè)或幾個(gè)通用寄存器定義一個(gè)名稱,如該
28、名稱可在存器定義一個(gè)名稱,如該名稱可在LDM/STM指令中使用。指令中使用。語(yǔ)法:語(yǔ)法: RegListName RLIST R0-R6,R8,R10-R125、常量定義偽操作:、常量定義偽操作:EQU(可用(可用*代替),將一個(gè)數(shù)值或寄代替),將一個(gè)數(shù)值或寄存器的值賦給常量、標(biāo)號(hào)。語(yǔ)法:存器的值賦給常量、標(biāo)號(hào)。語(yǔ)法: 符號(hào)名符號(hào)名 EQU 表達(dá)式表達(dá)式n表達(dá)式值給常量、標(biāo)號(hào)。n賦值以后的常量,可以用作數(shù)據(jù)地址、代碼地址、位地址或者直接當(dāng)做一個(gè)立即數(shù)使用。例: const1 EQU 0X1234 ;const1值為值為1234 MOV R0,#const1 ;R0 = 1234符號(hào)定義偽操作(
29、總結(jié))6、工程級(jí)標(biāo)號(hào)定義偽操作:、工程級(jí)標(biāo)號(hào)定義偽操作:EXPORT(或(或GLOBAL),該全局標(biāo)號(hào)可在其他的文件中引用。語(yǔ)法:該全局標(biāo)號(hào)可在其他的文件中引用。語(yǔ)法: EXPORT symbol WEAKnsymbol,標(biāo)號(hào)名。nWEAK選項(xiàng)聲明其他同名標(biāo)號(hào)優(yōu)先于該標(biāo)號(hào)被引用。例:例: EXPORT Stest ;聲明一個(gè)可全局引用的標(biāo)號(hào)聲明一個(gè)可全局引用的標(biāo)號(hào)Stest7、其他:、其他:CN為協(xié)處理器的寄存器定義名稱為協(xié)處理器的寄存器定義名稱CP為協(xié)處理器定義名稱DN/SN為雙精度/單精度VFP的寄存器定義名稱FN為FPA浮點(diǎn)寄存器定義名稱5.2.2 數(shù)據(jù)定義偽操作 數(shù)據(jù)定義偽操作用于為特
30、定的數(shù)據(jù)分配存儲(chǔ)單元,同時(shí)可完成已數(shù)據(jù)定義偽操作用于為特定的數(shù)據(jù)分配存儲(chǔ)單元,同時(shí)可完成已分配存儲(chǔ)單元的初始化。常見(jiàn)的數(shù)據(jù)定義偽操作有如下幾種:分配存儲(chǔ)單元的初始化。常見(jiàn)的數(shù)據(jù)定義偽操作有如下幾種: DCB 分配一片連續(xù)的分配一片連續(xù)的字節(jié)字節(jié)存儲(chǔ)單元并初始化。存儲(chǔ)單元并初始化。 DCW(DCWU)分配一片連續(xù)的)分配一片連續(xù)的半字半字存儲(chǔ)單元并初始化。存儲(chǔ)單元并初始化。 DCD(DCDU)分配一片連續(xù)的)分配一片連續(xù)的字字存儲(chǔ)單元并初始化。存儲(chǔ)單元并初始化。 DCQ(DCQU)分配一片以)分配一片以8字節(jié)為單位字節(jié)為單位的連續(xù)的存儲(chǔ)單元并初始化。的連續(xù)的存儲(chǔ)單元并初始化。 DCFS(DCFS
31、U)為)為單精度浮點(diǎn)數(shù)單精度浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并初始化。分配一片連續(xù)的字存儲(chǔ)單元并初始化。 DCFD(DCFDU)為)為雙精度浮點(diǎn)數(shù)雙精度浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并初始化。分配一片連續(xù)的字存儲(chǔ)單元并初始化。5.2.2 數(shù)據(jù)定義偽操作 SPACE 分配一片連續(xù)的存儲(chǔ)單元。分配一片連續(xù)的存儲(chǔ)單元。 FIELD定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域。定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域。 MAP定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址。定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址。 LTORG定義一個(gè)數(shù)據(jù)緩沖池定義一個(gè)數(shù)據(jù)緩沖池(literal pool)的開(kāi)始。的開(kāi)始。33 1. DCB 格格 式:標(biāo)號(hào)式:標(biāo)號(hào) DCB
32、表達(dá)式表達(dá)式 功功 能:能:DCB偽操作用于分配一片連續(xù)的字節(jié)存儲(chǔ)單元并用偽操偽操作用于分配一片連續(xù)的字節(jié)存儲(chǔ)單元并用偽操作中指定作中指定 的表達(dá)式初始化。其中,表達(dá)式可以為的表達(dá)式初始化。其中,表達(dá)式可以為0255的數(shù)值或字的數(shù)值或字符串。符串。 DCB也可用也可用“=”代替。代替。使用示例:使用示例:Str DCB “This is a test!” ;分配一片連續(xù)的字節(jié)存儲(chǔ)單元并初始;分配一片連續(xù)的字節(jié)存儲(chǔ)單元并初始化。化。5.2.2 數(shù)據(jù)定義偽操作5.2.2 數(shù)據(jù)定義偽操作 2. DCW(DCWU) 格格 式:標(biāo)號(hào)式:標(biāo)號(hào)DCW(或(或DCWU)表達(dá)式)表達(dá)式 功功 能:能:DCW(或
33、(或DCWU)偽操作用于分配一片連續(xù)的半字存儲(chǔ))偽操作用于分配一片連續(xù)的半字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。其中,表達(dá)式可以為程單元并用偽操作中指定的表達(dá)式初始化。其中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)值表達(dá)式。用序標(biāo)號(hào)或數(shù)值表達(dá)式。用DCW分配的字存儲(chǔ)單元是半字對(duì)齊的分配的字存儲(chǔ)單元是半字對(duì)齊的,而用,而用DCWU分配的字存儲(chǔ)單元并不嚴(yán)格按照半字對(duì)齊。分配的字存儲(chǔ)單元并不嚴(yán)格按照半字對(duì)齊。使用示例:使用示例: DataTest DCW 1,2,3 ;分配一片連續(xù)的半字存儲(chǔ)單元并初始化;分配一片連續(xù)的半字存儲(chǔ)單元并初始化。35 3. DCD(或(或DCDU) 格格 式:標(biāo)號(hào)式:標(biāo)號(hào)DCD(或(
34、或DCDU)表達(dá)式)表達(dá)式 功功 能:能:DCD(或(或DCDU)偽操作用于分配一片連續(xù)的字存儲(chǔ))偽操作用于分配一片連續(xù)的字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。其中,表達(dá)式可以為單元并用偽操作中指定的表達(dá)式初始化。其中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)值表達(dá)式。程序標(biāo)號(hào)或數(shù)值表達(dá)式。DCD也可用也可用“&”代替。用代替。用DCD分配分配的字存儲(chǔ)單元是字對(duì)齊的,而用的字存儲(chǔ)單元是字對(duì)齊的,而用DCDU分配的字存儲(chǔ)單元并不分配的字存儲(chǔ)單元并不嚴(yán)格按照字對(duì)齊。嚴(yán)格按照字對(duì)齊。使用示例:使用示例: DataTest DCD 4,5,6 ;分配一片連續(xù)的字存儲(chǔ)單元并初始化;分配一片連續(xù)的字存儲(chǔ)單元并
35、初始化。5.2.2 數(shù)據(jù)定義偽操作4. DCQ(或或DCQU) 格格 式:標(biāo)號(hào)式:標(biāo)號(hào) DCQ(或(或DCQU)表達(dá)式)表達(dá)式 功功 能:能:DCQ(或(或DCQU)偽操作用于分配一片以)偽操作用于分配一片以8個(gè)字節(jié)為單個(gè)字節(jié)為單位的連續(xù)存儲(chǔ)區(qū)域并用偽操作中指定的表達(dá)式初始化。用位的連續(xù)存儲(chǔ)區(qū)域并用偽操作中指定的表達(dá)式初始化。用DCQ分配的存儲(chǔ)單元是字對(duì)齊的,而用分配的存儲(chǔ)單元是字對(duì)齊的,而用DCQU分配的存儲(chǔ)單分配的存儲(chǔ)單元并不嚴(yán)格按照字對(duì)齊。元并不嚴(yán)格按照字對(duì)齊。使用示例:使用示例: DataTest DCQ 100 ;分配一片連續(xù)的存儲(chǔ)單元并初始化為指;分配一片連續(xù)的存儲(chǔ)單元并初始化為指
36、定的值。定的值。5.2.2 數(shù)據(jù)定義偽操作5. DCFS(或(或DCFSU) 格格 式:標(biāo)號(hào)式:標(biāo)號(hào)DCFS(或(或DCFSU)表達(dá)式)表達(dá)式 功功 能:能:DCFS(或(或DCFSU)偽操作用于為單精度浮點(diǎn)數(shù)分配)偽操作用于為單精度浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。一片連續(xù)的字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。每個(gè)單精度浮點(diǎn)數(shù)占據(jù)一個(gè)字單元。用每個(gè)單精度浮點(diǎn)數(shù)占據(jù)一個(gè)字單元。用DCFS分配的字存儲(chǔ)單分配的字存儲(chǔ)單元是字對(duì)齊的,而用元是字對(duì)齊的,而用DCFSU分配的字存儲(chǔ)單元并不嚴(yán)格按照分配的字存儲(chǔ)單元并不嚴(yán)格按照字對(duì)齊。字對(duì)齊。使用示例:使用示例:Fdata
37、Test DCFS 2E5,-5E7 ;分配一片連;分配一片連 續(xù)的字存儲(chǔ)單元并續(xù)的字存儲(chǔ)單元并初始化為指定的單精度數(shù)。初始化為指定的單精度數(shù)。 5.2.2 數(shù)據(jù)定義偽操作6. DCFD(或(或DCFDU) 格格 式:標(biāo)號(hào)式:標(biāo)號(hào) DCFD(或(或DCFDU)表達(dá)式)表達(dá)式 功功 能:能:DCFD(或(或DCFDU)偽操作用于為雙精度的浮點(diǎn)數(shù))偽操作用于為雙精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化分配一片連續(xù)的字存儲(chǔ)單元并用偽操作中指定的表達(dá)式初始化。每個(gè)雙精度的浮點(diǎn)數(shù)占據(jù)兩個(gè)字單元。用。每個(gè)雙精度的浮點(diǎn)數(shù)占據(jù)兩個(gè)字單元。用DCFD分配的字存分配的字存儲(chǔ)單元是字對(duì)齊的
38、,而用儲(chǔ)單元是字對(duì)齊的,而用DCFDU分配的字存儲(chǔ)單元并不嚴(yán)格分配的字存儲(chǔ)單元并不嚴(yán)格按照字對(duì)齊。按照字對(duì)齊。使用示例:使用示例:FdataTest DCFD 2E115,-5E7 ;分配一片連續(xù)的字存儲(chǔ)單元并初;分配一片連續(xù)的字存儲(chǔ)單元并初始化為指定的雙精度數(shù)。始化為指定的雙精度數(shù)。 5.2.2 數(shù)據(jù)定義偽操作 7. SPACE 格格 式:標(biāo)號(hào)式:標(biāo)號(hào) SPACE 表達(dá)式表達(dá)式 功功 能:能:SPACE偽操作用于分配一片連續(xù)的存儲(chǔ)區(qū)域并初始偽操作用于分配一片連續(xù)的存儲(chǔ)區(qū)域并初始化為化為0。其中,表達(dá)式為要分配的字節(jié)數(shù)。其中,表達(dá)式為要分配的字節(jié)數(shù)。SPACE也可用也可用“”代替。代替。使用示
39、例:使用示例:DataSpace SPACE 100 ;分配連續(xù);分配連續(xù)100字節(jié)的存儲(chǔ)單元并初始化字節(jié)的存儲(chǔ)單元并初始化為為0。5.2.2 數(shù)據(jù)定義偽操作5.2.2 數(shù)據(jù)定義偽操作8. MAP 格格 式:式:MAP表達(dá)式表達(dá)式,基址寄存器,基址寄存器 功功 能:能:MAP偽操作用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址。偽操作用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址。MAP也可用也可用“”代替。表達(dá)式可以為程序中的標(biāo)號(hào)或數(shù)學(xué)代替。表達(dá)式可以為程序中的標(biāo)號(hào)或數(shù)學(xué)表達(dá)式,基址寄存器為可選項(xiàng),表達(dá)式,基址寄存器為可選項(xiàng), 當(dāng)基址寄存器選項(xiàng)不存在時(shí)當(dāng)基址寄存器選項(xiàng)不存在時(shí),表達(dá)式的值即為內(nèi)存表的首地址,當(dāng)該選,
40、表達(dá)式的值即為內(nèi)存表的首地址,當(dāng)該選 項(xiàng)存在時(shí),內(nèi)存項(xiàng)存在時(shí),內(nèi)存表的首地址為表達(dá)式的值與基址寄存器的和。表的首地址為表達(dá)式的值與基址寄存器的和。MAP偽操作通偽操作通常與常與FIELD偽操作配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。偽操作配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。使用示例:使用示例:MAP 0 x100,R0 ;定義結(jié)構(gòu)化內(nèi)存表首地址的值為;定義結(jié)構(gòu)化內(nèi)存表首地址的值為0 x100R0。419. FILED 格格 式:標(biāo)號(hào)式:標(biāo)號(hào) FIELD 表達(dá)式表達(dá)式 功功 能:能:FIELD偽操作用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的偽操作用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的 數(shù)據(jù)域數(shù)據(jù)域。FILED也可用也可用“#”代替。表
41、達(dá)式的值為當(dāng)前數(shù)據(jù)域在內(nèi)存表中代替。表達(dá)式的值為當(dāng)前數(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)存表中的各個(gè)數(shù)據(jù)域,并可以為每個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)號(hào)供其它的中的各個(gè)數(shù)據(jù)域,并可以為每個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)號(hào)供其它的指令引用。指令引用。FIELD偽操作常與偽操作常與MAP偽操作配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存?zhèn)尾僮髋浜鲜褂脕?lái)定義結(jié)構(gòu)化的內(nèi)存表。表。43由由MAP偽操作和偽操作和FIELD偽操作配合定義的內(nèi)存表有偽操作配合定義的內(nèi)存表有3種:種: (1)表達(dá)式是一個(gè)基于絕對(duì)地址的內(nèi)存表表
42、達(dá)式是一個(gè)基于絕對(duì)地址的內(nèi)存表,例如:例如: MAP 0 x100 ;定義結(jié)構(gòu)化內(nèi)存表首地址的值為;定義結(jié)構(gòu)化內(nèi)存表首地址的值為0 x100。 A FIELD 4 ;定義;定義A的長(zhǎng)度為的長(zhǎng)度為4字節(jié),位置為字節(jié),位置為0 x100 B FIELD 4 ;定義;定義B的長(zhǎng)度為的長(zhǎng)度為4字節(jié),位置為字節(jié),位置為0 x104 S FIELD 16 ;定義;定義S的長(zhǎng)度為的長(zhǎng)度為16字節(jié),位置為字節(jié),位置為0 x108 5.2.2 數(shù)據(jù)定義偽操作5.2.2 數(shù)據(jù)定義偽操作分析:上面的偽操作序列定義了一個(gè)內(nèi)存表,其首地址為固定分析:上面的偽操作序列定義了一個(gè)內(nèi)存表,其首地址為固定地址地址0 x100,
43、該內(nèi)存表中包含,該內(nèi)存表中包含3個(gè)數(shù)據(jù)域:個(gè)數(shù)據(jù)域:A長(zhǎng)度為長(zhǎng)度為4字節(jié),相字節(jié),相對(duì)表首的相對(duì)地址為對(duì)表首的相對(duì)地址為0;B的長(zhǎng)度為的長(zhǎng)度為4 字節(jié),相對(duì)地址為字節(jié),相對(duì)地址為4;S的長(zhǎng)度為的長(zhǎng)度為16字節(jié),相對(duì)地址為字節(jié),相對(duì)地址為8。在指令中可以這樣引用內(nèi)存表中的數(shù)據(jù)域:在指令中可以這樣引用內(nèi)存表中的數(shù)據(jù)域: LDR R0,=A ;使用偽指令讀?。皇褂脗沃噶钭x取A的地址,地址是的地址,地址是 0 x100LDR R1,R0 ;將;將A地址處對(duì)應(yīng)的內(nèi)容加載到地址處對(duì)應(yīng)的內(nèi)容加載到R145 (2)表達(dá)式是一個(gè)數(shù)值,是一個(gè)基于相對(duì)地址的內(nèi)存表,例如:表達(dá)式是一個(gè)數(shù)值,是一個(gè)基于相對(duì)地址的內(nèi)存表
44、,例如:MAP 0 x04,R9 ;定義結(jié)構(gòu)化內(nèi)存表首地址的值為;定義結(jié)構(gòu)化內(nèi)存表首地址的值為R9寄存器寄存器的值。的值。 DATA1 FIELD 4 ;定義;定義A的長(zhǎng)度為的長(zhǎng)度為4字節(jié),相對(duì)位置為字節(jié),相對(duì)位置為0 DATA2 FIELD 8 ;定義;定義B的長(zhǎng)度為的長(zhǎng)度為8字節(jié),相對(duì)位置為字節(jié),相對(duì)位置為4 STRING FIELD 96 ;定義;定義S的長(zhǎng)度為的長(zhǎng)度為96字節(jié),相對(duì)位置為字節(jié),相對(duì)位置為12 5.2.2 數(shù)據(jù)定義偽操作可通過(guò)下面的指令訪問(wèn)地址范圍超過(guò)可通過(guò)下面的指令訪問(wèn)地址范圍超過(guò)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 ;讀?。蛔x取DATA1數(shù)據(jù)數(shù)據(jù) LDR R9,=0 x2000 ;同一個(gè)內(nèi)存表,重新定義為;同一個(gè)內(nèi)存表,重新定義為0 x2004 ADR R1,DATA2 ;讀取;讀取DATA2的地址,是的地址,是 0 x2008 STR R9,R1 ;把;把R9的地址存儲(chǔ)到的地址存儲(chǔ)到DATA2475.2.2 數(shù)據(jù)定義偽操作 分析:上面的偽操作序列定義了一個(gè)內(nèi)存表,其首地址是基分析:上面的偽操作序列定義了一個(gè)內(nèi)存表,其首地址是基于寄存器于寄存器R9中的內(nèi)容,而
46、不是一個(gè)固定地址,通過(guò)在中的內(nèi)容,而不是一個(gè)固定地址,通過(guò)在LDR指令中指定不同的基址寄存器值,定義的內(nèi)存表結(jié)構(gòu)可在指令中指定不同的基址寄存器值,定義的內(nèi)存表結(jié)構(gòu)可在程序中有多個(gè)實(shí)例??啥啻问褂贸绦蛑杏卸鄠€(gè)實(shí)例。可多次使用LDR指令,用以實(shí)現(xiàn)不同指令,用以實(shí)現(xiàn)不同的程序?qū)嵗?。的程序?qū)嵗?85.2.2 數(shù)據(jù)定義偽操作 (3)表達(dá)式是一個(gè)標(biāo)號(hào),基于)表達(dá)式是一個(gè)標(biāo)號(hào),基于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的長(zhǎng)度為的長(zhǎng)度為4字節(jié),相對(duì)位置為字節(jié),相對(duì)位置為0 B FIELD 4 ;定義;定義B的長(zhǎng)度為的長(zhǎng)度為4字節(jié),相對(duì)位置為字節(jié),相對(duì)位置為4 S FIELD 4 ;定義;定義S的長(zhǎng)度為的長(zhǎng)度為4字節(jié),相對(duì)位置為字節(jié),相對(duì)位置為8 可通過(guò)下面的指令訪問(wèn)地址范圍不超過(guò)可通過(guò)下面的指令訪問(wèn)地址范圍不超過(guò)4KB的數(shù)據(jù)。的數(shù)據(jù)。 LDR R5,B ;相當(dāng)于;相當(dāng)于LDR R5,PC,#4 5.2.2 數(shù)據(jù)定義偽操作5.2.2 數(shù)據(jù)定義偽操作分析:這里內(nèi)存表中各數(shù)據(jù)域的實(shí)際內(nèi)存地址是基于分析:這里內(nèi)存表中各數(shù)據(jù)域的實(shí)際內(nèi)存地址是基于PC寄存器寄存器的值,而不是基于一個(gè)固定的地址。
48、的值,而不是基于一個(gè)固定的地址。PC的值不是固定的,但的值不是固定的,但分配的內(nèi)存單元是固定的,也就是說(shuō),分配的內(nèi)存單元是固定的,也就是說(shuō),PC的值加上一個(gè)偏移的值加上一個(gè)偏移量的值才是內(nèi)存單元的值,這樣偏移量的值便是不固定的。量的值才是內(nèi)存單元的值,這樣偏移量的值便是不固定的。在使用在使用LDR指令訪問(wèn)表中的數(shù)據(jù)域時(shí),不必使用基址寄存器指令訪問(wèn)表中的數(shù)據(jù)域時(shí),不必使用基址寄存器。50 10. LTORG 格格 式:式:LTORG 功功 能:用于聲明一個(gè)數(shù)據(jù)緩沖池能:用于聲明一個(gè)數(shù)據(jù)緩沖池(也稱為文字池也稱為文字池)的開(kāi)始,當(dāng)?shù)拈_(kāi)始,當(dāng)程序中使用程序中使用LDR之類的指令時(shí),數(shù)據(jù)緩沖區(qū)的使用可
49、能越界。為之類的指令時(shí),數(shù)據(jù)緩沖區(qū)的使用可能越界。為防止越界發(fā)生,可使用防止越界發(fā)生,可使用LTORG偽操作定義數(shù)據(jù)緩沖池。偽操作定義數(shù)據(jù)緩沖池。ARM匯匯編編譯器一般把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一個(gè)代碼編編譯器一般把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一個(gè)代碼段開(kāi)始之前,或者段開(kāi)始之前,或者END偽操作之前。偽操作之前。LTORG偽操作通常放在無(wú)偽操作通常放在無(wú)條件跳轉(zhuǎn)指令之后條件跳轉(zhuǎn)指令之后, 或者子程序返回指令之后或者子程序返回指令之后,這樣處理器就不會(huì)這樣處理器就不會(huì)錯(cuò)誤地將數(shù)據(jù)緩沖池錯(cuò)誤地將數(shù)據(jù)緩沖池 中的數(shù)據(jù)當(dāng)作指令來(lái)執(zhí)行。中的數(shù)據(jù)當(dāng)作指令來(lái)執(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 ;從當(dāng)前位置開(kāi)始分配;從當(dāng)前位置開(kāi)始分配40個(gè)字個(gè)字節(jié)并初始化為節(jié)并初始化為0 END525.2.2 數(shù)據(jù)定義偽操作(總結(jié))數(shù)據(jù)定義偽操作一般用于為特定的數(shù)據(jù)分配存儲(chǔ)單元,同數(shù)據(jù)定義偽操作一般用于為特定的數(shù)據(jù)分配存儲(chǔ)單元,同時(shí)可完成已分配存儲(chǔ)單元的初始化。時(shí)可完成已分配存儲(chǔ)單元的初始化。DCB
51、分配一片連續(xù)的分配一片連續(xù)的字節(jié)存儲(chǔ)單元字節(jié)存儲(chǔ)單元并用指定的數(shù)據(jù)初始化并用指定的數(shù)據(jù)初始化nDCW(DCWU) 半字存儲(chǔ)單元nDCD(DCDU) 字存儲(chǔ)單元nDCQ(DCQU) 雙字存儲(chǔ)單元nDCFD(DCFDU) 雙精度浮點(diǎn)數(shù)的字存儲(chǔ)單元nDCFS(DCFSU) 單精度浮點(diǎn)數(shù)的字存儲(chǔ)單元DCD為例,語(yǔ)法:為例,語(yǔ)法: 標(biāo)號(hào)標(biāo)號(hào) DCD expr,expr -標(biāo)號(hào)可省略;標(biāo)號(hào)可省略; - expr表達(dá)式可多個(gè),可是程序標(biāo)號(hào)或數(shù)值表達(dá)式;表達(dá)式可多個(gè),可是程序標(biāo)號(hào)或數(shù)值表達(dá)式;數(shù)據(jù)定義偽操作(總結(jié))DCD偽操作舉例偽操作舉例: _Vectors DCD _initial_sp DCD Rese
52、t_Handler ;標(biāo)號(hào)省略;標(biāo)號(hào)省略 DCD 0 DCD 4,5,6SPACE偽操作:偽操作:分配一片連續(xù)的存儲(chǔ)區(qū)并初始化分配一片連續(xù)的存儲(chǔ)區(qū)并初始化0,語(yǔ)法:,語(yǔ)法: 標(biāo)號(hào)名標(biāo)號(hào)名 SPACE 表達(dá)式表達(dá)式n標(biāo)號(hào)名,可選項(xiàng)。n表達(dá)式,分配的字節(jié)數(shù)。例:分配連續(xù)例:分配連續(xù)100字節(jié)的存儲(chǔ)單元并初始化為字節(jié)的存儲(chǔ)單元并初始化為0。 DataSpace SPACE 100數(shù)據(jù)定義偽操作(總結(jié))MAP 定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址,語(yǔ)法:定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址,語(yǔ)法: MAP expr,base-registernexpr表達(dá)式存儲(chǔ)到結(jié)構(gòu)化內(nèi)存表首地址nbase-register,指定一
53、個(gè)寄存器,包含這一項(xiàng)時(shí),結(jié)構(gòu)化內(nèi)存表的首地址為expr和base-register值的和。FIELD 定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域,語(yǔ)法:定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域,語(yǔ)法: label FIELD exprnlabel標(biāo)號(hào)名,可選項(xiàng)。nexpr表達(dá)式,F(xiàn)IELD指定的域所占內(nèi)存單元字節(jié)數(shù)。MAP偽操作通常與偽操作通常與FIELD偽操作配合使用來(lái)定義結(jié)構(gòu)化的偽操作配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。內(nèi)存表。數(shù)據(jù)定義偽操作(總結(jié))例:定義一個(gè)內(nèi)存表,首地址為固定地址例:定義一個(gè)內(nèi)存表,首地址為固定地址0 x100。該結(jié)構(gòu)化。該結(jié)構(gòu)化內(nèi)存表包含內(nèi)存表包含3個(gè)域:個(gè)域:A的長(zhǎng)度為的長(zhǎng)度為16個(gè)字節(jié),位
54、置為個(gè)字節(jié),位置為0 x100;B的長(zhǎng)度為的長(zhǎng)度為32個(gè)字節(jié),位置為個(gè)字節(jié),位置為0 x110;S的長(zhǎng)度為的長(zhǎng)度為256個(gè)字節(jié),個(gè)字節(jié),位置為位置為0 x130。n MAP 0 x100;結(jié)構(gòu)化內(nèi)存表首地址的值為0 x100nA FIELD 16;定義A的長(zhǎng)度為16字節(jié),位置為0 x100nB FIELD 32;定義B的長(zhǎng)度為32字節(jié),位置為0 x110nS FIELD 256;定義S的長(zhǎng)度為256字節(jié),位置為0 x1305.2.3 匯編控制偽操作匯編控制偽操作用于控制匯編程序的執(zhí)行流程,常用的匯編控制匯編控制偽操作用于控制匯編程序的執(zhí)行流程,常用的匯編控制偽操作包括以下幾條:偽操作包括以下幾
55、條: IF、ELSE、ENDIF WHILE、WEND MACRO、MEND、MEXIT5.2.3 匯編控制偽操作 1. IF、ELSE、ENDIF 格格 式:式: IF 邏輯表達(dá)式邏輯表達(dá)式 指令序列指令序列1 ELSE 指令序列指令序列2 ENDIF功功 能:能:IF、ELSE、ENDIF偽操作能根據(jù)條件的成立與否決定是偽操作能根據(jù)條件的成立與否決定是否執(zhí)行某個(gè)指令序列。當(dāng)否執(zhí)行某個(gè)指令序列。當(dāng)IF后面的邏輯表達(dá)式為真,則執(zhí)行指后面的邏輯表達(dá)式為真,則執(zhí)行指令序列令序列1,否則執(zhí)行指令序列,否則執(zhí)行指令序列2。其中,。其中,ELSE及指令序列及指令序列2可以可以沒(méi)有,此時(shí),當(dāng)沒(méi)有,此時(shí),當(dāng)
56、IF后面的邏輯表達(dá)式為真,則執(zhí)行指令序列后面的邏輯表達(dá)式為真,則執(zhí)行指令序列1,否則繼續(xù)執(zhí)行后面的指令。,否則繼續(xù)執(zhí)行后面的指令。IF、 ELSE、ENDIF偽操作可以偽操作可以嵌套使用。嵌套使用。58 2. WHILE、WEND 格格 式:式:WHILE 邏輯表達(dá)式邏輯表達(dá)式 指令序列指令序列 WEND 功功 能:能:WHILE、WEND偽操作能根據(jù)條件的成立與否決定偽操作能根據(jù)條件的成立與否決定是否循環(huán)執(zhí)行某個(gè)指令序列。當(dāng)是否循環(huán)執(zhí)行某個(gè)指令序列。當(dāng)WHILE后面的邏輯表達(dá)式為真后面的邏輯表達(dá)式為真,則執(zhí)行指令序列,該指令序列執(zhí)行完畢后,再判斷邏輯表達(dá),則執(zhí)行指令序列,該指令序列執(zhí)行完畢后
57、,再判斷邏輯表達(dá)式的值,若為真則繼續(xù)執(zhí)行,一直到邏輯表達(dá)式的值為假。式的值,若為真則繼續(xù)執(zhí)行,一直到邏輯表達(dá)式的值為假。WHILE、WEND偽操作可以嵌套使用。偽操作可以嵌套使用。5.2.3 匯編控制偽操作使用示例:使用示例:GBLA Counter ;聲明一個(gè)全局的數(shù)學(xué)變量,變量名為;聲明一個(gè)全局的數(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 $標(biāo)號(hào)標(biāo)號(hào) 宏名宏名 $參數(shù)參數(shù)1,$參數(shù)參數(shù)2, 指令序列指令序列 MEXIT 指令序列指令序列 MEND功功 能:能:MACRO、MEND偽操作可以將一段代碼定義為一個(gè)偽操作可以將一段代碼定義為一個(gè)整體,稱為宏指令,然后就可以在程序中通過(guò)宏指令多次調(diào)整體,稱為宏指令,然后就可以在程序中通過(guò)宏指令多次調(diào)用該段代碼。其中,用該段代碼。其中,$標(biāo)號(hào)在宏指令被展開(kāi)時(shí),標(biāo)號(hào)會(huì)被替換標(biāo)號(hào)在宏指令被展開(kāi)時(shí),標(biāo)號(hào)會(huì)被替換為用戶定義的符號(hào),宏指令可以使用一個(gè)或多個(gè)參數(shù),當(dāng)宏為用戶定義的符號(hào),宏指令可以使用一個(gè)或多個(gè)參數(shù),當(dāng)宏指令被展開(kāi)時(shí),這些參數(shù)被相應(yīng)的值替換。指令被展開(kāi)時(shí),
59、這些參數(shù)被相應(yīng)的值替換。5.2.3 匯編控制偽操作宏指令的使用方式和功能與子程序有些相似,子程序可以提供宏指令的使用方式和功能與子程序有些相似,子程序可以提供模塊化的程序設(shè)計(jì)、節(jié)省存儲(chǔ)空間并提高運(yùn)行速度。但在使模塊化的程序設(shè)計(jì)、節(jié)省存儲(chǔ)空間并提高運(yùn)行速度。但在使用子程序結(jié)構(gòu)時(shí)需要保護(hù)現(xiàn)場(chǎng),從而增加了系統(tǒng)的開(kāi)銷,因用子程序結(jié)構(gòu)時(shí)需要保護(hù)現(xiàn)場(chǎng),從而增加了系統(tǒng)的開(kāi)銷,因此,在代碼較短且需要傳遞的參數(shù)較多時(shí),可以使用宏指令此,在代碼較短且需要傳遞的參數(shù)較多時(shí),可以使用宏指令代替子程序。包含在代替子程序。包含在MACRO和和MEND之間的指令序列稱為之間的指令序列稱為宏定義體,在宏定義體的第一行應(yīng)聲明宏
60、的原型(包含宏名宏定義體,在宏定義體的第一行應(yīng)聲明宏的原型(包含宏名、所需的參數(shù)),然后就可以在匯編程序中通過(guò)宏名來(lái)調(diào)用、所需的參數(shù)),然后就可以在匯編程序中通過(guò)宏名來(lái)調(diào)用該指令序列。該指令序列。625.2.3 匯編控制偽操作 MEXIT用于從宏定義中跳轉(zhuǎn)出去。在源程序被編譯時(shí),匯編用于從宏定義中跳轉(zhuǎn)出去。在源程序被編譯時(shí),匯編器將宏調(diào)用展開(kāi),用宏定義中的指令序列代替程序中的宏調(diào)器將宏調(diào)用展開(kāi),用宏定義中的指令序列代替程序中的宏調(diào)用,并將實(shí)際參數(shù)的值傳遞給宏定義中的形式參數(shù)。用,并將實(shí)際參數(shù)的值傳遞給宏定義中的形式參數(shù)。MACRO、MEND偽操作可以嵌套使用。偽操作可以嵌套使用。宏的標(biāo)號(hào)使用方法:標(biāo)號(hào)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 食品工藝學(xué)-第一章-緒論
- 2024專項(xiàng)房地產(chǎn)代購(gòu)協(xié)議范本
- 2024工程招投標(biāo)協(xié)議管理實(shí)訓(xùn)解析
- 安全法律法規(guī)清單
- 2024年度三方服務(wù)銷售業(yè)務(wù)協(xié)議范本
- 2024年度綜合咨詢業(yè)務(wù)協(xié)議
- 2024年度合板銷售與購(gòu)買協(xié)議
- 2024年水電安裝工程勞務(wù)協(xié)議細(xì)化
- 2024年貨物運(yùn)輸保障協(xié)議樣本
- 2024年招聘流程合規(guī)協(xié)議書范例
- 2024年公司工會(huì)工作計(jì)劃模版(三篇)
- 2024年秋季新人教版7年級(jí)上冊(cè)生物課件 第2單元 第1章大單元整體設(shè)計(jì)
- 炸藥及火工品生產(chǎn)過(guò)程中的安全防護(hù)技術(shù)考核試卷
- DBJ04∕T 292-2023 住宅物業(yè)服務(wù)標(biāo)準(zhǔn)
- 光伏組件回收再利用建設(shè)項(xiàng)目可行性研究報(bào)告寫作模板-拿地申報(bào)
- 副總經(jīng)理招聘筆試題及解答(某大型國(guó)企)
- 2024年工業(yè)和信息化部應(yīng)急通信保障中心招聘高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- 2024年“安康杯”安全知識(shí)競(jìng)賽培訓(xùn)試題及答案
- 教育部《中小學(xué)德育工作指南》-道德修養(yǎng)手冊(cè)
- 2024至2030年中國(guó)建筑設(shè)計(jì)行業(yè)市場(chǎng)調(diào)研分析及發(fā)展趨勢(shì)研究預(yù)測(cè)報(bào)告
- 《食品營(yíng)銷學(xué)》教案全本
評(píng)論
0/150
提交評(píng)論