版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第5章章 匯編語言程序設計匯編語言程序設計第5章 匯編語言程序設計n5.1匯編語言概述n5.2 偽操作n5.3 分支、循環(huán)、子程序n5.4 匯編語言上機環(huán)境n5.5 匯編語言C語言混合編程5.1 匯編語言概述 匯編語言:匯編語言:CPU提供的二進制機器指令的助記符的集合。提供的二進制機器指令的助記符的集合。匯編編譯器:把匯編語言源文件匯編成機器可執(zhí)行的二進匯編編譯器:把匯編語言源文件匯編成機器可執(zhí)行的二進制機器語言。制機器語言。特點:程序執(zhí)行速度快,程序代碼生成量少。特點:程序執(zhí)行速度快,程序代碼生成量少。缺點:不易學習的編程語言,可讀性較差,屬于低級語言缺點:不易學習的編程語言,可讀性較差
2、,屬于低級語言,需要對硬件有深刻的了解。,需要對硬件有深刻的了解。匯編語言概述一般用匯編語言編寫驅動程序、需要嚴格計算執(zhí)行時間的一般用匯編語言編寫驅動程序、需要嚴格計算執(zhí)行時間的程序以及需要加速執(zhí)行的程序。程序以及需要加速執(zhí)行的程序。設計匯編程序除了直接使用匯編指令,還需使用偽操作、設計匯編程序除了直接使用匯編指令,還需使用偽操作、偽指令等輔助進行程序設計。偽指令等輔助進行程序設計。偽操作:是一些特殊的指令助記符偽操作:是一些特殊的指令助記符, 只在匯編過程中起作只在匯編過程中起作用用,一旦匯編結束一旦匯編結束,偽操作的使命也就完成,不被匯編成機偽操作的使命也就完成,不被匯編成機器代碼。器代碼
3、。 如:數據定義、分配存儲區(qū)、指示程序結束等。如:數據定義、分配存儲區(qū)、指示程序結束等。偽指令:不是真正的機器指令,編譯器對源程序進行匯編偽指令:不是真正的機器指令,編譯器對源程序進行匯編處理時將被替換成相應的匯編指令。處理時將被替換成相應的匯編指令。本章介紹本章介紹ARM匯編器常用的偽操作、偽指令。匯編器常用的偽操作、偽指令。匯編語言概述 匯編語言基本語法:匯編語言基本語法:標號標號 操作碼操作碼 操作數操作數1, 操作數操作數2, ;注釋注釋標號標號 :如有必須頂格寫:如有必須頂格寫, 代表地址,代表地址,讓匯編器來計算程序轉移讓匯編器來計算程序轉移的地址的地址; 操作碼:指令操作碼:指令
4、|偽操作偽操作|偽指令偽指令 :前面至少有一個空格;:前面至少有一個空格;操作數:可以是變量、常量、指令地址、數據地址,而操作數操作數:可以是變量、常量、指令地址、數據地址,而操作數1通常是本指令的執(zhí)行結果存儲處。通常是本指令的執(zhí)行結果存儲處。ARM匯編語言程序的每行語句由匯編語言程序的每行語句由14個部分組成。格式如下:個部分組成。格式如下: LABEL OPERATION OPERAND ;COMMENT 標號域標號域 操作助記符域操作助記符域 操作數域操作數域 注釋域注釋域 (1)標號域標號域(Label) 標號域用來表示指令的地址、變量、過程名、數據的地址和常量。標號域用來表示指令的地
5、址、變量、過程名、數據的地址和常量。 標號是一個自行設計的標識符或名稱,語句標號可以是大小寫字母標號是一個自行設計的標識符或名稱,語句標號可以是大小寫字母混合,通常以字母開頭,由字母、數字、下劃線等組成?;旌希ǔR宰帜搁_頭,由字母、數字、下劃線等組成。 語句標號不能與寄存器名、指令助記符、偽指令語句標號不能與寄存器名、指令助記符、偽指令(操作操作)助記符、變助記符、變量名同名。量名同名。語句標號必須在一行的開頭書寫,不能留空格。語句標號必須在一行的開頭書寫,不能留空格。匯編語言概述 (2)操作助記符域操作助記符域(OPERATION) 操作助記符域可以為指令、偽操作、宏指令或偽指令的助記符。
6、操作助記符域可以為指令、偽操作、宏指令或偽指令的助記符。 ARM匯編器對大小寫敏感,在匯編語言程序設計中,每一條指匯編器對大小寫敏感,在匯編語言程序設計中,每一條指令的助記符可以全部用大寫、或全部用小寫,但不允許在一條令的助記符可以全部用大寫、或全部用小寫,但不允許在一條指令中大、小寫混用。指令中大、小寫混用。 所有的指令都不能在行的開頭書寫,必須在指令的前面有空格,所有的指令都不能在行的開頭書寫,必須在指令的前面有空格,然后再書寫指令。然后再書寫指令。 指令助記符和后面的操作數或操作寄存器之間必須有空格,不可指令助記符和后面的操作數或操作寄存器之間必須有空格,不可以在這之間使用逗號。以在這之
7、間使用逗號。偽操作是偽操作是ARM匯編語言程序里的一些特殊助記符,其作用匯編語言程序里的一些特殊助記符,其作用 主要是為完成匯編程序做的各種準備工作,在源程序進行主要是為完成匯編程序做的各種準備工作,在源程序進行 匯編時由匯編程序處理,而不是程序運行期間由機器執(zhí)行。匯編時由匯編程序處理,而不是程序運行期間由機器執(zhí)行。偽指令是偽指令是ARM匯編語言程序里的特殊指令助記符,也不在程匯編語言程序里的特殊指令助記符,也不在程序運行期間由機器執(zhí)行。它們在匯編時將被合適的機器指令序運行期間由機器執(zhí)行。它們在匯編時將被合適的機器指令代替成代替成Thumb指令,從而實現真正的指令操作。指令,從而實現真正的指令
8、操作。 宏指令是一段獨立的程序代碼,可插在源程序中,它通過宏指令是一段獨立的程序代碼,可插在源程序中,它通過偽操作來定義。宏在使用之前必須提前定義好,宏之間可偽操作來定義。宏在使用之前必須提前定義好,宏之間可互相調用,也可遞歸調用?;ハ嗾{用,也可遞歸調用。通過直接書寫宏名來使用宏,并根據宏指令的格式設置相通過直接書寫宏名來使用宏,并根據宏指令的格式設置相應的輸入參數。宏定義本身不會產生代碼,只是在調用它應的輸入參數。宏定義本身不會產生代碼,只是在調用它時把宏體插入到源程序中。調用宏時通過實際的指令來代時把宏體插入到源程序中。調用宏時通過實際的指令來代替宏體實現相關的一段代碼。替宏體實現相關的一
9、段代碼。 9 (3)操作數域操作數域(OPERAND) 操作數域表示操作的對象,操作數可以是常量、變量、標號、操作數域表示操作的對象,操作數可以是常量、變量、標號、寄存器名或表達式,不同對象之間必須用逗號寄存器名或表達式,不同對象之間必須用逗號“,”分開。分開。立即數用立即數用“#”字開頭,還可以使用字開頭,還可以使用EQU指示字來定義常數。指示字來定義常數。例:例: 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 ; 把立即數傳送到把立即數傳送到R1中中(4)注釋域(注釋域(COMMENT) 注釋域用來說明語句的功能,以注釋域用來說明語句的功能,以“;”開始。匯編程序對開始。匯編程序對“;”以以后的部分不予匯編。后的部分不予匯編。 例例 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匯編語言程序結構;文件名文件名:TEST1.S ,計算,計算15+8=? AREA |test1.s|,CODE,READONLY;聲明只讀代碼段聲明只讀代碼段 EXPORT _Vectors ;聲明全局變量聲明全局變量,用于向量表入口用于向量表入口 EXPORT Reset_Handler
12、;全局變量,用于復位指針全局變量,用于復位指針_Vectors DCD 0 x11223344 ;地址地址0 x0,向量表第向量表第0字,字,MSP初值初值 DCD Reset_Handler ;地址地址0 x4,標號的地址值,標號的地址值,PC初值初值 Reset_Handler PROC ;復位中斷服務程序復位中斷服務程序,PROCP函數起始函數起始START MOV R0,#15 ;R0 = 15 MOV R1,#8 ; R1 =8 ADD R0,R0,R1; R0 = R0 + R1 B START ;跳轉到;跳轉到START處處 ENDP ;函數結束函數結束,函數偽操作可省略函數偽操
13、作可省略 END 標號頂格寫使用使用“;”進行注釋,可行首進行注釋,可行首偽操作實際代碼段聲明文件結束與源程序格式有關的偽操作F1、AREA偽操作:定義一個代碼段或數據段。偽操作:定義一個代碼段或數據段。 ARM程序采程序采用分段式設計,一個源程序至少包含一個代碼段。語法:用分段式設計,一個源程序至少包含一個代碼段。語法: AREA |段名段名| , CODE|DATA,attr段名非數字開頭、無標點時段名非數字開頭、無標點時“|”可省略可省略;CODE|DATA指定代碼段或數據段指定代碼段或數據段;還有還有NOINIT表示數據段表示數據段是未初始化的或初始化為零。是未初始化的或初始化為零。a
14、ttr屬性如:屬性如:nREADONLY,只讀;,只讀;nREADWRITE,可讀寫;,可讀寫;nALIGN=數字表達式,值數字表達式,值0-31,按,按2的表達式冪次方對齊的表達式冪次方對齊方式,如方式,如0為為1字節(jié)對齊、字節(jié)對齊、1為為2字節(jié)對齊、字節(jié)對齊、2為為4字節(jié)對齊等字節(jié)對齊等(省略為(省略為4字節(jié)對齊)。字節(jié)對齊)。與源程序格式有關的偽操作2、PROC/ENDP函數起始函數起始/結束標志,例:結束標志,例:Reset_Handler PROC ;函數起始標志;函數起始標志START MOV R0,#15 ;R0 = 15 MOV R1,#8 ; R1 =8 ADDS R0,R0
15、,R1; R0 = R0 + R1 B START ENDP ;函數結束標志;函數結束標志 可以不用可以不用PROC/ENDP,使用的好處程序結構清晰。,使用的好處程序結構清晰。3、END偽操作:告訴編譯器已經到了源程序的結尾。偽操作:告訴編譯器已經到了源程序的結尾。第5章 匯編語言程序設計n5.1匯編語言概述n5.2 偽操作n5.3 分支、循環(huán)、子程序n5.4 匯編語言上機環(huán)境n5.5 匯編語言C語言混合編程ARM匯編器的偽操作在在ARM匯編語言程序里,有一些特殊指令助記符,這些助匯編語言程序里,有一些特殊指令助記符,這些助記符與指令系統(tǒng)的助記符不同,沒有相對應的操作碼,通記符與指令系統(tǒng)的助
16、記符不同,沒有相對應的操作碼,通常稱這些特殊指令助記符為偽操作。常稱這些特殊指令助記符為偽操作。偽操作不像機器指令那樣在程序運行期間由機器執(zhí)行,偽偽操作不像機器指令那樣在程序運行期間由機器執(zhí)行,偽操作在源程序中的作用是為完成匯編程序作各種準備工作操作在源程序中的作用是為完成匯編程序作各種準備工作的,這些偽操作僅在匯編過程中起作用,一旦匯編結束,的,這些偽操作僅在匯編過程中起作用,一旦匯編結束,偽操作的使命就完成。偽操作的使命就完成。在在ARM的匯編程序中,有如下幾種偽操作:的匯編程序中,有如下幾種偽操作: 符號定義(符號定義(Symbol Definition)偽操作)偽操作 數據定義(數據定
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偽操作用于定義一個全局的偽操作用于定義一個全局的數值數值變量,并初始化為變量,并初始化為0;GBLL偽操作用于定義一個全
19、局的偽操作用于定義一個全局的邏輯邏輯變量,并初始化為變量,并初始化為F(假);(假);GBLS偽操作用于定義一個全局的偽操作用于定義一個全局的字符串字符串變量,并初始化為空;變量,并初始化為空;5.2.1 符號定義偽操作 例例 2 使用示例:使用示例: GBLA A1 ;定義一個全局的數值變量,變量名為;定義一個全局的數值變量,變量名為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偽操作用于定義一個局部的偽操作用于定義一個局部的數值數值變量,并初始化為變量,并初始化為0;LCLL偽操作用于定義一個局部的偽操作
21、用于定義一個局部的邏輯邏輯變量,并初始化為變量,并初始化為F(假);(假);LCLS偽操作用于定義一個局部的偽操作用于定義一個局部的字符串字符串變量,并初始化為空;變量,并初始化為空;21 例例 3 使用示例:使用示例:LCLA Test4 ;聲明一個局部的數值變量,變量名為;聲明一個局部的數值變量,變量名為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用于給一個已經定義用于給一個已經定義的全局變量或局部變量賦值。的全局變量或局部變量賦值。SETA偽操作用于給一個偽操作用于給一個數值數值變量賦值;變量賦值;SETL偽操作用于給一個偽操作用于給一個邏輯邏輯變量賦值;變量賦值;SETS偽操作用于給一
23、個偽操作用于給一個字符串字符串變量賦值;變量賦值;235.2.1 符號定義偽操作 例例 4 使用示例:使用示例: LCLA Test3 ;聲明一個局部的數值變量,變量名為;聲明一個局部的數值變量,變量名為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指令中,列表中的寄存器訪問次序為根據寄存器的指令中,列表中的寄存器訪問次序為根據寄存器的編號由低到高,而與列表中的寄存器排列次序無關。編號由低到高,而與列表中的寄存器排列次序無關。 5.2.1 符號定義偽操作 例例 5 使用示例:使用示例: RegList RLIST R0-R5,R8,R10 ;將寄存器列表名稱定;將寄存器列表名稱定義為義為RegList, 在程序中使用:在程序中使用: STMFD SP
25、!,RegList ;存儲列表到堆棧;存儲列表到堆棧 LDMIA R5,RegList ;加載列表;加載列表265.2.1 符號定義偽操作5.2.1 符號定義偽操作(總結)符號符號:標號、變量、常量、寄存器別名、函數名標號、變量、常量、寄存器別名、函數名;n標號是指令的符號地址只在代碼段中被定義;n變量是操作數的符號地址可在數據段和代碼段中定義;符號定義偽操作符號定義偽操作:n定義變量、常量、寄存器別名的操作,及其賦值的操作。符號定義偽操作(總結)1、全局級變量定義偽操作:、全局級變量定義偽操作:GBLA、GBLL和和GBLS 語法:語法: nX為A定義一個全局數值變量并初始化為0;nX為L定
26、義一個全局邏輯變量并初始化為FULS;nX為S定義一個全局字符串變量并初始化為空串;2、局部變量定義偽操作:、局部變量定義偽操作:LCLA、LCLL和和LCLS 語法:語法: nX:A指數值、L指邏輯、S指字符串n局部變量定義要在局部如一個宏內( MACRO-MEND)。3、變量的賦值偽操作:、變量的賦值偽操作:SETA、 SETL、 SETS 語法:語法: n數值用0 x開頭的十六進制數,n邏輯值:TRUE、FULS,n字符串用雙引號圍起來“”。符號定義偽操作(總結)例例1:全局級變量定義與賦值:全局級變量定義與賦值 GBLA Test1;定義全局數字變量Test1Test1 SETA 0
27、xaa ;將Test1變量賦值為0 xaa GBLL Test2;定義全局邏輯變量Test2Test2 SETL TRUE;將該變量賦值為真例例2:局部變量需在宏內定義與賦值:局部變量需在宏內定義與賦值: MACRO ;宏開始標記$IRQ_Label HANDLER $IRQ_Exception; HANDLER宏名 LCLS Test3 ;宏內定義局部字符串Test3 SETS Testing ;Test3=“Testing” MEND ;宏結束標記符號定義偽操作(總結)4、寄存器別名定義偽操作:、寄存器別名定義偽操作:RLIST,將一個或幾個通用寄,將一個或幾個通用寄存器定義一個名稱,如該
28、名稱可在存器定義一個名稱,如該名稱可在LDM/STM指令中使用。指令中使用。語法:語法: RegListName RLIST R0-R6,R8,R10-R125、常量定義偽操作:、常量定義偽操作:EQU(可用(可用*代替),將一個數值或寄代替),將一個數值或寄存器的值賦給常量、標號。語法:存器的值賦給常量、標號。語法: 符號名符號名 EQU 表達式表達式n表達式值給常量、標號。n賦值以后的常量,可以用作數據地址、代碼地址、位地址或者直接當做一個立即數使用。例: const1 EQU 0X1234 ;const1值為值為1234 MOV R0,#const1 ;R0 = 1234符號定義偽操作(
29、總結)6、工程級標號定義偽操作:、工程級標號定義偽操作:EXPORT(或(或GLOBAL),該全局標號可在其他的文件中引用。語法:該全局標號可在其他的文件中引用。語法: EXPORT symbol WEAKnsymbol,標號名。nWEAK選項聲明其他同名標號優(yōu)先于該標號被引用。例:例: EXPORT Stest ;聲明一個可全局引用的標號聲明一個可全局引用的標號Stest7、其他:、其他:CN為協處理器的寄存器定義名稱為協處理器的寄存器定義名稱CP為協處理器定義名稱DN/SN為雙精度/單精度VFP的寄存器定義名稱FN為FPA浮點寄存器定義名稱5.2.2 數據定義偽操作 數據定義偽操作用于為特
30、定的數據分配存儲單元,同時可完成已數據定義偽操作用于為特定的數據分配存儲單元,同時可完成已分配存儲單元的初始化。常見的數據定義偽操作有如下幾種:分配存儲單元的初始化。常見的數據定義偽操作有如下幾種: DCB 分配一片連續(xù)的分配一片連續(xù)的字節(jié)字節(jié)存儲單元并初始化。存儲單元并初始化。 DCW(DCWU)分配一片連續(xù)的)分配一片連續(xù)的半字半字存儲單元并初始化。存儲單元并初始化。 DCD(DCDU)分配一片連續(xù)的)分配一片連續(xù)的字字存儲單元并初始化。存儲單元并初始化。 DCQ(DCQU)分配一片以)分配一片以8字節(jié)為單位字節(jié)為單位的連續(xù)的存儲單元并初始化。的連續(xù)的存儲單元并初始化。 DCFS(DCFS
31、U)為)為單精度浮點數單精度浮點數分配一片連續(xù)的字存儲單元并初始化。分配一片連續(xù)的字存儲單元并初始化。 DCFD(DCFDU)為)為雙精度浮點數雙精度浮點數分配一片連續(xù)的字存儲單元并初始化。分配一片連續(xù)的字存儲單元并初始化。5.2.2 數據定義偽操作 SPACE 分配一片連續(xù)的存儲單元。分配一片連續(xù)的存儲單元。 FIELD定義一個結構化的內存表的數據域。定義一個結構化的內存表的數據域。 MAP定義一個結構化的內存表首地址。定義一個結構化的內存表首地址。 LTORG定義一個數據緩沖池定義一個數據緩沖池(literal pool)的開始。的開始。33 1. DCB 格格 式:標號式:標號 DCB
32、表達式表達式 功功 能:能:DCB偽操作用于分配一片連續(xù)的字節(jié)存儲單元并用偽操偽操作用于分配一片連續(xù)的字節(jié)存儲單元并用偽操作中指定作中指定 的表達式初始化。其中,表達式可以為的表達式初始化。其中,表達式可以為0255的數值或字的數值或字符串。符串。 DCB也可用也可用“=”代替。代替。使用示例:使用示例:Str DCB “This is a test!” ;分配一片連續(xù)的字節(jié)存儲單元并初始;分配一片連續(xù)的字節(jié)存儲單元并初始化?;?。5.2.2 數據定義偽操作5.2.2 數據定義偽操作 2. DCW(DCWU) 格格 式:標號式:標號DCW(或(或DCWU)表達式)表達式 功功 能:能:DCW(或
33、(或DCWU)偽操作用于分配一片連續(xù)的半字存儲)偽操作用于分配一片連續(xù)的半字存儲單元并用偽操作中指定的表達式初始化。其中,表達式可以為程單元并用偽操作中指定的表達式初始化。其中,表達式可以為程序標號或數值表達式。用序標號或數值表達式。用DCW分配的字存儲單元是半字對齊的分配的字存儲單元是半字對齊的,而用,而用DCWU分配的字存儲單元并不嚴格按照半字對齊。分配的字存儲單元并不嚴格按照半字對齊。使用示例:使用示例: DataTest DCW 1,2,3 ;分配一片連續(xù)的半字存儲單元并初始化;分配一片連續(xù)的半字存儲單元并初始化。35 3. DCD(或(或DCDU) 格格 式:標號式:標號DCD(或(
34、或DCDU)表達式)表達式 功功 能:能:DCD(或(或DCDU)偽操作用于分配一片連續(xù)的字存儲)偽操作用于分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。其中,表達式可以為單元并用偽操作中指定的表達式初始化。其中,表達式可以為程序標號或數值表達式。程序標號或數值表達式。DCD也可用也可用“&”代替。用代替。用DCD分配分配的字存儲單元是字對齊的,而用的字存儲單元是字對齊的,而用DCDU分配的字存儲單元并不分配的字存儲單元并不嚴格按照字對齊。嚴格按照字對齊。使用示例:使用示例: DataTest DCD 4,5,6 ;分配一片連續(xù)的字存儲單元并初始化;分配一片連續(xù)的字存儲單元并
35、初始化。5.2.2 數據定義偽操作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 數據定義偽操作5. DCFS(或(或DCFSU) 格格 式:標號式:標號DCFS(或(或DCFSU)表達式)表達式 功功 能:能:DCFS(或(或DCFSU)偽操作用于為單精度浮點數分配)偽操作用于為單精度浮點數分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。每個單精度浮點數占據一個字單元。用每個單精度浮點數占據一個字單元。用DCFS分配的字存儲單分配的字存儲單元是字對齊的,而用元是字對齊的,而用DCFSU分配的字存儲單元并不嚴格按照分配的字存儲單元并不嚴格按照字對齊。字對齊。使用示例:使用示例:Fdata
37、Test DCFS 2E5,-5E7 ;分配一片連;分配一片連 續(xù)的字存儲單元并續(xù)的字存儲單元并初始化為指定的單精度數。初始化為指定的單精度數。 5.2.2 數據定義偽操作6. DCFD(或(或DCFDU) 格格 式:標號式:標號 DCFD(或(或DCFDU)表達式)表達式 功功 能:能:DCFD(或(或DCFDU)偽操作用于為雙精度的浮點數)偽操作用于為雙精度的浮點數分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。每個雙精度的浮點數占據兩個字單元。用。每個雙精度的浮點數占據兩個字單元。用DCFD分配的字存分配的字存儲單元是字對齊的
38、,而用儲單元是字對齊的,而用DCFDU分配的字存儲單元并不嚴格分配的字存儲單元并不嚴格按照字對齊。按照字對齊。使用示例:使用示例:FdataTest DCFD 2E115,-5E7 ;分配一片連續(xù)的字存儲單元并初;分配一片連續(xù)的字存儲單元并初始化為指定的雙精度數。始化為指定的雙精度數。 5.2.2 數據定義偽操作 7. SPACE 格格 式:標號式:標號 SPACE 表達式表達式 功功 能:能:SPACE偽操作用于分配一片連續(xù)的存儲區(qū)域并初始偽操作用于分配一片連續(xù)的存儲區(qū)域并初始化為化為0。其中,表達式為要分配的字節(jié)數。其中,表達式為要分配的字節(jié)數。SPACE也可用也可用“”代替。代替。使用示
39、例:使用示例:DataSpace SPACE 100 ;分配連續(xù);分配連續(xù)100字節(jié)的存儲單元并初始化字節(jié)的存儲單元并初始化為為0。5.2.2 數據定義偽操作5.2.2 數據定義偽操作8. MAP 格格 式:式:MAP表達式表達式,基址寄存器,基址寄存器 功功 能:能:MAP偽操作用于定義一個結構化的內存表的首地址。偽操作用于定義一個結構化的內存表的首地址。MAP也可用也可用“”代替。表達式可以為程序中的標號或數學代替。表達式可以為程序中的標號或數學表達式,基址寄存器為可選項,表達式,基址寄存器為可選項, 當基址寄存器選項不存在時當基址寄存器選項不存在時,表達式的值即為內存表的首地址,當該選,
40、表達式的值即為內存表的首地址,當該選 項存在時,內存項存在時,內存表的首地址為表達式的值與基址寄存器的和。表的首地址為表達式的值與基址寄存器的和。MAP偽操作通偽操作通常與常與FIELD偽操作配合使用來定義結構化的內存表。偽操作配合使用來定義結構化的內存表。使用示例:使用示例:MAP 0 x100,R0 ;定義結構化內存表首地址的值為;定義結構化內存表首地址的值為0 x100R0。419. FILED 格格 式:標號式:標號 FIELD 表達式表達式 功功 能:能:FIELD偽操作用于定義一個結構化內存表中的偽操作用于定義一個結構化內存表中的 數據域數據域。FILED也可用也可用“#”代替。表
41、達式的值為當前數據域在內存表中代替。表達式的值為當前數據域在內存表中所占的字節(jié)數。所占的字節(jié)數。 5.2.2 數據定義偽操作MAP偽操作定義內存表的首地址,偽操作定義內存表的首地址,FIELD偽操作定義內存表偽操作定義內存表中的各個數據域,并可以為每個數據域指定一個標號供其它的中的各個數據域,并可以為每個數據域指定一個標號供其它的指令引用。指令引用。FIELD偽操作常與偽操作常與MAP偽操作配合使用來定義結構化的內存?zhèn)尾僮髋浜鲜褂脕矶x結構化的內存表。表。43由由MAP偽操作和偽操作和FIELD偽操作配合定義的內存表有偽操作配合定義的內存表有3種:種: (1)表達式是一個基于絕對地址的內存表表
42、達式是一個基于絕對地址的內存表,例如:例如: MAP 0 x100 ;定義結構化內存表首地址的值為;定義結構化內存表首地址的值為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 數據定義偽操作5.2.2 數據定義偽操作分析:上面的偽操作序列定義了一個內存表,其首地址為固定分析:上面的偽操作序列定義了一個內存表,其首地址為固定地址地址0 x100,
43、該內存表中包含,該內存表中包含3個數據域:個數據域:A長度為長度為4字節(jié),相字節(jié),相對表首的相對地址為對表首的相對地址為0;B的長度為的長度為4 字節(jié),相對地址為字節(jié),相對地址為4;S的長度為的長度為16字節(jié),相對地址為字節(jié),相對地址為8。在指令中可以這樣引用內存表中的數據域:在指令中可以這樣引用內存表中的數據域: LDR R0,=A ;使用偽指令讀??;使用偽指令讀取A的地址,地址是的地址,地址是 0 x100LDR R1,R0 ;將;將A地址處對應的內容加載到地址處對應的內容加載到R145 (2)表達式是一個數值,是一個基于相對地址的內存表,例如:表達式是一個數值,是一個基于相對地址的內存表
44、,例如:MAP 0 x04,R9 ;定義結構化內存表首地址的值為;定義結構化內存表首地址的值為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 數據定義偽操作可通過下面的指令訪問地址范圍超過可通過下面的指令訪問地址范圍超過4KB的數據。的數據。 LDR R9,=0 x900 ;定義內存表的地址,首地址是;定義內
45、存表的地址,首地址是0 x904 ADR R0,DATA1 ;在程序中,讀取;在程序中,讀取DATA1的地址的地址0 x908 LDR R2,R0 ;讀??;讀取DATA1數據數據 LDR R9,=0 x2000 ;同一個內存表,重新定義為;同一個內存表,重新定義為0 x2004 ADR R1,DATA2 ;讀?。蛔x取DATA2的地址,是的地址,是 0 x2008 STR R9,R1 ;把;把R9的地址存儲到的地址存儲到DATA2475.2.2 數據定義偽操作 分析:上面的偽操作序列定義了一個內存表,其首地址是基分析:上面的偽操作序列定義了一個內存表,其首地址是基于寄存器于寄存器R9中的內容,而
46、不是一個固定地址,通過在中的內容,而不是一個固定地址,通過在LDR指令中指定不同的基址寄存器值,定義的內存表結構可在指令中指定不同的基址寄存器值,定義的內存表結構可在程序中有多個實例。可多次使用程序中有多個實例。可多次使用LDR指令,用以實現不同指令,用以實現不同的程序實例。的程序實例。485.2.2 數據定義偽操作 (3)表達式是一個標號,基于)表達式是一個標號,基于PC的內存表。例如的內存表。例如 DATA SPACE 100 ;分配;分配100字節(jié)的內存單元,并初始化為字節(jié)的內存單元,并初始化為0。 MAP DATA ;內存表的首地址為;內存表的首地址為DATA內存單元內存單元 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的數據。的數據。 LDR R5,B ;相當于;相當于LDR R5,PC,#4 5.2.2 數據定義偽操作5.2.2 數據定義偽操作分析:這里內存表中各數據域的實際內存地址是基于分析:這里內存表中各數據域的實際內存地址是基于PC寄存器寄存器的值,而不是基于一個固定的地址。
48、的值,而不是基于一個固定的地址。PC的值不是固定的,但的值不是固定的,但分配的內存單元是固定的,也就是說,分配的內存單元是固定的,也就是說,PC的值加上一個偏移的值加上一個偏移量的值才是內存單元的值,這樣偏移量的值便是不固定的。量的值才是內存單元的值,這樣偏移量的值便是不固定的。在使用在使用LDR指令訪問表中的數據域時,不必使用基址寄存器指令訪問表中的數據域時,不必使用基址寄存器。50 10. LTORG 格格 式:式:LTORG 功功 能:用于聲明一個數據緩沖池能:用于聲明一個數據緩沖池(也稱為文字池也稱為文字池)的開始,當的開始,當程序中使用程序中使用LDR之類的指令時,數據緩沖區(qū)的使用可
49、能越界。為之類的指令時,數據緩沖區(qū)的使用可能越界。為防止越界發(fā)生,可使用防止越界發(fā)生,可使用LTORG偽操作定義數據緩沖池。偽操作定義數據緩沖池。ARM匯匯編編譯器一般把數據緩沖池放在代碼段的最后面,即下一個代碼編編譯器一般把數據緩沖池放在代碼段的最后面,即下一個代碼段開始之前,或者段開始之前,或者END偽操作之前。偽操作之前。LTORG偽操作通常放在無偽操作通常放在無條件跳轉指令之后條件跳轉指令之后, 或者子程序返回指令之后或者子程序返回指令之后,這樣處理器就不會這樣處理器就不會錯誤地將數據緩沖池錯誤地將數據緩沖池 中的數據當作指令來執(zhí)行。中的數據當作指令來執(zhí)行。5.2.2 數據定義偽操作5
50、.2.2 數據定義偽操作例如例如: AREA LTORG_EX,CODE,READONLY START BL FUNC1 FUNC1 LDR R1,=0 x8000 ;子程序;子程序 MOV PC,LR ;子程序結束;子程序結束 LTORG ;定義數據緩沖池;定義數據緩沖池 DATA SPACE 40 ;從當前位置開始分配;從當前位置開始分配40個字個字節(jié)并初始化為節(jié)并初始化為0 END525.2.2 數據定義偽操作(總結)數據定義偽操作一般用于為特定的數據分配存儲單元,同數據定義偽操作一般用于為特定的數據分配存儲單元,同時可完成已分配存儲單元的初始化。時可完成已分配存儲單元的初始化。DCB
51、分配一片連續(xù)的分配一片連續(xù)的字節(jié)存儲單元字節(jié)存儲單元并用指定的數據初始化并用指定的數據初始化nDCW(DCWU) 半字存儲單元nDCD(DCDU) 字存儲單元nDCQ(DCQU) 雙字存儲單元nDCFD(DCFDU) 雙精度浮點數的字存儲單元nDCFS(DCFSU) 單精度浮點數的字存儲單元DCD為例,語法:為例,語法: 標號標號 DCD expr,expr -標號可省略;標號可省略; - expr表達式可多個,可是程序標號或數值表達式;表達式可多個,可是程序標號或數值表達式;數據定義偽操作(總結)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é)數。例:分配連續(xù)例:分配連續(xù)100字節(jié)的存儲單元并初始化為字節(jié)的存儲單元并初始化為0。 DataSpace SPACE 100數據定義偽操作(總結)MAP 定義一個結構化的內存表首地址,語法:定義一個結構化的內存表首地址,語法: MAP expr,base-registernexpr表達式存儲到結構化內存表首地址nbase-register,指定一
53、個寄存器,包含這一項時,結構化內存表的首地址為expr和base-register值的和。FIELD 定義一個結構化的內存表的數據域,語法:定義一個結構化的內存表的數據域,語法: label FIELD exprnlabel標號名,可選項。nexpr表達式,FIELD指定的域所占內存單元字節(jié)數。MAP偽操作通常與偽操作通常與FIELD偽操作配合使用來定義結構化的偽操作配合使用來定義結構化的內存表。內存表。數據定義偽操作(總結)例:定義一個內存表,首地址為固定地址例:定義一個內存表,首地址為固定地址0 x100。該結構化。該結構化內存表包含內存表包含3個域:個域:A的長度為的長度為16個字節(jié),位
54、置為個字節(jié),位置為0 x100;B的長度為的長度為32個字節(jié),位置為個字節(jié),位置為0 x110;S的長度為的長度為256個字節(jié),個字節(jié),位置為位置為0 x130。n MAP 0 x100;結構化內存表首地址的值為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偽操作能根據條件的成立與否決定是偽操作能根據條件的成立與否決定是否執(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偽操作能根據條件的成立與否決定偽操作能根據條件的成立與否決定是否循環(huán)執(zhí)行某個指令序列。當是否循環(huán)執(zhí)行某個指令序列。當WHILE后面的邏輯表達式為真后面的邏輯表達式為真,則執(zhí)行指令序列,該指令序列執(zhí)行完畢后,再判斷邏輯表達,則執(zhí)行指令序列,該指令序列執(zhí)行完畢后
57、,再判斷邏輯表達式的值,若為真則繼續(xù)執(zhí)行,一直到邏輯表達式的值為假。式的值,若為真則繼續(xù)執(zhí)行,一直到邏輯表達式的值為假。WHILE、WEND偽操作可以嵌套使用。偽操作可以嵌套使用。5.2.3 匯編控制偽操作使用示例:使用示例:GBLA Counter ;聲明一個全局的數學變量,變量名為;聲明一個全局的數學變量,變量名為Counter Counter SETA 3 ;由變量;由變量Counter控制循環(huán)次數控制循環(huán)次數 WHILE Counter 10 ;指令序列;指令序列 counter SETA counter+1 WEND605.2.3 匯編控制偽操作 3. MACRO、MEND、MEXI
58、T 格格 式:式: MACRO $標號標號 宏名宏名 $參數參數1,$參數參數2, 指令序列指令序列 MEXIT 指令序列指令序列 MEND功功 能:能:MACRO、MEND偽操作可以將一段代碼定義為一個偽操作可以將一段代碼定義為一個整體,稱為宏指令,然后就可以在程序中通過宏指令多次調整體,稱為宏指令,然后就可以在程序中通過宏指令多次調用該段代碼。其中,用該段代碼。其中,$標號在宏指令被展開時,標號會被替換標號在宏指令被展開時,標號會被替換為用戶定義的符號,宏指令可以使用一個或多個參數,當宏為用戶定義的符號,宏指令可以使用一個或多個參數,當宏指令被展開時,這些參數被相應的值替換。指令被展開時,
59、這些參數被相應的值替換。5.2.3 匯編控制偽操作宏指令的使用方式和功能與子程序有些相似,子程序可以提供宏指令的使用方式和功能與子程序有些相似,子程序可以提供模塊化的程序設計、節(jié)省存儲空間并提高運行速度。但在使模塊化的程序設計、節(jié)省存儲空間并提高運行速度。但在使用子程序結構時需要保護現場,從而增加了系統(tǒng)的開銷,因用子程序結構時需要保護現場,從而增加了系統(tǒng)的開銷,因此,在代碼較短且需要傳遞的參數較多時,可以使用宏指令此,在代碼較短且需要傳遞的參數較多時,可以使用宏指令代替子程序。包含在代替子程序。包含在MACRO和和MEND之間的指令序列稱為之間的指令序列稱為宏定義體,在宏定義體的第一行應聲明宏
60、的原型(包含宏名宏定義體,在宏定義體的第一行應聲明宏的原型(包含宏名、所需的參數),然后就可以在匯編程序中通過宏名來調用、所需的參數),然后就可以在匯編程序中通過宏名來調用該指令序列。該指令序列。625.2.3 匯編控制偽操作 MEXIT用于從宏定義中跳轉出去。在源程序被編譯時,匯編用于從宏定義中跳轉出去。在源程序被編譯時,匯編器將宏調用展開,用宏定義中的指令序列代替程序中的宏調器將宏調用展開,用宏定義中的指令序列代替程序中的宏調用,并將實際參數的值傳遞給宏定義中的形式參數。用,并將實際參數的值傳遞給宏定義中的形式參數。MACRO、MEND偽操作可以嵌套使用。偽操作可以嵌套使用。宏的標號使用方法:標號
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度遺產贈與協議書
- 二零二五年度都市綜合體餐飲店鋪租賃協議
- 二零二五年度酒店客房清潔衛(wèi)生免責責任協議
- 2025年度土地征收補償安置協議補充協議
- 二零二五年度門面出租合同終止及租金調整及支付方式協議
- 2025版進出口貿易合作三方服務協議3篇
- 2025年度跨境電商平臺合伙運營合作協議范本4篇
- 二零二五年度音樂版權登記認證與版權收益分配協議
- 二零二五年度建筑材料運輸與風險控制協議3篇
- 二零二五年度仇薇離婚協議書與婚后子女撫養(yǎng)費支付合同3篇
- 2024年中國華能集團燃料有限公司招聘筆試參考題庫含答案解析
- 《紅樓夢》中的男性形象解讀
- 安全生產技術規(guī)范 第49部分:加油站 DB50-T 867.49-2023
- 《三國演義》中的語言藝術:詩詞歌賦的應用
- 腸外營養(yǎng)液的合理配制
- 消防安全教育培訓記錄表
- 2023年河南省新鄉(xiāng)市鳳泉區(qū)事業(yè)單位招聘53人高頻考點題庫(共500題含答案解析)模擬練習試卷
- 2023年小升初簡歷下載
- 廣府文化的奇葩
- 公路工程標準施工招標文件(2018年版)解析
- 七年級地理下冊期末試卷(人教版)
評論
0/150
提交評論