版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、13.2 ARM指令集介紹指令集介紹2內(nèi)容p ARM指令集p 一些基本的ARM指令功能段p Thumb指令介紹ARM指令集跳轉(zhuǎn)指令 在ARM中有兩種方式可以實現(xiàn)程序的跳轉(zhuǎn),一種是使用分支指令直接跳轉(zhuǎn),另一種則是直接向PC寄存器賦值實現(xiàn)跳轉(zhuǎn)。 分支指令有以下三種:跳轉(zhuǎn)指令B;帶返回的跳轉(zhuǎn)指令BL;帶返回和狀態(tài)切換的跳轉(zhuǎn)指令BLX; 帶狀態(tài)切換的分支指令BX。ARM跳轉(zhuǎn)指令指令編碼跳轉(zhuǎn)指令B/BL指令編碼格式指令執(zhí)行的條件碼L區(qū)別B指令(L為0)和BL指令(L為1)24位有符號立即數(shù)(偏移量)分支指令BX指令編碼格式指令執(zhí)行的條件碼Rm目標地址寄存器,該寄存器裝載跳轉(zhuǎn)地址助記符說明操作條件碼位置B
2、 label跳轉(zhuǎn)指令PClabelBcondBL label帶鏈接的跳轉(zhuǎn)指令LRPC-4,PClabelBLcondBX Rm帶狀態(tài)切換的跳轉(zhuǎn)指令PCRm,切換處理器狀態(tài)BXcondARM指令跳轉(zhuǎn)指令助記符助記符說明說明操作操作條件碼位置條件碼位置B labelB label分支指令分支指令PCPClabellabelBcondBcondBL label帶鏈接的分支指令LRPC-4,PClabelBLcondBX Rm帶狀態(tài)切換的分支指令PCRm,切換處理器狀態(tài)BXcondARM指令跳轉(zhuǎn)指令 跳轉(zhuǎn)指令B指令,該指令跳轉(zhuǎn)范圍限制在當前指令的32M字節(jié)地址內(nèi)(ARM指令為字對齊,最低2位地址固定為
3、0)。指令格式如下:Bcond Label 應用示例: B WAITA; 跳轉(zhuǎn)到WAITA標號處 B0 x1234; 跳轉(zhuǎn)到絕對地址0 x1234處 BL LabelxxxxxxLabelxxxMOV PC,LRAddr1Addr2xxxxxxLRPC助記符說明操作條件碼位置B label分支指令PClabelBcondBL labelBL label帶鏈接的分支指令帶鏈接的分支指令LRLRPC-4PC-4,PCPClabellabelBLcondBLcondBX Rm帶狀態(tài)切換的分支指令PCRm,切換處理器狀態(tài)BXcondARM指令跳轉(zhuǎn)指令 帶鏈接的跳轉(zhuǎn)指令BL指令適用于子程序調(diào)用,使用該指
4、令后,下一條指令的地址被拷貝到R14(即LR) 連接寄存器中,然后跳轉(zhuǎn)到指定地址運行程序。跳轉(zhuǎn)范圍限制在當前指令的32M字節(jié)地址內(nèi)。指令格式如下:BLcond LabelAddr1LabelAddr2Addr21.當程序執(zhí)行到BL跳轉(zhuǎn)指令時,硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉(zhuǎn)地址裝入程序計數(shù)器(PC)2. 程序跳轉(zhuǎn)到目標地址Label繼續(xù)執(zhí)行,當子程序執(zhí)行結束后,將LR寄存器內(nèi)容存入PC,返回調(diào)用函數(shù)繼續(xù)執(zhí)行 應用示例(調(diào)用子程序): BL Label助記符說明操作條件碼位置B label分支指令PClabelBcondBL label帶鏈接的分支指令LRPC-4,PCl
5、abelBLcondBX RmBX Rm帶狀態(tài)切換的分支指令帶狀態(tài)切換的分支指令PCPCRmRm,切換處理器狀態(tài),切換處理器狀態(tài)BXcondBXcondARM指令跳轉(zhuǎn)指令 帶狀態(tài)切換的跳轉(zhuǎn)指令BX指令,該指令可以根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來切換處理器狀態(tài)。其跳轉(zhuǎn)范圍限制在當前指令的32M字節(jié)地址內(nèi)(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:BXcond Rm跳轉(zhuǎn)地址Rm0跳轉(zhuǎn)后CPSR標志T位處理器狀態(tài)00ARM11Thumb助記符說明操作條件碼位置B label分支指令PClabelBcondBL label帶鏈接的分支指令LRPC-4,PClabelBLcondBX Rm
6、BX Rm帶狀態(tài)切換的分支指令PCRm,切換處理器狀態(tài)BXcondARM指令跳轉(zhuǎn)指令 帶狀態(tài)切換的跳轉(zhuǎn)指令帶狀態(tài)切換的跳轉(zhuǎn)指令BXBX指令,該指令可以根據(jù)跳指令,該指令可以根據(jù)跳轉(zhuǎn)地址(轉(zhuǎn)地址(RmRm)的最低位來切換處理器狀態(tài)。若)的最低位來切換處理器狀態(tài)。若RmRm的位的位00為為1 1,則指令將則指令將CPSRCPSR中的標志中的標志T T置位,且將目標地址的代碼解釋為置位,且將目標地址的代碼解釋為ThumbThumb代碼;指令格式如下:代碼;指令格式如下:BXcond Rm 應用示例: ADRL R0,ThumbFun+1 ;將Thumb程序的入口地址加1存入R0 BX R0 ; 跳轉(zhuǎn)
7、到R0指定的地址, ;并根據(jù)R0的最低位來切換處理器狀態(tài)BLX 帶返回和狀態(tài)切換的跳轉(zhuǎn)指令帶返回和狀態(tài)切換的跳轉(zhuǎn)指令10p格式:格式:BLX ;或或BLX ;p功能:功能:處理器跳轉(zhuǎn)到目標地址處,并將處理器跳轉(zhuǎn)到目標地址處,并將PC(寄存器(寄存器R15)的值保存到)的值保存到LR寄存器(寄存器(R14)中。)中。p如果目標地址處為如果目標地址處為Thumb指令,則程序狀態(tài)從指令,則程序狀態(tài)從ARM狀狀態(tài)切換為態(tài)切換為Thumb狀態(tài)。狀態(tài)。p該指令用于子程序調(diào)用和該指令用于子程序調(diào)用和程序狀態(tài)的切換程序狀態(tài)的切換。p例如:例如:BLX T16; 跳轉(zhuǎn)到標號跳轉(zhuǎn)到標號T16處執(zhí)行,處執(zhí)行,T16
8、后面的指令為后面的指令為Thumb指令指令CODE16T16后面指令為后面指令為Thumb指令指令 ARM指令集ARM數(shù)據(jù)處理指令數(shù)據(jù)處理指令大致可分為3類: 數(shù)據(jù)傳送指令; 算術邏輯運算指令; 比較指令。 數(shù)據(jù)處理指令只能對寄存器的內(nèi)容進行操作對寄存器的內(nèi)容進行操作,不能對內(nèi)存中的數(shù)據(jù)進行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,以使指令影響狀態(tài)標志。 ARM數(shù)據(jù)處理指令指令編碼指令執(zhí)行的條件碼I用于區(qū)別立即數(shù)(I為1)和寄存器移位(I為0)opcode數(shù)據(jù)處理指令操作碼第二操作數(shù)Rd目標寄存器Rn第一操作數(shù)寄存器S設置條件碼,與指令中的S位對應帶進位加法ADC0101帶進位減法指令S
9、BC0110帶進位逆向減法指令RSC0111位測試指令TST1000相等測試指令TEQ1001比較指令CMP1010負數(shù)比較指令CMN1011邏輯或操作指令ORR1100數(shù)據(jù)傳送MOV1101位清除指令BIC1110數(shù)據(jù)非傳送MVN1111加法運算指令ADD0100逆向減法指令RSB0011減法運算指令SUB0010邏輯異或操作指令EOR0001邏輯與操作指令AND0000說明指令助記符操作碼opcode操作碼功能表助記符說明操作條件碼位置MOV Rd,operand2數(shù)據(jù)傳送Rdoperand2 MOVcondSMVN Rd,operand2數(shù)據(jù)非傳送Rd(operand2)MVNcondS
10、ARM數(shù)據(jù)處理指令數(shù)據(jù)傳送注:當后綴S時,這些指令根據(jù)結果更新標志N和Z,在計算Operand2時更新標志C,不影響標志V。 MOV指令將8位立即數(shù)(參看“第2操作數(shù):#immed_8r常數(shù)表達式 ”)或寄存器傳送到目標寄存器(Rd),可用于移位運算等操作。指令格式如下: MOVcondS Rd,operand2 MOV指令舉例如下: MOVR11,#0 xF000000B;R1= 0 xF000000B MOVR0,R1;R0=R1 MOVSR3,R1,LSL #2;R3=R12,并影響標志位 MOVPC,LR;PC=LR,子程序返回 助記符說明操作條件碼位置MOV Rd,operand2M
11、OV Rd,operand2數(shù)據(jù)傳送Rdoperand2 MOVcondSMVN Rd,operand2數(shù)據(jù)非傳送Rd(operand2)MVNcondSARM數(shù)據(jù)處理指令數(shù)據(jù)傳送助記符說明操作條件碼位置MOV Rd,operand2數(shù)據(jù)傳送Rdoperand2 MOVcondSMVN Rd,operand2MVN Rd,operand2數(shù)據(jù)非傳送Rd(operand2)MVNcondSARM數(shù)據(jù)處理指令數(shù)據(jù)傳送 MVN指令將8位圖立即數(shù)(參看“第2操作數(shù):#immed_8r常數(shù)表達式 ”)或寄存器(operand2)按位取反后傳送到目標寄存器(Rd),因為其具有取反功能,所以可以裝載范圍更廣
12、的立即數(shù)。指令格式如下: MVNcondS Rd,operand2 MVN指令舉例如下: MVNR1,#0 xFF;R1=0 xFFFFFF00 MVNR1,R2;將R2按位取反,結果存到R1助記符說明操作條件碼位置ADD Rd, Rn, operand2加法運算指令RdRn+operand2ADDcondSSUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondSRSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondSADC Rd, Rn, operand2帶進位加法RdRn+operand2+CarryADCcond
13、SSBC Rd, Rn, operand2帶進位減法指令RdRn-operand2-(NOT)CarrySBCcondSRSC Rd, Rn, operand2帶進位逆向減法指令Rdoperand2-Rn-(NOT)CarryRSCcondSARM數(shù)據(jù)處理指令算術運算注:這些指令影響N,Z,C和V標志位。助記符說明操作條件碼位置ADD Rd, Rn, operand2ADD Rd, Rn, operand2加法運算指令RdRn+operand2ADDcondSSUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondSRSB Rd, Rn, operand2逆
14、向減法指令Rdoperand2-RnRSBcondSADC Rd, Rn, operand2帶進位加法RdRn+operand2+CarryADCcondSSBC Rd, Rn, operand2帶進位減法指令RdRn-operand2-(NOT)CarrySBCcondSRSC Rd, Rn, operand2帶進位逆向減法指令Rdoperand2-Rn-(NOT)CarryRSCcondSARM數(shù)據(jù)處理指令算術運算 加法運算指令ADD指令將operand2的值與Rn的值相加,結果保存到Rd寄存器。指令格式如下: ADDcondS Rd,Rn,operand2 應用示例: ADDS R1,R
15、1,#1020;R1=R1+1020,并影響標志位 ADD R1,R1,R2,LSL #2;R1=R1+R22 助記符說明操作條件碼位置ADD Rd, Rn, operand2加法運算指令RdRn+operand2ADDcondSSUB Rd, Rn, operand2SUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondSRSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondSADC Rd, Rn, operand2帶進位加法RdRn+operand2+CarryADCcondSSBC Rd, Rn, operand
16、2帶進位減法指令RdRn-operand2-(NOT)CarrySBCcondSRSC Rd, Rn, operand2帶進位逆向減法指令Rdoperand2-Rn-(NOT)CarryRSCcondSARM數(shù)據(jù)處理指令算術運算 減法運算指令SUB指令用寄存器Rn減去operand2,結果保存到Rd中。指令格式如下: SUBcondS Rd,Rn,operand2 應用示例: SUBSR0,R0,#240;R0=R0-240 ,并影響標志位 SUBSR2,R1,R2;R2=R1-R2 ,并影響標志位 助記符說明操作條件碼位置ADD Rd, Rn, operand2加法運算指令RdRn+oper
17、and2ADDcondSSUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondSRSB Rd, Rn, operand2RSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondSADC Rd, Rn, operand2帶進位加法RdRn+operand2+CarryADCcondSSBC Rd, Rn, operand2帶進位減法指令RdRn-operand2-(NOT)CarrySBCcondSRSC Rd, Rn, operand2帶進位逆向減法指令Rdoperand2-Rn-(NOT)CarryRSCcondSAR
18、M數(shù)據(jù)處理指令算術運算 逆向減法運算指令RSB指令將operand2的值減去Rn,結果保存到Rd中。指令格式如下: RSBcondS Rd,Rn,operand2 應用示例: RSB R3,R1,#0 xFF00 ;R3=0 xFF00-R1 RSBS R1,R2,R2,LSL #2 ;R1=(R210, 則執(zhí)行本指令 助記符說明操作條件碼位置CMP Rn, operand2比較指令標志N、Z、C、VRn-operand2CMPcondCMN Rn, operand2CMN Rn, operand2負數(shù)比較指令標 志 N 、 Z 、 C 、VRn+operand2CMNcondTST Rn,
19、operand2位測試指令標志N、Z、C、VRn & operand2TSTcondTEQ Rn, operand2相等測試指令標志N、Z、C、VRn operand2TEQcondARM數(shù)據(jù)處理指令比較指令 負數(shù)比較指令CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。指令格式如下: CMNcondRn, operand2 應用示例: CMNR0,#1 ; R0+1,判斷R0是否為1的補碼;如果是,則設置Z標志位助記符說明操作條件碼位置CMP Rn, operand2比較指令標志N、Z、
20、C、VRn-operand2CMPcondCMN Rn, operand2CMN Rn, operand2負數(shù)比較指令標 志 N 、 Z 、 C 、VRn+operand2CMNcondTST Rn, operand2位測試指令標志N、Z、C、VRn & operand2TSTcondTEQ Rn, operand2相等測試指令標志N、Z、C、VRn operand2TEQcondARM數(shù)據(jù)處理指令比較指令 負數(shù)比較指令CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。指令格式如下: CM
21、NcondRn, operand2注意:CMN指令與ADDS指令的區(qū)別在于CMN指令不保存運算結果。CMN指令可用于負數(shù)比較,比如CMN R0,#1指令則表示R0與-1比較,若R0為-1(即1的補碼),則Z置位;否則Z復位。 助記符說明操作條件碼位置CMP Rn, operand2比較指令標志N、Z、C、VRn-operand2CMPcondCMN Rn, operand2負數(shù)比較指令標 志 N 、 Z 、 C 、VRn+operand2CMNcondTST Rn, operand2TST Rn, operand2位測試指令標志N、Z、C、VRn & operand2TSTcondTE
22、Q Rn, operand2相等測試指令標志N、Z、C、VRn operand2TEQcondARM數(shù)據(jù)處理指令比較指令 位測試指令TST指令將寄存器Rn的值與operand2的值按位作邏輯“與與”操作,根據(jù)操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。指令格式如下: TSTcond Rn, operand2 應用示例: TSTR0,#0 x01; 判斷R0的最低位是否為0 TSTR1,#0 x0F; 判斷R1的低4位是否為0 助記符說明操作條件碼位置CMP Rn, operand2比較指令標志N、Z、C、VRn-operand2CMPcondCMN
23、 Rn, operand2負數(shù)比較指令標 志 N 、 Z 、 C 、VRn+operand2CMNcondTST Rn, operand2位測試指令標志N、Z、C、VRn & operand2TSTcondTEQ Rn, operand2TEQ Rn, operand2相等測試指令標志N、Z、C、VRn operand2TEQcondARM數(shù)據(jù)處理指令比較指令 相等測試指令TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,根據(jù)操作結果更新CPSR中的相應條件標志位,以便后面的指令根據(jù)相應的條件標志來判斷是否執(zhí)行。不保存運算結果不保存運算結果,指令格式如下: TEQ
24、cond Rn, operand2 應用示例: TEQR0,R1; 比較R0與R1是否相等 (不影響V位和C位)ARM指令集指令集乘法指令乘法指令 ARM具有三種乘法指令,分別為: 3232位乘法指令; 3232位乘加指令; 3232位結果為64位的乘/乘加指令。ARM指令乘法指令乘法指令編碼指令執(zhí)行的條件碼Opcode乘法指令操作碼S設置條件碼,與指令中的S位對應Rm為被乘數(shù)寄存器Rn/RdLo為MLA指令相加的寄存器或64位乘法指令的目標寄存器(低32位)Rd/RdHi為目標寄存器或64位乘法指令的目標寄存器(高32位)Rs為乘數(shù)寄存器64位有符號乘加指令SMLAL11164位有符號乘法指
25、令SMULL11064位無符號乘加指令UMLAL10164位無符號乘法指令UMULL10032位乘加指令MLA00132位乘法指令MUL000說明指令助記符操作碼opcode操作碼功能表助記符說明操作條件碼位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi) Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi) Rm*Rs
26、+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi) Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令助記符說明操作條件碼位置MUL Rd,Rm,RsMUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位無符號乘法
27、指令(RdLo,RdHi) Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi) Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 32位乘法指令MUL指令將Rm和Rs中的值相乘,結果的低32位保存到Rd中。 Rd,Rm,Rs不能為R15。只影響CPSR中
28、的N位和Z位,不影響V,C不確定。指令格式如下:MULcondS Rd,Rm,Rs 應用示例: MUL R1,R2,R3 ;R1=R2R3 MULS R0,R3,R7 ;R0=R3R7,影響CPSR中的N位和Z位 助記符說明操作條件碼位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,RnMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi) Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,
29、Rs64位無符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi) Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 32位乘加指令MLA指令將Rm和Rs中的值相乘,再將乘積加上第3個操作數(shù),結果的低32位保存到Rd中。 Rd,Rm,Rs,Rn不能為R15。只影響CPSR中的N位和Z位,不影響V,C不確定。指令格式如下: MLAcondS
30、 Rd,Rm,Rs,Rn 應用示例: MLA R1,R2,R3,R0; R1=R2R3+R0助記符說明操作條件碼位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,RsUMULL RdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi) Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)UMLALcondSSMUL
31、L RdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi) Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 64位無符號乘法指令UMULL指令將Rm和Rs中的值作無符號數(shù)相乘,結果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標志C和V不確定。指令格式如下: UMULLcondS RdLo,RdHi,Rm,Rs 應
32、用示例: UMULL R0,R1,R5,R8; (R1、R0)=R5R8 助記符說明操作條件碼位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi) Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,RsUMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,Rd
33、Hi,Rm,Rs64位有符號乘法指令(RdLo,RdHi) Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 64位無符號乘加指令UMLAL指令將Rm和Rs中的值作無符號數(shù)相乘,64位乘積與RdHi、RdLo相加,結果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標志C和V不確定。指令格式如下: UMLALcondS RdLo,RdH
34、i,Rm,Rs 應用示例: UMLAL R0,R1,R5,R8;(R1、R0)=R5R8+(R1、R0) 助記符說明操作條件碼位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi) Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm
35、,RsSMULL RdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi) Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 64位有符號乘法指令SMULL指令將Rm和Rs中的值作有符號數(shù)相乘,結果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標志C和V不確定。指令格式如下: SMULLcondS RdLo,RdHi,
36、Rm,Rs 應用示例: SMULLR2,R3,R7,R6; (R3、R2)=R7R6 助記符說明操作條件碼位置MUL Rd,Rm,Rs32位乘法指令RdRm*Rs (RdRm)MULcondSMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi) Rm*Rs UMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)UMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符號乘
37、法指令(RdLo,RdHi) Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,RsSMLAL RdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi) Rm*Rs+(RdLo,RdHi)SMLALcondSARM指令乘法指令 64位有符號乘加指令SMLAL指令將Rm和Rs中的值作有符號數(shù)相乘,64位乘積與RdHi、RdLo相加,結果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標志C和V不確定。指令格式如下: SMLALcondS Rd
38、Lo,RdHi,Rm,Rs 應用示例: SMLALR2,R3,R7,R6; (R3、R2)=R7R6+(R3、R2) ARM指令集指令集狀態(tài)寄存器訪問指令狀態(tài)寄存器訪問指令ARM指令集中有兩條指令作為雜項指令,它們?nèi)缦滤荆褐浄f明操作條件碼位置MRS Rd,psr讀狀態(tài)寄存器指令Rdpsr,psr為CPSR或SPSRMRScondMSR psr_fields,Rd/#immed_8r寫狀態(tài)寄存器指令psr_fieldsRd/#immed_8r,psr為CPSR或SPSRMSRcond狀態(tài)寄存器訪問指令狀態(tài)寄存器訪問指令 在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進行
39、讀操作。通過讀CPSR可以了解當前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。該指令不影響條件碼。MRScond Rd,psrMRS指令格式指令對應編碼指令執(zhí)行的條件碼目標寄存器,不能為R15區(qū)別CPSR(為0)和SPSR(為1)寄存器狀態(tài)寄存器讀指令 在ARM處理器中,只有MRS指令可以對狀態(tài)寄存器CPSR和SPSR進行讀操作。通過讀CPSR可以了解當前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進入異常前的處理器狀態(tài)。MRScond Rd,psrMRS指令格式 應用示例: MRS R1,CPSR; 將CPSR狀態(tài)寄存器讀取,保存到R1中 MRS R2,SPSR; 將
40、SPSR狀態(tài)寄存器讀取,保存到R2中狀態(tài)寄存器寫指令 在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。MSRcond psr_fields,#immed_8rMSR指令格式1MSRcond psr_fields,RmMSR指令格式2指令執(zhí)行的條件碼CPSR或SPSR指定傳送的區(qū)域,可以為以下字母(必須小寫)的一個或者組合:c 控制域屏蔽字節(jié)(psr7.0)x 擴展域屏蔽字節(jié)(psr15.8)s 狀態(tài)域屏蔽字節(jié)(psr23.16)f 標志域
41、屏蔽字節(jié)(psr31.24)保存要傳送到狀態(tài)寄存器指定域數(shù)據(jù)的源寄存器要傳送到狀態(tài)寄存器指定域的立即數(shù)狀態(tài)寄存器寫指令 在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。指令執(zhí)行的條件碼CPSR或SPSR指定傳送的區(qū)域,可以為以下字母(必須小寫)的一個或者組合:c 控制域屏蔽字節(jié)(psr7.0)x 擴展域屏蔽字節(jié)(psr15.8)s 狀態(tài)域屏蔽字節(jié)(psr23.16)f 標志域屏蔽字節(jié)(psr31.24)要傳送到狀態(tài)寄存器指定域的立即數(shù)MS
42、R指令1編碼MSR指令2編碼8_bit_immediate:8位位圖立即數(shù)(1)(2)(3)(4)狀態(tài)寄存器寫指令 在ARM處理器中,只有MSR指令可以對狀態(tài)寄存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現(xiàn)對CPSR或SPSR寄存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。 應用示例1:;子程序:使能IRQ中斷ENABLE_IRQ MRS R0, CPSR BIC R0, R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR 應用示例2:;子程序:禁能IRQ中斷DISABLE_IRQ MRS R0, CPSR ORR R0, R0,
43、#0 x80 MSR CPSR_c,R0 MOV PC,LR 1.將CPSR寄存器內(nèi)容讀出到R0;2.修改對應于CPSR中的I控制位;3.將修改后的值寫回 CPSR寄存器的對應控制域;4.返回上一層函數(shù);ARM指令集內(nèi)存訪問指令 ARM處理器是典型的RISC處理器,對存儲器的訪問只能使用LOAD/STORE指令實現(xiàn)。ARM處理器RAM存儲空間及I/O映射空間統(tǒng)一編址統(tǒng)一編址,除對RAM操作以外,對外圍IO、程序數(shù)據(jù)的訪問均要通過LOAD/STORE指令進行。 存儲器訪問指令分為: 單寄存器操作指令 多寄存器操作指令。助記符說明操作條件碼位置LDR Rd,addressing 加載字數(shù)據(jù)Rdad
44、dressing,addressing索引LDRcondLDRB Rd,addressing 加載無符號字節(jié)數(shù)據(jù)Rdaddressing,addressing索引LDRcondBLDRT Rd,addressing以用戶模式加載字數(shù)據(jù)Rdaddressing,addressing索引LDRcondTLDRBT Rd, addressing 以用戶模式加載無符號字節(jié)數(shù)據(jù)Rdaddressing,addressing索引LDRcondBTLDRH Rd, addressing 加載無符號半字數(shù)據(jù)Rdaddressing,addressing索引LDRcondHLDRSB Rd, addressin
45、g 加載有符號字節(jié)數(shù)據(jù)Rdaddressing,addressing索引LDRcondSBLDRSH Rd, addressing加載有符號半字數(shù)據(jù) Rdaddressing,addressing索引 LDRcondSH ARM存儲器訪問指令單寄存器加載助記符說明操作條件碼位置STR Rd, addressing 存儲字數(shù)據(jù)addressingRd,addressing索引STRcondSTRB Rd,addressing 存儲字節(jié)數(shù)據(jù)addressingRd,addressing索引STRcondBSTRT Rd,addressing 以用戶模式存儲字數(shù)據(jù)addressingRd, addr
46、essing索引STRcondTSTRBT Rd,addressing 以用戶模式存儲字節(jié)數(shù)據(jù)addressingRd,addressing索引STRcondBTSTRH Rd,addressing 存儲半字數(shù)據(jù)addressing Rd,addressing索引STRcondHARM存儲器訪問指令單寄存器存儲 LDR/STR指令用于對內(nèi)存變量的訪問、內(nèi)存緩沖區(qū)數(shù)據(jù)的訪問、查表、外圍部件的控制操作等。若使用LDR指令加載數(shù)據(jù)到PC寄存器,則實現(xiàn)程序跳轉(zhuǎn)功能,這樣也就實現(xiàn)了程序散轉(zhuǎn)。 所有單寄存器加載/存儲指令可分為“字和無符號字節(jié)加載存儲指令”和“半字和有符號字節(jié)加載存儲指令。LDR和STR字
47、和無符號字節(jié)加載/存儲指令 LDR指令用于從內(nèi)存中讀取單一字或字節(jié)數(shù)據(jù)存入寄存器中,STR指令用于將寄存器中的單一字或字節(jié)數(shù)據(jù)保存到內(nèi)存。指令格式如下:ARM存儲器訪問指令單寄存器存儲 LDRcondTRd, ;將指定地址上的字數(shù)據(jù)讀入Rd STRcondTRd, ;將Rd中的字數(shù)據(jù)存入指定地址 LDRcondBTRd, ;將指定地址上的字節(jié)數(shù)據(jù)讀入Rd STRcondBTRd, ;將Rd中的字節(jié)數(shù)據(jù)存入指定地址 其中,T為可選后綴。若指令有T,那么即使處理器是在特權模式下,存儲系統(tǒng)也將訪問看成是在用戶模式下進行的。T在用戶模式下無效,不能與前索引偏移一起使用T。 ARM存儲器訪問指令單寄存器
48、存儲LDR和STR字和無符號字節(jié)加載/存儲指令編碼指令執(zhí)行的條件碼I為0時,偏移量為12位立即數(shù),為1時,偏移量為寄存器移位P表示前/后變址U表示加/減B為1表示字節(jié)訪問,為0表示字訪問W表示回寫為指令的尋址方式Rd為源/目標寄存器Rn為基址寄存器L用于區(qū)別加載(L為1)或存儲(L為0)ARM存儲器訪問指令單寄存器存儲LDR和STR字和無符號字節(jié)加載/存儲指令 LDR/STR指令尋址非常靈活,它由兩部分組成,其中一部分為一個基址寄存器,可以為任一個通用寄存器;另一部分為一個地址偏移量。地址偏移量有以下3種格式: 立即數(shù)。立即數(shù)可以是一個無符號的數(shù)值。這個數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存
49、器中減去這個數(shù)值。 如:LDR R1,R0,#0 x12 ;R1-R0+0 x12寄存器。寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。 如:LDR R1,R0,R2 ; R1-R0+R2 LDR R1,R0,-R2 ; R1-R0-R2寄存器及移位常數(shù)。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。 如:LDR R1,R0,R2,LSL #2 ;R1-R0+R2*4 ARM存儲器訪問指令單寄存器存儲 從尋址方式的地址計算方法分,加載/存儲指令有以下4種格式: 零偏移。如:LDR Rd,Rn 前索引偏移。如:LDR Rd,Rn,#0 x04!程序相
50、對偏移。如:LDR Rd,labe1 后索引偏移。如:LDR Rd,Rn,#-0 x04注意:必須保證字數(shù)據(jù)操作的地址是32位對齊的。LDR和STR字和無符號字節(jié)加載/存儲指令LDR和STR半字和有符號字節(jié)加載/存儲指令 這類LDR/STR指令可加載有符號半字或字節(jié),可加載/存儲無符號半字。偏移量格式、尋址方式與加載/存儲字和無符號字節(jié)指令相同。 ARM存儲器訪問指令單寄存器存儲 LDRcondSB Rd, ;將指定地址上的有符號字節(jié)讀入Rd LDRcondSH Rd, ;將指定地址上的有符號半字讀入Rd LDRcondH Rd, ;將指定地址上的半字數(shù)據(jù)讀入Rd STRcondH Rd, ;
51、將Rd中的半字數(shù)據(jù)存入指定地址注意:1.有符號位半字/字節(jié)加載是指用符號位加載擴展到32位,無符號半字加載是指用零擴展到32位;2.半字讀寫的指定地址必須為偶數(shù),否則將產(chǎn)生不可靠的結果;ARM存儲器訪問指令單寄存器存儲LDR和STR半字和有符號字節(jié)加載/存儲指令編碼指令執(zhí)行的條件碼I為0時,偏移量為12位立即數(shù),為1時,偏移量為寄存器移位P表示前/后變址U表示加/減W表示回寫為指令的尋址方式Rd為源/目標寄存器Rn為基址寄存器L用于區(qū)別加載(L為1)或存儲(L為0)S為1表示有符號訪問,為0表示無符號訪問H為1表示半字訪問,為0表示字節(jié)訪問LDR和STR指令應用示例:1.加載/存儲字和無符號字
52、節(jié)指令LDRR2,R5;將R5指向地址的字數(shù)據(jù)存入R2STRR1,R0,#0 x04;將R1的數(shù)據(jù)存儲到R0+0 x04地址LDRBR3,R2,#-1 ;將R2指向地址的字節(jié)數(shù)據(jù)存入R3,R2R21STRBR0,R3,-R8 ASR 2 ;R0-R3-R8/4,存儲R0的最低有效字節(jié)2.加載/存儲半字和有符號字節(jié)指令LDRSB R1,R0,R3;將R0+R3地址上的字節(jié)數(shù)據(jù)存入R1,;高24位用符號擴展LDRH R6,R2,#2;將R2指向地址的半字數(shù)據(jù)存入R6,高16位用0擴展;讀出后,R2=R2+2STRH R1,R0,#2!;將R1的半字數(shù)據(jù)保存到R0+2地址,;只修改低2字節(jié)數(shù)據(jù),然后
53、R0=R0+2ARM存儲器訪問指令單寄存器存儲p(3 3)LDRLDR和和STR -STR -雙字:雙字:加載/存儲兩個相鄰的寄存器,64位雙字。其句法有4種:pOp cond D Rd,Rn 零偏移pOp cond D Rd,Rn,offset ! 前索引偏移pOp cond D Rd,label 程序相對偏移pOp cond D T Rd,Rn,offset 后索引偏移 ARM存儲器訪問指令單寄存器存儲 其中:其中: Rd Rd 加載加載/ /存儲寄存器中的一個,另一個是存儲寄存器中的一個,另一個是R R(d+1d+1)。)。RdRd必須必須是偶數(shù)寄存器,且不是是偶數(shù)寄存器,且不是R14R
54、14。 Rn Rn 除非指令為零偏移,或不帶寫回的前索引,否則,除非指令為零偏移,或不帶寫回的前索引,否則,RnRn不允許與不允許與RdRd和和R R(d+1d+1)相同。)相同。label labellabel label必須是在當前指令的上下必須是在當前指令的上下252252字節(jié)范圍內(nèi)。字節(jié)范圍內(nèi)。例如:例如:LDRD R6,R11 ;R6R11,R7R11+4STRD R4,R9,#24 ;R4R9+24,R5R9+28ARM存儲器訪問指令單寄存器存儲助記符說明操作條件碼位置LDMmode Rn!,reglist 多寄存器加載reglistRn.,Rn回寫等LDMcondmodeSTMm
55、ode Rn!,reglist 多寄存器存儲Rn.reglist,Rn回寫等STMcondmodeARM存儲器訪問指令多寄存器存取 多寄存器加載/存儲指令可以實現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。LDM為加載多個寄存器;STM為存儲多個寄存器。允許一條指令傳送16個寄存器的任何子集或所有寄存器。它們主要用于現(xiàn)場保護、數(shù)據(jù)復制、常數(shù)傳遞等。ARM存儲器訪問指令多寄存器存取 多寄存器加載/存儲指令格式如下: LDMcond Rn!,reglist STMcond Rn!,reglistcond:指令執(zhí)行的條件;模式:控制地址的增長方式,一共有8種模式;!:表示在操作結束后,將最后的地址
56、寫回Rn中;reglist :表示寄存器列表,可以包含多個寄存器,它們使用“,”隔開,如R1,R2,R6-R9,寄存器由小到大排列;:可選后綴。允許在用戶模式或系統(tǒng)模式下使用。它有以下兩個功能:1)若op是LDM且寄存器列表包含R15時,那么除了正常的多寄存器傳送外,還將SPSR也復制到CPSR中。這用于異常處理返回,僅在異常模式下使用。2)數(shù)據(jù)傳入或傳出的是用戶模式下的寄存器,而不是當前模式的寄存器。ARM存儲器訪問指令多寄存器存取LDM和STM多寄存器加載/存儲指令編碼指令執(zhí)行的條件碼S 對 應 于 指 令 中的”符號P表示前/后變址U表示加/減W表示回寫寄存器列表Rn為基址寄存器L用于區(qū)
57、別加載(L為1)或存儲(L為0)ARM存儲器訪問指令多寄存器存取 多寄存器加載/存儲指令的8種模式如下表所示,右邊四種為堆棧操作、左邊四種為數(shù)據(jù)傳送操作。模式說明模式說明IA每次傳送后地址加4FD滿遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數(shù)據(jù)塊傳送操作堆棧操作 進行數(shù)據(jù)復制時,先設置好源數(shù)據(jù)指針和目標指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進行讀取和存儲 。 進行堆棧操作操作時,要先設置堆棧指針(SP),然后使用堆棧尋址指令STMFD/L
58、DMFD 、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實現(xiàn)堆棧操作。ARM存儲器訪問指令多寄存器存取數(shù)據(jù)塊傳送指令操作過程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1則為指令執(zhí)行后的基址寄存器。R5R6R7R1 R1 指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMIB R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1
59、R1 指令STMDB R1!,R5-R74008H4004H4000H4014H4010H400CHARM存儲器訪問指令多寄存器存取數(shù)據(jù)塊傳送存儲堆棧操作壓棧說明數(shù)據(jù)塊傳送加載堆棧操作出棧說明STMDASTMED空遞減LDMDALDMFA滿遞減STMIASTMEA空遞增LDMIALDMFD滿遞增STMDBSTMFD滿遞減LDMDBLDMEA空遞減STMIBSTMFA滿遞增LDMIBLDMED空遞增;使用數(shù)據(jù)塊傳送指令進行堆棧操作STMDAR0!,R5-R6. . .LDMIBR0!,R5-R6;使用堆棧指令進行堆棧操作STMEDR13!,R5-R6. . .LDMEDR13!,R5-R6 兩段
60、代碼的執(zhí)行結果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡單(只要前后一致即可),而使用數(shù)據(jù)塊指令進行壓棧和出棧操作則需要考慮空與滿、加與減對應的問題。 堆棧操作(詳見“4.1 尋址方式堆棧尋址”)和數(shù)據(jù)塊傳送指令類似,也有4種模式,它們之間的關系如下表所示:助記符說明操作條件碼位置SWP Rd,Rm,Rn 寄存器和存儲器字數(shù)據(jù)交換RdRn,RnRm (RnRd或Rm)SWPcondSWPB Rd,Rm,Rn 寄存器和存儲器字節(jié)數(shù)據(jù)交換RdRn,RnRm (RnRd或Rm)SWPcondBARM存儲器訪問指令存儲器訪問指令寄存器和存儲器交換指令寄存器和存儲器交換指令 SWP指令用于將一個內(nèi)存單元(該單元地址放在寄存器
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 街道衛(wèi)生管理工作制度
- 燒烤店前廳衛(wèi)生制度
- 財務辦公室衛(wèi)生管理制度
- 灌裝間人員衛(wèi)生管理制度
- 俄羅斯醫(yī)療衛(wèi)生制度
- 寄宿生衛(wèi)生飲食制度
- 北京太平間衛(wèi)生制度
- 拌站衛(wèi)生環(huán)保管理制度
- 工作室日常消毒衛(wèi)生制度
- 村衛(wèi)生室上墻管理制度
- 2026年湖南郴州市百??毓杉瘓F有限公司招聘9人筆試參考題庫及答案解析
- 屋面防水施工質(zhì)量保證措施
- 2026年認證網(wǎng)約車考試題庫及完整答案一套
- 社區(qū)環(huán)境資源與健康行為可及性
- 2026年廣州市自來水公司招考專業(yè)技術人員易考易錯模擬試題(共500題)試卷后附參考答案
- 代謝綜合征診療指南(2025年版)
- 散文系列《補鞋子的人》精-品解讀
- 安徽省合肥一中2025-2026學年高三上學期1月考試化學(含答案)
- 2025國開本科《公共部門人力資源管理》期末歷年真題(含答案)
- 河北省唐山市2024-2025學年高一上學期期末數(shù)學試題(含答案)
- 新課標解讀培訓
評論
0/150
提交評論