第4章-ARM匯編程序設(shè)計(jì)-20151008_第1頁
第4章-ARM匯編程序設(shè)計(jì)-20151008_第2頁
第4章-ARM匯編程序設(shè)計(jì)-20151008_第3頁
第4章-ARM匯編程序設(shè)計(jì)-20151008_第4頁
第4章-ARM匯編程序設(shè)計(jì)-20151008_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University第第4章章 ARM匯編語匯編語言程序設(shè)計(jì)基礎(chǔ)言程序設(shè)計(jì)基礎(chǔ)軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University ARM ARM處理器支持兩種語言進(jìn)行設(shè)計(jì),一處理器支持兩種語言進(jìn)行設(shè)計(jì),一種是匯編語言(種是匯編語言(ARM/ThumbARM/Thumb),另一種是),另一種是高級語言(如高級語言(如C/C+C/C+語言)。語言)。(1)(1)匯編語言的機(jī)器代碼生成效率很高,但可匯編語言的機(jī)器代碼生成效率很高,但可讀性卻不強(qiáng),復(fù)雜的程序很難讀懂

2、;讀性卻不強(qiáng),復(fù)雜的程序很難讀懂;(2)(2)而高級語言在大多數(shù)情況下其機(jī)器代碼生而高級語言在大多數(shù)情況下其機(jī)器代碼生成效率較差,但可讀性和可移植性卻比匯編成效率較差,但可讀性和可移植性卻比匯編語言強(qiáng)很多,而且還可以嵌入?yún)R編來解決高語言強(qiáng)很多,而且還可以嵌入?yún)R編來解決高效性的代碼編寫問題。效性的代碼編寫問題。編程語言軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 使用匯編語言編寫程序,它的特點(diǎn)是程使用匯編語言編寫程序,它的特點(diǎn)是程序執(zhí)行速度快,程序代碼生成量少,但匯編序執(zhí)行速度快,程序代碼生成量少,但匯編語言是一種不易學(xué)習(xí)的編程語言,并

3、且可讀語言是一種不易學(xué)習(xí)的編程語言,并且可讀性較差,這種語言屬于低級語言。性較差,這種語言屬于低級語言。每一種匯每一種匯編語言對應(yīng)每一款芯片,使用這種語言需要編語言對應(yīng)每一款芯片,使用這種語言需要對硬件有深刻的了解。對硬件有深刻的了解。在通常情況下,可以在通常情況下,可以使用匯編語言編寫驅(qū)動程序、需要嚴(yán)格計(jì)算使用匯編語言編寫驅(qū)動程序、需要嚴(yán)格計(jì)算執(zhí)行時間的程序以及需要加速執(zhí)行的程序。執(zhí)行時間的程序以及需要加速執(zhí)行的程序。 ARMARM匯編語言源程序中語句一般由匯編語言源程序中語句一般由指令指令、偽操作偽操作、宏指令宏指令和和偽指令偽指令組成。組成。 匯編語言軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) S

4、oftware School of Hunan University偽操作偽操作是是ARMARM匯編語言程序里的一些特殊指令助記匯編語言程序里的一些特殊指令助記符,主要是為符,主要是為完成匯編程序做各種準(zhǔn)備工作完成匯編程序做各種準(zhǔn)備工作,在,在源程序進(jìn)行匯編時由匯編程序處理,而不是在處源程序進(jìn)行匯編時由匯編程序處理,而不是在處理器運(yùn)行期間由機(jī)器執(zhí)行。理器運(yùn)行期間由機(jī)器執(zhí)行。宏指令宏指令是一段獨(dú)立的程序代碼,它通過偽操作來是一段獨(dú)立的程序代碼,它通過偽操作來定義。通過宏名來調(diào)用宏,并可以設(shè)置相應(yīng)的參定義。通過宏名來調(diào)用宏,并可以設(shè)置相應(yīng)的參數(shù)。數(shù)。宏定義本身不會產(chǎn)生代碼,只是在調(diào)用它時宏定義本身

5、不會產(chǎn)生代碼,只是在調(diào)用它時把宏體插入到源程序中把宏體插入到源程序中。偽指令偽指令也是也是ARMARM匯編語言程序里的特殊指令助記符,匯編語言程序里的特殊指令助記符,也不在處理器運(yùn)行期間由機(jī)器執(zhí)行,也不在處理器運(yùn)行期間由機(jī)器執(zhí)行,它們在匯編它們在匯編時將被合適的機(jī)器指令代替成時將被合適的機(jī)器指令代替成ARMARM或或ThumbThumb指令指令從從而實(shí)現(xiàn)真正指令操作。而實(shí)現(xiàn)真正指令操作。 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University一、偽操作一、偽操作符號定義(符號定義(Symbol defination)偽操作)偽操作數(shù)據(jù)定義(數(shù)據(jù)

6、定義(Data defination)偽操作)偽操作匯編控制(匯編控制(Assembly control)偽操作)偽操作信息報告(信息報告(Reporting)偽操作)偽操作其他偽操作其他偽操作軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University定義變量、對變量賦值以及定義寄存器的別名等定義變量、對變量賦值以及定義寄存器的別名等1. 符號定義偽操作符號定義偽操作偽指令:偽指令: 定義局部變量的定義局部變量的LCLALCLA、LCLLLCLL和和LCLSLCLS 定義全局變量的定義全局變量的GBLAGBLA、GBLLGBLL和和GBLSGBLS

7、 對變量賦值的對變量賦值的SETASETA、SETLSETL和和SETSSETS 為通用寄存器列表定義名稱的為通用寄存器列表定義名稱的RLISTRLISTA:數(shù)字變量;:數(shù)字變量;L:邏輯變量;:邏輯變量;S:字符串變量:字符串變量軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University符號定義偽操作 偽操作偽操作語法格式語法格式作作 用用GBLAGBLA Variable聲明一個全局的算術(shù)變量,并將其初始化成聲明一個全局的算術(shù)變量,并將其初始化成0。GBLLGBLL Variable聲明一個全局的邏輯變量,并將其初始化成聲明一個全局的邏輯變量,

8、并將其初始化成FALSE。GBLSGBLS Variable聲明一個全局的字符串變量,并將其初始化成空串聲明一個全局的字符串變量,并將其初始化成空串“”“”。LCLALCLA Variable聲明一個局部的算術(shù)變量,并將其初始化成聲明一個局部的算術(shù)變量,并將其初始化成0。LCLLLCLL Variable聲明一個局部的邏輯變量,并將其初始化成聲明一個局部的邏輯變量,并將其初始化成FALSE。LCLSLCLS Variable聲明一個局部的串變量,并將其初始化成空串聲明一個局部的串變量,并將其初始化成空串“”“”。SETASETA Variable expr給一個全局或局部算術(shù)變量賦值。給一個全

9、局或局部算術(shù)變量賦值。SETLSETL Variable expr給一個全局或局部邏輯變量賦值。給一個全局或局部邏輯變量賦值。SETSSETS Variable expr給一個全局或局部字符串變量賦值。給一個全局或局部字符串變量賦值。RLISTname LISTlist of registers為一個通用寄存器列表定義名稱。為一個通用寄存器列表定義名稱。CNname CN expr為一個協(xié)處理器的寄存器定義名稱。為一個協(xié)處理器的寄存器定義名稱。CPname CP expr為一個協(xié)處理器定義名稱。為一個協(xié)處理器定義名稱。DN/SNname DN/SN exprDN/SN為一個雙精度為一個雙精度/

10、單精度的單精度的VFP寄存器定義名稱。寄存器定義名稱。FNname FN expr為一個為一個FPA浮點(diǎn)寄存器定義名稱。浮點(diǎn)寄存器定義名稱。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University1)GBLA、GBLL、GBLS2) 作用:聲明一個作用:聲明一個ARM程序中的全局變量程序中的全局變量 語法格式:語法格式: Variable 例:例:GBLA arithmeticarithmetic SETA 0 xFFSPACE arithmeticGBLL logicallogical SETL TRUEGBLS string1string1

11、SETS “helloworld”1.符號定義偽操作軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 作用:聲明一個作用:聲明一個ARM程序中的局部變量程序中的局部變量 語法格式:語法格式: VariableMACRO$label message $aLCLS stringstring SETS “error”INFO 0,“string” : CC: :STR: $aMEND LCLA Mathmatic1.符號定義偽操作2) LCLA、LCLL、LCLS 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Huna

12、n University 3)SETA、SETL、SETS 作用;給一個作用;給一個ARM程序中的全局或局部變量賦值程序中的全局或局部變量賦值 語法格式:語法格式:Variable expr GBLA arithmetic arithmetic SETA 0 xEF SPACE arithmetic GBLL logical logical SETL TRUE LCLS string1 string1 SETS “helloworld”1.符號定義偽操作軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University1.符號定義偽操作 4)RLIST 作

13、用:為一個通用寄存器列表定義名稱作用:為一個通用寄存器列表定義名稱 格式:格式:Name RLIST list of registers 例:例:List RLIST R0,R2-R7 STMFD SP!, List 5)CN-為一個協(xié)處理器的寄存器定義名稱為一個協(xié)處理器的寄存器定義名稱 CP-為一個協(xié)處理器定義名稱。為一個協(xié)處理器定義名稱。格式:格式:nameCP/CNexprpower CN6; dzx CP6;軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University1.符號定義偽操作6)DN為一個雙精度的為一個雙精度的VFP寄存器定義名稱。

14、寄存器定義名稱。SN為一個單精度的為一個單精度的VFP (Vector Floating Points)寄存器定義名稱。寄存器定義名稱。FN為一個為一個FPA (Float Point Architecture)浮點(diǎn)寄浮點(diǎn)寄存器定義名稱。存器定義名稱。格式:格式:Name DN/SN/FN exprHeight DN 6 Width SN 20Length FN 6軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University程序中的變量代換程序中的變量代換 程序中的變量可通過代換操作取得一個常量。程序中的變量可通過代換操作取得一個常量。代換操代換操作

15、符為作符為“$”“$”。 如果在數(shù)字變量前面有一個代換操作符如果在數(shù)字變量前面有一個代換操作符“$”“$”,編譯,編譯器會將該數(shù)字變量的值轉(zhuǎn)換為十六進(jìn)制的字符串,并器會將該數(shù)字變量的值轉(zhuǎn)換為十六進(jìn)制的字符串,并將該十六進(jìn)制的字符串代換將該十六進(jìn)制的字符串代換“$”“$”后的數(shù)字變量。后的數(shù)字變量。 如果在邏輯變量前面有一個代換操作符如果在邏輯變量前面有一個代換操作符“$”“$”,編譯,編譯器會將該邏輯變量代換為它的取值(真或假)。器會將該邏輯變量代換為它的取值(真或假)。 如果在字符串變量前面有一個代換操作符如果在字符串變量前面有一個代換操作符“$”“$”,編,編譯器會將該字符串變量的值代換譯

16、器會將該字符串變量的值代換“$”“$”后的字符串變后的字符串變量。量。 LCLS S1 ;定義局部字符串變量;定義局部字符串變量S1和和S2 LCLS S2 S1 SETS “Test!” S2 SETS “This is a $S1” ;字符串變量;字符串變量S2的值為的值為“This is a Test!” 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University為數(shù)據(jù)分配存儲單元,完成已分配存儲單元的初始化為數(shù)據(jù)分配存儲單元,完成已分配存儲單元的初始化2. 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作偽指令:偽指令: DCBDCB:分配連續(xù)的字節(jié)單元并初始

17、化:分配連續(xù)的字節(jié)單元并初始化 DCW/DCWUDCW/DCWU:分配連續(xù)的半字單元并初始化:分配連續(xù)的半字單元并初始化 DCD/DCDU DCD/DCDU:分配連續(xù)的字并初始化:分配連續(xù)的字并初始化 DCQ/DCQU DCQ/DCQU:分配連續(xù)的塊:分配連續(xù)的塊(8(8字節(jié)字節(jié)) )單元并初始化單元并初始化 DCFS/DCFSU DCFS/DCFSU:為單精度浮點(diǎn)數(shù)分配字單元并初始化:為單精度浮點(diǎn)數(shù)分配字單元并初始化 DCFD/DCFDU DCFD/DCFDU:為雙精度浮點(diǎn)數(shù)分配字單元并初始化:為雙精度浮點(diǎn)數(shù)分配字單元并初始化 SPACE SPACE:分配一塊連續(xù)的:分配一塊連續(xù)的( (字節(jié)

18、字節(jié)) )存儲單元存儲單元 FIELD FIELD:定義一個結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域:定義一個結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域 MAP MAP:定義一個結(jié)構(gòu)化的內(nèi)存表首地址:定義一個結(jié)構(gòu)化的內(nèi)存表首地址軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University2. 數(shù)據(jù)定義偽操作 偽操作偽操作語法格式語法格式作作 用用LTORGLTORG聲明一個數(shù)據(jù)緩沖池(也稱為文字池)的開始。聲明一個數(shù)據(jù)緩沖池(也稱為文字池)的開始。MAPMAP expr,base-register定義一個結(jié)構(gòu)化的內(nèi)存表(定義一個結(jié)構(gòu)化的內(nèi)存表(Storage Map)的首地址。)的首地址

19、。FIELDlabel FIELD expr定義一個結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。定義一個結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。SPACElabel SPACE expr分配一塊連續(xù)內(nèi)存單元,并用分配一塊連續(xù)內(nèi)存單元,并用0初始化。初始化。DCBlabel DCB expr,expr分配一段字節(jié)內(nèi)存單元,并用分配一段字節(jié)內(nèi)存單元,并用expr初始化。初始化。D C D / DCDUlabel DCD expr ,expr分配一段字內(nèi)存單元。分配一段字內(nèi)存單元。DCDOlabel DCDO expr,expr 分配一段字對齊的字內(nèi)存單元。分配一段字對齊的字內(nèi)存單元。D C F D / DCFDUlabel DCFD

20、 Ufpliteral,fpliteral為雙精度的浮點(diǎn)數(shù)分配字對齊的內(nèi)存單元。為雙精度的浮點(diǎn)數(shù)分配字對齊的內(nèi)存單元。 D C F S / DCFSUlabel DCFS U fpliteral ,fpliteral為單精度的浮點(diǎn)數(shù)分配字對齊的內(nèi)存單元。為單精度的浮點(diǎn)數(shù)分配字對齊的內(nèi)存單元。DCIlabel DCI expr,expr在在ARM代碼中分配一段字對齊的內(nèi)存單元代碼中分配一段字對齊的內(nèi)存單元; 在在Thumb代代碼中,分配一段半字對齊的半字內(nèi)存單元。碼中,分配一段半字對齊的半字內(nèi)存單元。D C Q / DCQUlabel DCQUliteral,literal分配一段以雙字(分配一

21、段以雙字(8個字節(jié))為單位的內(nèi)存?zhèn)€字節(jié))為單位的內(nèi)存D C W / DCWUlabel DCWUexpr,exprDCW用于分配一段半字對齊的半字內(nèi)存單元。用于分配一段半字對齊的半字內(nèi)存單元。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University2. 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作1) LTORG語法格式:語法格式:LTORG用于聲明一個數(shù)據(jù)緩沖池的開始用于聲明一個數(shù)據(jù)緩沖池的開始當(dāng)程序中使用LDR之類的指令時,數(shù)據(jù)緩沖池的使用可能越界,為了防止越界發(fā)生,使用LTORG定義數(shù)據(jù)緩沖池。通常ARM匯編編譯器把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一個代

22、碼段開始之前,或者END偽操作之前。AREA Example,Code,READONLYstart BL funcl funcl LDR R1,=0 x8000 MOV PC,LR LTORG ;定義數(shù)據(jù)緩沖池定義數(shù)據(jù)緩沖池 Data SPACE 40END軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University2) SPACE也可以用符號也可以用符號“%”表示表示用于分配一塊連續(xù)的內(nèi)存單元供程序使用,并且將這個內(nèi)存單用于分配一塊連續(xù)的內(nèi)存單元供程序使用,并且將這個內(nèi)存單元的內(nèi)容初始化為元的內(nèi)容初始化為0。語法格式:語法格式: label SPA

23、CE expr或或 label % expr其中:其中: label :是一個標(biāo)號,可選項(xiàng)。:是一個標(biāo)號,可選項(xiàng)。 expr:數(shù)值表達(dá)式,用來規(guī)定內(nèi)存單元的字節(jié)數(shù):數(shù)值表達(dá)式,用來規(guī)定內(nèi)存單元的字節(jié)數(shù)。 n例:例:nAREA AREA DataSpace,Data,READWRITEDataSpace,Data,READWRITEndata SPACE 256 ;data SPACE 256 ;定義大小為定義大小為256256字節(jié)的數(shù)據(jù)區(qū)字節(jié)的數(shù)據(jù)區(qū)2. 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University2. 數(shù)

24、據(jù)定義偽操作數(shù)據(jù)定義偽操作 3) MAP, FIELD 語法格式:語法格式:MAP expr MAP expr ,base-registerbase-register 用于定義一個結(jié)構(gòu)化的內(nèi)存表的首地址用于定義一個結(jié)構(gòu)化的內(nèi)存表的首地址 語法格式:語法格式:label FIELD exprlabel FIELD expr 用于定義一個結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域用于定義一個結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域 MAP和和FIELD偽操作配合使用來定義結(jié)構(gòu)化的內(nèi)存?zhèn)尾僮髋浜鲜褂脕矶x結(jié)構(gòu)化的內(nèi)存表結(jié)構(gòu),表結(jié)構(gòu),MAP可以用可以用符號來替代,符號來替代,F(xiàn)IELD可以用可以用#符號來替代。符號來替代。注:注:MAP和

25、和FIELD偽操作只是定義數(shù)據(jù)結(jié)構(gòu)并不實(shí)際分配內(nèi)偽操作只是定義數(shù)據(jù)結(jié)構(gòu)并不實(shí)際分配內(nèi)存單元。存單元。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 4)DCB也可以用符號也可以用符號”=”表示表示 用于分配一段字節(jié)內(nèi)存單元,并用偽操作中的expr初始化。 語法格式: label DCB expr,expr 或 label = expr,expr 其中: expr表示: -128到255之間的一個數(shù)值常量或者表達(dá)式。 一個字符串。2. 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hu

26、nan University 例: short DCB 1 ;為short分配了一個字節(jié),并初始 化為1。 string DCB “string”,0 ;構(gòu)造一個以0結(jié)尾的字 符串 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 5)DCD、DCDU (1)DCD 也可以用符號也可以用符號”&”表示表示 用于分配一段字內(nèi)存單元(用于分配一段字內(nèi)存單元(分配的內(nèi)存單元分配的內(nèi)存單元都是字對齊的都是字對齊的)并初始化。)并初始化。 語法格式:語法格式: label DCD expr,expr 或或 label & expr,

27、expr 其中:其中: expr:數(shù)字表達(dá)式或程序中的標(biāo)號。:數(shù)字表達(dá)式或程序中的標(biāo)號。注:注:DCD偽操作可能在分配的第一個內(nèi)存單元前插入填偽操作可能在分配的第一個內(nèi)存單元前插入填補(bǔ)字節(jié)以保證分配的內(nèi)存是字對齊的。補(bǔ)字節(jié)以保證分配的內(nèi)存是字對齊的。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 例:例: data1 DCD 2,4,6 ;為為data1分配三個字分配三個字,內(nèi)內(nèi)容初始化為容初始化為2,4,6 data2 DCD label+4 ;初始化初始化data2為為label+4對應(yīng)的地址對應(yīng)的地址 (2)DCDU DCDU與與

28、DCD的不同之處在于的不同之處在于DCDU分配的分配的內(nèi)存單元內(nèi)存單元并不嚴(yán)格字對齊。并不嚴(yán)格字對齊。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University3. 匯編控制偽操作匯編控制偽操作 用于條件匯編、宏定義、重復(fù)匯編用于條件匯編、宏定義、重復(fù)匯編控制等??刂频?。 IF,ELSE及及ENDIF WHILE及及WEND MACRO,MEND及及MEXIT軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 1、IF,ELSE及及ENDIF IF,ELSE及及ENDIF偽操作能夠根據(jù)條件把一段

29、源偽操作能夠根據(jù)條件把一段源代碼包括在匯編語言程序內(nèi)或者將其排除在程序代碼包括在匯編語言程序內(nèi)或者將其排除在程序之外。之外。 “是是IF偽操作的同義詞偽操作的同義詞 “|“是是ELSE偽操作的同義詞偽操作的同義詞 “”是是ENDIF偽操作的同義詞偽操作的同義詞 語法格式:語法格式: IF logic expression; logic expression控制選擇邏輯表達(dá)控制選擇邏輯表達(dá)式式 ;指令或偽指令代碼段指令或偽指令代碼段1 ELSE ;可選可選 ;指令或偽指令代碼段指令或偽指令代碼段2 ENDIFIF、ELSE及及ENDIF偽操作可以嵌套使用偽操作可以嵌套使用軟件學(xué)院軟件學(xué)院湖南大學(xué)

30、湖南大學(xué) Software School of Hunan University 例:例: IF Variable=16 ;如果如果Variable=16成立成立,則編譯則編譯下面代碼下面代碼 BNE SUB1 LDR R0,=SUB0 BX R0 ELSE ;否則編譯下面代碼否則編譯下面代碼 BNE SUB0 LDR R0,=SUB0 BX R1 ENDIF 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 2、WHILE及及WEND WHILE及及WEND偽操作能夠根據(jù)條偽操作能夠根據(jù)條件重復(fù)匯編相同的一段源代碼。件重復(fù)匯編相同的一段

31、源代碼。 語法格式:語法格式: WHILE logic expression instructions or derectives WENDWHILE和和WEND偽操作可以嵌套使用偽操作可以嵌套使用軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 例:例: count SETA 1 ;設(shè)置循環(huán)計(jì)數(shù)變量設(shè)置循環(huán)計(jì)數(shù)變量count初始值為初始值為1 WHILE count=4 ;由由count控制循環(huán)執(zhí)行的次數(shù)控制循環(huán)執(zhí)行的次數(shù) count SETA count+1 ;將循環(huán)計(jì)數(shù)變量加將循環(huán)計(jì)數(shù)變量加1 ;代碼代碼 WEND ;結(jié)束結(jié)束軟件學(xué)

32、院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 3、MACRO、MEND及及MEXIT MACRO:標(biāo)識宏定義的開始。:標(biāo)識宏定義的開始。 MEND:標(biāo)識宏定義的結(jié)束。:標(biāo)識宏定義的結(jié)束。 MACRO和和MEND之間的代碼稱為宏定義體。之間的代碼稱為宏定義體。 MEXIT:用于從宏中跳轉(zhuǎn)出去。:用于從宏中跳轉(zhuǎn)出去。 宏體代表了一個預(yù)定義的匯編語言指令序列宏體代表了一個預(yù)定義的匯編語言指令序列。在匯編程序中通過宏的名稱調(diào)用宏,編譯。在匯編程序中通過宏的名稱調(diào)用宏,編譯時,宏語句被展開。時,宏語句被展開。 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Sof

33、tware School of Hunan University 語法格式:語法格式: MACRO $label macroname $parameter, $parameter. ;code ;code MEND 其中:其中: $label:在宏被展開時:在宏被展開時,label可被替換成相應(yīng)的符號。可被替換成相應(yīng)的符號。 macroname:所定義的宏的名稱。:所定義的宏的名稱。 $parameter:宏指令的參數(shù)。:宏指令的參數(shù)。 在子程序比較短而需要傳遞的參數(shù)比較多的情況下,在子程序比較短而需要傳遞的參數(shù)比較多的情況下,可使用宏匯編技術(shù)??墒褂煤陞R編技術(shù)。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大

34、學(xué) Software School of Hunan UniversityMACRO、MEND 語法格式:語法格式: MACRO$標(biāo)號標(biāo)號 宏名宏名 $參數(shù)參數(shù)1,$參數(shù)參數(shù)2, 指令序列指令序列 MEND軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University示例:在示例:在ARM中完成測試跳轉(zhuǎn)操作需要兩條指令,定中完成測試跳轉(zhuǎn)操作需要兩條指令,定義一條宏指令完成測試跳轉(zhuǎn)操作義一條宏指令完成測試跳轉(zhuǎn)操作 MACRO$labelTestAndBranch $dest, $reg, $cc$labelCMP $reg,#0B$cc$dest MEN

35、D軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University;在程序中調(diào)用該宏;在程序中調(diào)用該宏test TestAndBranch NonZero, r0, NE NonZero;程序被匯編后,宏展開的結(jié)果;程序被匯編后,宏展開的結(jié)果test CMP r0, #0 BNE NonZero NonZero軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University4. 信息報告?zhèn)尾僮餍畔蟾鎮(zhèn)尾僮饔糜趨R編報告指示用于匯編報告指示 1)ASSERT斷言錯誤偽操作斷言錯誤偽操作 用于保證源程序被匯編時滿足相關(guān)

36、條件。如果條件不滿足,則ASSERT偽操作報告錯誤類型,并終止匯編。 例子 ASSERT TopTemp; 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University4. 信息報告?zhèn)尾僮饔糜趨R編報告指示 2)INFO匯編診斷信息顯示匯編診斷信息顯示 偽操作偽操作 用于顯示用戶自定義的錯誤信息。用于顯示用戶自定義的錯誤信息。 語法格式:語法格式: INFO numeric-expression, string-expression string-expression為一個字符串表達(dá)式,即診斷信息。為一個字符串表達(dá)式,即診斷信息。 numeric-ex

37、pression為一個數(shù)字表達(dá)式。為一個數(shù)字表達(dá)式。 例例 INFO 0, “Version 1.0” ;在第二遍掃描時,報告版本信息在第二遍掃描時,報告版本信息 IFlabel1 = label2 INFO 4, “Data overrun” ;如果成立,則在第一遍掃描時報告錯如果成立,則在第一遍掃描時報告錯 ;誤信息,并終止匯編誤信息,并終止匯編 ENDIF軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University信息報告?zhèn)尾僮?偽操作偽操作語法格式語法格式作作 用用ASSERTASSERT logical expression對匯編程序的第二

38、遍掃描中,如果其中對匯編程序的第二遍掃描中,如果其中ASSERT中條件中條件不成立,不成立,ASSERT偽操作將報告該錯誤信息。偽操作將報告該錯誤信息。INFOINFO numeric-expression,string-expression在匯編處理過程的第一遍掃描或者第二遍掃描時在匯編處理過程的第一遍掃描或者第二遍掃描時INFO偽操作報告診斷信息。偽操作報告診斷信息。OPTOPT n通過通過OPT偽操作可以在源程序中設(shè)置列表選項(xiàng)。偽操作可以在源程序中設(shè)置列表選項(xiàng)。TTL TTL title在列表文件的每一頁的開頭插入一個標(biāo)題。在列表文件的每一頁的開頭插入一個標(biāo)題。SUBTSUBT subt

39、itle在列表文件的每一頁的開頭插入一個子標(biāo)題。在列表文件的每一頁的開頭插入一個子標(biāo)題。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University5. 其他偽操作 1) CODE16和和CODE32 CODE16告訴匯編編譯器后面的指令序列為16位的Thumb指令。 CODE32告訴匯編編譯器后面的指令序列為32位的ARM指令。 語法格式: CODE16 CODE32CODE16和和CODE32只是告訴編譯器后面指令的只是告訴編譯器后面指令的類型,該偽操作本身不進(jìn)行程序狀態(tài)的切換。類型,該偽操作本身不進(jìn)行程序狀態(tài)的切換。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南

40、大學(xué) Software School of Hunan University 例: AREA ChangeState, CODE, READONLY ENTRY CODE32 ;下面為32位ARM指令 LDR R0,=start+1 BX R0 CODE16 ;下面為16位Thumb指令 start MOV R1,#10 . END;切換到切換到Thumb狀態(tài),并跳轉(zhuǎn)到狀態(tài),并跳轉(zhuǎn)到start處執(zhí)行處執(zhí)行軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 2)EQU 也可以用符號也可以用符號”*”表示表示 EQU偽操作為數(shù)字常量、基于寄存器

41、的值和程序中的標(biāo)號定義一個字符名稱。 語法格式: name EQU expr,type 其中: expr:基于寄存器的地址值、程序中的標(biāo)號、32位的地址常量或者32位的常量。 name:為expr定義的字符名稱。 type:當(dāng)expr為32位常量時,可以使用type指示expr的數(shù)據(jù)的類型。取值為: CODE32 CODE16 DATA軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 例: abcd EQU 2 ;定義abcd符號的值為2 abcd EQU label+16 ;定義abcd符號的值為(label+16) abcd EQU

42、0 x1c,CODE32 ;定義abcd符號的值為絕對地址 ;值0 x1c,而且此處為ARM指令Reg EQU 0 xe01fc080 ;外設(shè)中的寄存器 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 3) AREA 用于定義一個代碼段或是數(shù)據(jù)段。 語法格式: AREA sectionname,attr ,attr 其中: sectionname:為所定義的段的名稱。 attr:該段的屬性。具有的屬性為: CODE:定義代碼段。 DATA:定義數(shù)據(jù)段。 READONLY:指定本段為只讀,代碼段的默認(rèn)屬性。 READWRITE:指定本段為

43、可讀可寫,數(shù)據(jù)段的默認(rèn)屬性。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 4)ENTRY 指定程序的入口點(diǎn)。 語法格式: ENTRY 注意: 一個程序(可包含多個源文件)中至少要有一個ENTRY(可以有多個ENTRY),但一個源文件中最多只能有一個ENTRY(可以沒有ENTRY) AREA example, CODE READONLY ENTRY CODE32 START MOV R1, #0 x53軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 5、END END偽操作告訴編

44、譯器已經(jīng)到了源程序結(jié)尾。 語法格式: END 注意: 每一個匯編源程序都必須包含END偽操作,以表明本源程序的結(jié)束。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 6、EXPORT及GLOBAL聲明一個源文件中的符號,使得此符號可以被其他源文件引用。相當(dāng)于聲明了一個全局變量。語法格式:EXPORT/GLOBAL symbol weak其中: symbol:聲明的符號的名稱。(區(qū)分大小寫) weak:聲明其他同名符號優(yōu)先于本符號被引用。例: AREA example,CODE,READONLY EXPORT DoAdd DoAdd ADD

45、 R0,R0,R1 ; 函數(shù)名稱可以被其他文件引用軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 7、IMPORT及EXTERN 告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的。 語法格式: IMPORT symbolweak EXTERN symbolweak 其中: symbol:聲明的符號的名稱。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University weak: 當(dāng)沒有指定此項(xiàng)時,如果symbol在所有的源文件中都沒有被定義,則連接器會報告錯誤。 當(dāng)指定此項(xiàng)時

46、,如果symbol在所有的源文件中都沒有被定義,則連接器不會報告錯誤,而是進(jìn)行下面的操作。 1、如果該符號被B或者BL指令引用,則該符號被設(shè)置成下一條指令的地址,該B或BL指令相當(dāng)于一條NOP指令。 2、其他情況下此符號被設(shè)置成0。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 例子: AREA Init , CODE , READONLY IMPORT Main ;通知編譯器當(dāng)前文件要引用標(biāo)號 ;Main,但Main 在其他源文件中定義 END 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan Uni

47、versity 8、GET及INCLUDE 將一個源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。 指令格式: GET filename INCLUDE filename 其中: filename:包含的源文件名,可以使用路徑信息(可包含空格)。 例:GET d:armfile.s軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 9、INCBIN 將一個文件包含到當(dāng)前源文件中,而被包含的文件不進(jìn)行匯編處理 指令格式: INCBIN filename 其中: filename:被包含的文件名稱,可使用路徑信息(不能有空格

48、)。 通常使用此偽操作將一個可執(zhí)行文件或者任意數(shù)據(jù)包含到當(dāng)前文件中。 例:INCBIN d:armfile.txt軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 10) ROUT 語法格式: 名稱 ROUT ROUT 偽操作 用于給一個局部變量定義作用范圍。 在程序中未使用該偽操作時,局部變量的作用范圍為所在的 AREA , 而使用 ROUT 后,局部變量的作用范圍為當(dāng)前 ROUT 和下一個 ROUT 之間;若只有一個ROUT,則局部標(biāo)號的作用范圍在ROUT與段結(jié)束偽操作END之間。 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software

49、School of Hunan University其他偽操作偽操作偽操作語法格式語法格式作作 用用CODE16CODE16告訴匯編編譯器后面的指令序列為告訴匯編編譯器后面的指令序列為16位的位的Thumb指令指令CODE32CODE32告訴匯編編譯器后面的指令序列為告訴匯編編譯器后面的指令序列為32位的位的ARM指令。指令。EQUname EQU expr,type為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號(基于為數(shù)字常量、基于寄存器的值和程序中的標(biāo)號(基于PC的值)定義一個字符的值)定義一個字符名稱。名稱。AREAAREA sectionname,attr,attr定義一個代碼段或者數(shù)據(jù)段。

50、定義一個代碼段或者數(shù)據(jù)段。ENTRYENTRY指定程序的入口點(diǎn)。指定程序的入口點(diǎn)。ENDEND告訴編譯器已經(jīng)到了源程序結(jié)尾。告訴編譯器已經(jīng)到了源程序結(jié)尾。ALIGNALIGN expr,offset通過添加補(bǔ)丁字節(jié)使當(dāng)前位置滿足一定的對齊方式。通過添加補(bǔ)丁字節(jié)使當(dāng)前位置滿足一定的對齊方式。E X P O R T / GLOBALEXPORT symbol WEAK聲明一個符號可以被其他文件引用,相當(dāng)于聲明了一個全局變量。聲明一個符號可以被其他文件引用,相當(dāng)于聲明了一個全局變量。IMPORTIMPORT symbol WEAK告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,

51、告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。在本源文件中可能引用該符號。EXTERNEXTERN symbol WEAK告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,告訴編譯器當(dāng)前的符號不是在本源文件中定義的,而是在其他源文件中定義的,在本源文件中可能引用該符號。在本源文件中可能引用該符號。GET/ INCLUDEGET filename 將一個源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編將一個源文件包含到當(dāng)前源文件中,并將被包含的文件在其當(dāng)前位置進(jìn)行匯編處理。處理。INCBININCBIN fil

52、ename將一個文件包含到當(dāng)前源文件中,被包含的文件不進(jìn)行匯編處理。將一個文件包含到當(dāng)前源文件中,被包含的文件不進(jìn)行匯編處理。KEEPKEEPsymbol告訴編譯器將局部符號包含在目標(biāo)文件的符號表中。告訴編譯器將局部符號包含在目標(biāo)文件的符號表中。NOFPNOFP禁止源程序中包含浮點(diǎn)運(yùn)算指令。禁止源程序中包含浮點(diǎn)運(yùn)算指令。REQUIREREQUIRE lable指定段之間的相互依賴關(guān)系。指定段之間的相互依賴關(guān)系。RNname RN expr為一個特定的寄存器定義名稱。為一個特定的寄存器定義名稱。ROUTname ROUT定義局部變量的有效范圍。定義局部變量的有效范圍。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南

53、大學(xué) Software School of Hunan University二、二、ARM匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) 1 ARM匯編中的文件格式 2 ARM匯編語言語句格式 3 ARM匯編語言程序格式軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University1.ARM匯編中的文件格匯編中的文件格式式 ARM源程序文件(可簡稱為源文件)可以由任意一種文本編輯器來編寫程序代碼,它一般為文本格式。在ARM程序設(shè)計(jì)中,常用的源文件可簡單分為以下幾種:源程序文件源程序文件文件名文件名說說 明明匯編程序文件匯編程序文件*.S用用ARM匯編語言編寫的匯編語

54、言編寫的ARM程序或程序或Thumb程序。程序。C程序文件程序文件*.C用用C語言編寫的程序代碼。語言編寫的程序代碼。頭文件頭文件*.H為了簡化源程序,把程序中常用到的常為了簡化源程序,把程序中常用到的常量命名、宏定義、數(shù)據(jù)結(jié)構(gòu)定義等等單量命名、宏定義、數(shù)據(jù)結(jié)構(gòu)定義等等單獨(dú)放在一個文件中,一般稱為頭文件。獨(dú)放在一個文件中,一般稱為頭文件。至少包含一個匯編源文件或至少包含一個匯編源文件或C源文件源文件軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan Unive

55、rsity2、ARM匯編語言語句格式匯編語言語句格式symbol instruction | directive | pseudo-instruction ; comment標(biāo)簽標(biāo)簽 指令指令/偽操作偽操作/偽指令偽指令 操作數(shù)操作數(shù) ;語句的注釋語句的注釋例:例: labeladd add r0, r0, r1 ;加法指令,加法指令,labeladd為標(biāo)簽為標(biāo)簽注意:注意:1. 在在ARM匯編語言中,各個指令、偽指令及偽操作的助記符可以匯編語言中,各個指令、偽指令及偽操作的助記符可以全部用大寫字母,也可全部用小寫字母,全部用大寫字母,也可全部用小寫字母,不能在一個助記符中不能在一個助記符中即

56、有大寫又有小寫。即有大寫又有小寫。2. 如果一條語句很長,為了提高可讀性,可使用如果一條語句很長,為了提高可讀性,可使用“”將長語句分成將長語句分成若干行來寫,在若干行來寫,在后不能再有任何其他字符。后不能再有任何其他字符。3. 標(biāo)號必須在一行的頂格書寫,而所有指令均不能頂格書寫。標(biāo)號必須在一行的頂格書寫,而所有指令均不能頂格書寫。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 在匯編語言程序設(shè)計(jì)中,經(jīng)常使用各種符號代替地址、變量和常量等,以增加程序的可讀性。 盡管符號的命名由編程者決定,但并不是任意的,必須遵循以下的約定: 符號區(qū)分大

57、小寫,同名的大、小寫符號會被編譯器認(rèn)為是兩個不同的符號。 符號在其作用范圍內(nèi)必須唯一。 自定義的符號名不能與系統(tǒng)的保留字相同。 符號名不應(yīng)與指令或偽指令同名。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 3. ARM匯編語言程序格式 ARM匯編語言是以段(section)為單位來組織源文件的。段是相對獨(dú)立的、具有特定名稱的、不可分割的指令或者數(shù)據(jù)序列。段又可以分為代碼段和數(shù)據(jù)段,代碼段存放執(zhí)行代碼,數(shù)據(jù)段存放代碼運(yùn)行時需要用到的數(shù)據(jù)。一個ARM源程序至少需要一個代碼段,大的程序可以包含多個代碼段和數(shù)據(jù)段。 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南

58、大學(xué) Software School of Hunan University ARM匯編語言源程序經(jīng)過匯編處理后生成一個可執(zhí)行的映像文件,通常包括3部分: (1)一個或多個代碼段。 (2)0或多個包含初始值的數(shù)據(jù)段。 (3)0或多個不包含初始值的數(shù)據(jù)段。 鏈接器根據(jù)一定的規(guī)則將各個段安排到內(nèi)存的相應(yīng)位置。軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 代碼段的例子:代碼段的例子:AREA HAREA Hello,CODE,READONLYello,CODE,READONLY; ;聲明代碼段聲明代碼段HelloHelloENTRYENTR

59、Y; ;程序的入口點(diǎn)程序的入口點(diǎn)START MOV R7,#10START MOV R7,#10MOV R6,#5MOV R6,#5ADD R6,R6,R7ADD R6,R6,R7;R6=R6+R7;R6=R6+R7ENDEND; ;每一個匯編文件每一個匯編文件; ;都要以都要以ENDEND結(jié)束結(jié)束軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University 數(shù)據(jù)的例子:數(shù)據(jù)的例子:AREA DateareaAREA Datearea,DATA,NOINIT,DATA,NOINIT; ;聲明數(shù)據(jù)段聲明數(shù)據(jù)段DateareaDatearea DATAS

60、PACE SPACE 100 DATASPACE SPACE 100; ;分配連續(xù)分配連續(xù)100100字節(jié)的存儲單元字節(jié)的存儲單元, ,并初始化為零并初始化為零軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan UniversityARM匯編語言編程的重點(diǎn) ARM數(shù)據(jù)處理操作設(shè)置條件碼匯編語言子程序調(diào)用及返回 軟件學(xué)院軟件學(xué)院湖南大學(xué)湖南大學(xué) Software School of Hunan University1. ARM數(shù)據(jù)處理操作(1)簡單的寄存器操作 ADDR0 , R1, R2 ; R1+R2送到送到R0(2)立即數(shù)操作 : 立即數(shù)由8位的立即數(shù)循環(huán)右移2n位(3)寄

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論