ARM指令集
来源:互联网 发布:淘宝访客计算方式 编辑:程序博客网 时间:2024/06/08 01:17
1.跳转指令(B,BL,BLX,BX)
B 跳转指令:
格式:B 目标地址
直接跳转到目标地址执行
BL 带返回的跳转指令
格式:BL label;
将PC保存到R14中,然后跳转到label处执行
BLX 带返回和状态切换的跳转指令
格式:
从ARM指令集跳转到指令所指定的目标地址,并将工作状态由ARM切换到Thumb指令集,同时将PC保存到R14中。
(例如:当调用者使用的时ARM指令集而子程序使用的是Thumb指令集时,可以使用这条指令)
BX 带状态切换的跳转指令
格式:BX 目标地址
目标地址可以使ARM指令也可以时Thumb指令
2.数据处理指令(MOV,MVN,CMP,CMN,TST,TEQ,ADD,SUB,SBC,TSB,TSC,AND,ORR,EOR,BIC)
MOV 数据传送指令
格式:MOV {S} 目的寄存器, 源操作数;
从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器,其中S选项决定指令的操作是否影响CPSR中条件标志位的值,
没有S选项时不更新CPSR中条件标志位的值
例如:MOV R0, #0;
MVN 数据取反传送指令
格式:MVN{S} 目的寄存器, 源操作数;
同MOV相似,只是将取出的内容取反在送入目的寄存器
例如:MVN R0, #0;//将立即数0取反得-1放入R0
//1......1表示-1,例如char a = -127;其二进制原码为10000001,其反码为11111110,补码为11111111
//正数的原码反码补码均相同,均为原码的值,即原码、反码、补码是为了简化负数的计算引进的,对正数没有意义。
//补码 = 反码+1
//计算机中负数是以其补码的形式存在的
CMP 比较指令
格式:CMP 操作数1, 操作数2;
把操作数1和2相减,同时更新程序状态寄存器CPSR中条件标志位的值。
CMN 反值比较指令
格式:CMN 操作数1, 操作数2;
将操作数1和2相加,根据结果设置CPSR条件标志位
TST 位测试指令
格式:TST 操作数1, 操作数2;
将操作数2和操作数1进行位与,根据结果设置CPSR条件标志位。
操作数1是要测试的值,操作数2一般是一个寄存器或是一个位掩码,用来测试操作数中的某一位是否设置。
例如:TST R1, #%1;//%表示二进制
TEQ 相等测试指令
格式:TEQ 操作数1, 操作数2;
将操作数2和操作数1按位异或,根据结果设置CPSR条件标志位。即比较操作数1和2是否相等
ADD 加法指令
格式:ADD{S} 目的寄存器, 操作数1,操作数2;
将操作数1和2相加放入目的寄存器。
ADC 带进位的加法指令
格式:ADC{S} 目的寄存器, 操作数1,操作数2;
将操作数1和2相加再加上CPSR中的C条件标志位,将结果放入目的寄存器
例如:ADCS R0, R1, R2;
SUB 减法指令
格式:SUB{S} 目的寄存器, 操作数1,操作数2;
操作数1减去操作数2,将结果放入目的寄存器。
SBC 带借位的减法指令
格式:SBC{S} 目的寄存器, 操作数1,操作数2;
将操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果放入目的寄存器,并根据结果设置CPSR的条件标志位。
例如:SUBS R0, R1,R2;//R0 = R1 - R2 -!C;
RSB 逆向减法指令
格式:RSB{S} 目的寄存器, 操作数1,操作数2;
操作数2减去操作数1,其余同SUB。
RSC 带借位的逆向减法指令
格式:RSC{S} 目的寄存器, 操作数1,操作数2;
操作数2减去操作数1,其余同理SBC。
AND 逻辑与指令
格式:AND{S} 目的寄存器, 操作数1,操作数2;
将操作数1和操作数2进行逻辑与,将结果保存在目的寄存器中。
ORR 逻辑或指令
格式:ORR{S} 目的寄存器, 操作数1,操作数2;
将操作数1和操作数2进行逻辑或,将结果保存在目的寄存器中。
EOR 逻辑异或指令
格式:EOR{S} 目的寄存器, 操作数1,操作数2;
将操作数1和操作数2进行逻辑异或,将结果保存在目的寄存器中。
BIC 位清除指令
格式:BIC{S} 目的寄存器, 操作数1,操作数2;
用于清楚操作数1的某些位,并将结果放入目的寄存器。
例如:BIC R0,R0,#%1011;//将0、1、3位清零,其余位保留
3.乘法指令和乘加指令(MUL,MLA,SMULL,SMLAL,UMULL,UMLAL)
!!所有的操作数只能位通用寄存器且目的寄存器不能和操作数1相同。
MUL 32位乘法指令
格式:MUL{S} 目的寄存器, 操作数1,操作数2;
1乘2放入目的寄存器。
MLA 32位乘加指令
格式:MLA {S} 目的寄存器, 操作数1,操作数2, 操作数3;
1乘2加3放入目的寄存器;
SMULL 64位有符号数乘法指令
格式:SMULL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
1乘2,低32位放Low,高32位放High;
SMLAL 64位有符号数乘加指令
格式:SMLAL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
1乘2,低32位和Low相加放入Low,高32位和High相加放入High;
UMULL 64位无符号数乘法指令
格式:UMULL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
同理;
UMLAL 64位无符号数乘加指令
格式:UMLAL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
同理;
4.程序状态寄存器访问指令(MRS, MSR)
MRS 程序状态寄存器到通用寄存器的数据传送指令
格式:MRS{条件} 通用寄存器, 程序状态寄存器(CPSR或SPSR)
一般适用于要(修改程序状态寄存器的内容时,读出到通用寄存器,修改再写回;)
(在异常处理或进程切换时,保存程序状态寄存器的值;)
MSR 通用寄存器到程序状态寄存器的数据传送指令
格式:MSR 程序状态寄存器(CPSR或SPSR)_<域>, 操作数;
32位程序状态寄存器可分为4个域:
位[32:24]为条件标志位域,用f表示
位[23:16]为状态位域,用s表示
位[15:8]为扩展位域,用x表示
位[7:0]位控制位域,用c表示
例如:MSR CPSR, R0;
MSR CPSR_C, R0;//仅修改控制域位;
5,加载/存储指令(LDR,LDRB,LDRH,STR,STRB,STRH)
LDR 字数据加载指令
格式:LDR 目的寄存器, <储存器地址>;
从储存器中将一个32位的字数据传送到目的寄存器中。
当目的寄存器为PC是,跳到该地址执行。
储存器地址参考寻址方式,十分灵活;
LDRB 字节数据加载指令
格式:LDRB 目的寄存器, <存储器地址>;
从存储器中将一个8位的字节数据传送到目的寄存器,同时将高 24位清零。
当目的寄存器为PC是,跳到该地址执行。
LDRH 半字数据加载指令
格式:LDRH 目的寄存器, <存储器地址>;
从存储器中将一个16位的半字数据传送到目的寄存器,同时将高 16位清零。
当目的寄存器为PC是,跳到该地址执行。
STR 字数据存储指令
格式:STRB 源寄存器, <存储器地址>;
从源寄存器中将一个32位的字数据传送到存储器地址。
STRB 字节数据存储指令
格式:STR 源寄存器, <存储器地址>;
从源寄存器中将一个8位的字节数据传送到存储器地址。
STRH 半字数据存储指令
格式:STRH 源寄存器, <存储器地址>;
从源寄存器中将一个16位的半字数据传送到存储器地址。
6,批量数据加载/存储指令(LDM,STM)
LDM 批量数据加载指令
格式:LDM(或STM){类型} 基址寄存器{!}, 寄存器列表{^};
多用于将多个寄存器的内容入栈或出栈。
类型:
IA 每次传送后地址加1
IB 每次传送前地址加1
DA 每次传送后地址减1
DB 每次传送前地址减1
FD 满递减堆栈
ED 空递减堆栈
FA 满递增堆栈
EA 空递增堆栈
{!}加上的话将最后的地址写入基址寄存器
{^}加上的话,当指令位LDM,且寄存器列表中包含R15时,除了正常的数据传送外还将SPSR复制到CPSR。
同时还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。
7,数据交换指令(SWP,SWPB)
SWP 字数据交换指令
格式:SWP 目的寄存器, 源寄存器1, [源寄存器2]
将源寄存器2所指向的存储器中的字数据传送到目的寄存器中,同时源寄存器1中的字数据传送到源寄存器2所指向的存储器中。
显然,当源寄存器1和目的寄存器是同一个寄存器时。该指令为交换数据。
例如: SWP R0,R0,[R3];
SWPB 字节数据交换指令
格式:SWP{条件}B 目的寄存器, 源寄存器1, [源寄存器2]
存储器中的字节数据传送到目的寄存器会将目的寄存器的高24位清零,其余同理;
8,移位指令(LSL,ASL,LSR,ASR,ROR,RRX)
LSL 逻辑左移
格式:通用寄存器, LSL(或ASL) 操作数;
例如:MOV R0, R1, LSL#2;//将R1左移两位后传送到R0中;
补0;
LSR 逻辑右移
格式:通用寄存器, LSR(或ASR) 操作数;
(算术右移,如果最高位为1,则补1,否则补0, 如将10000000算术右移7位,应该变成11111111,
而逻辑右移7位,则不考虑符号位,变为00000001,这点就是算术右移和逻辑右移的区别。)
ROR 循环右移
格式:通用寄存器, ROR 操作数;
移出的低位补高位;
操作数可以为寄存器也可以为立即数;
RRX 带扩展的循环右移
格式:通用寄存器,RRX 操作数;
右移时,左端用仅为标志位C来填充;
9,协处理器指令(CDP,LDC,STC,MCR ARM MRC)
CDP 协处理器数操作指令
格式:CDP 协处理器编码, 协处理器编码1, 目的寄存器, 源寄存器1,源寄存器2, 协处理器编码2;
用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。
协处理器编码1和2时协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,不涉及ARM处理器的寄存器和存储器。
例如:CDP P3, 2, C12, C3, 4;//该指令完成且处理器P3的初始化;
LDC 协处理器数据加载指令
格式:LDC{L} 协处理器编码, 目的寄存器, [源寄存器];
将源寄存器中所指向的存储器中的字数据传送到目的寄存器,若协处理器不能成功执行传送操作,则产生未定义指令异常;
例如:LDC P3, C4, [R0];//将ARM处理器的寄存器R0所指向的存储器中的字数据传送到协处理器P3的寄存器C4中;
STC 协处理器数据存储指令
格式:STC{L} 协处理器编码,源寄存器, [目的寄存器]
将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成特定的操作,则产生未定义指令异常。
MCR ARM处理器寄存器到协处理器寄存器的数据传送指令
格式:MCR 协处理器编码,协处理器操作码1,源寄存器, 目的寄存器1,目的寄存器2, 协处理器操作码2;
将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成特定的操作,则产生未定义指令异常。
协处理器编码1和2是协处理器将要执行的操作,源寄存器位ARM处理器的寄存器,目的寄存器1和2为协处理器的寄存器
例如:MCR P3, 3, R0,C4,C5, 6;//将R0中的数据传送到协处理器P3中的寄存器C4和C5中;
MRC 协处理器寄存器到ARM处理器寄存器的数据传送指令
格式:MRC 协处理器编码,协处理器操作码1,目的寄存器, 源寄存器1,源寄存器2, 协处理器操作码2;
同理
B 跳转指令:
格式:B 目标地址
直接跳转到目标地址执行
BL 带返回的跳转指令
格式:BL label;
将PC保存到R14中,然后跳转到label处执行
BLX 带返回和状态切换的跳转指令
格式:
从ARM指令集跳转到指令所指定的目标地址,并将工作状态由ARM切换到Thumb指令集,同时将PC保存到R14中。
(例如:当调用者使用的时ARM指令集而子程序使用的是Thumb指令集时,可以使用这条指令)
BX 带状态切换的跳转指令
格式:BX 目标地址
目标地址可以使ARM指令也可以时Thumb指令
2.数据处理指令(MOV,MVN,CMP,CMN,TST,TEQ,ADD,SUB,SBC,TSB,TSC,AND,ORR,EOR,BIC)
MOV 数据传送指令
格式:MOV {S} 目的寄存器, 源操作数;
从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器,其中S选项决定指令的操作是否影响CPSR中条件标志位的值,
没有S选项时不更新CPSR中条件标志位的值
例如:MOV R0, #0;
MVN 数据取反传送指令
格式:MVN{S} 目的寄存器, 源操作数;
同MOV相似,只是将取出的内容取反在送入目的寄存器
例如:MVN R0, #0;//将立即数0取反得-1放入R0
//1......1表示-1,例如char a = -127;其二进制原码为10000001,其反码为11111110,补码为11111111
//正数的原码反码补码均相同,均为原码的值,即原码、反码、补码是为了简化负数的计算引进的,对正数没有意义。
//补码 = 反码+1
//计算机中负数是以其补码的形式存在的
CMP 比较指令
格式:CMP 操作数1, 操作数2;
把操作数1和2相减,同时更新程序状态寄存器CPSR中条件标志位的值。
CMN 反值比较指令
格式:CMN 操作数1, 操作数2;
将操作数1和2相加,根据结果设置CPSR条件标志位
TST 位测试指令
格式:TST 操作数1, 操作数2;
将操作数2和操作数1进行位与,根据结果设置CPSR条件标志位。
操作数1是要测试的值,操作数2一般是一个寄存器或是一个位掩码,用来测试操作数中的某一位是否设置。
例如:TST R1, #%1;//%表示二进制
TEQ 相等测试指令
格式:TEQ 操作数1, 操作数2;
将操作数2和操作数1按位异或,根据结果设置CPSR条件标志位。即比较操作数1和2是否相等
ADD 加法指令
格式:ADD{S} 目的寄存器, 操作数1,操作数2;
将操作数1和2相加放入目的寄存器。
ADC 带进位的加法指令
格式:ADC{S} 目的寄存器, 操作数1,操作数2;
将操作数1和2相加再加上CPSR中的C条件标志位,将结果放入目的寄存器
例如:ADCS R0, R1, R2;
SUB 减法指令
格式:SUB{S} 目的寄存器, 操作数1,操作数2;
操作数1减去操作数2,将结果放入目的寄存器。
SBC 带借位的减法指令
格式:SBC{S} 目的寄存器, 操作数1,操作数2;
将操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果放入目的寄存器,并根据结果设置CPSR的条件标志位。
例如:SUBS R0, R1,R2;//R0 = R1 - R2 -!C;
RSB 逆向减法指令
格式:RSB{S} 目的寄存器, 操作数1,操作数2;
操作数2减去操作数1,其余同SUB。
RSC 带借位的逆向减法指令
格式:RSC{S} 目的寄存器, 操作数1,操作数2;
操作数2减去操作数1,其余同理SBC。
AND 逻辑与指令
格式:AND{S} 目的寄存器, 操作数1,操作数2;
将操作数1和操作数2进行逻辑与,将结果保存在目的寄存器中。
ORR 逻辑或指令
格式:ORR{S} 目的寄存器, 操作数1,操作数2;
将操作数1和操作数2进行逻辑或,将结果保存在目的寄存器中。
EOR 逻辑异或指令
格式:EOR{S} 目的寄存器, 操作数1,操作数2;
将操作数1和操作数2进行逻辑异或,将结果保存在目的寄存器中。
BIC 位清除指令
格式:BIC{S} 目的寄存器, 操作数1,操作数2;
用于清楚操作数1的某些位,并将结果放入目的寄存器。
例如:BIC R0,R0,#%1011;//将0、1、3位清零,其余位保留
3.乘法指令和乘加指令(MUL,MLA,SMULL,SMLAL,UMULL,UMLAL)
!!所有的操作数只能位通用寄存器且目的寄存器不能和操作数1相同。
MUL 32位乘法指令
格式:MUL{S} 目的寄存器, 操作数1,操作数2;
1乘2放入目的寄存器。
MLA 32位乘加指令
格式:MLA {S} 目的寄存器, 操作数1,操作数2, 操作数3;
1乘2加3放入目的寄存器;
SMULL 64位有符号数乘法指令
格式:SMULL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
1乘2,低32位放Low,高32位放High;
SMLAL 64位有符号数乘加指令
格式:SMLAL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
1乘2,低32位和Low相加放入Low,高32位和High相加放入High;
UMULL 64位无符号数乘法指令
格式:UMULL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
同理;
UMLAL 64位无符号数乘加指令
格式:UMLAL{S} 目的寄存器Low, 目的寄存器High, 操作数1, 操作数2;
同理;
4.程序状态寄存器访问指令(MRS, MSR)
MRS 程序状态寄存器到通用寄存器的数据传送指令
格式:MRS{条件} 通用寄存器, 程序状态寄存器(CPSR或SPSR)
一般适用于要(修改程序状态寄存器的内容时,读出到通用寄存器,修改再写回;)
(在异常处理或进程切换时,保存程序状态寄存器的值;)
MSR 通用寄存器到程序状态寄存器的数据传送指令
格式:MSR 程序状态寄存器(CPSR或SPSR)_<域>, 操作数;
32位程序状态寄存器可分为4个域:
位[32:24]为条件标志位域,用f表示
位[23:16]为状态位域,用s表示
位[15:8]为扩展位域,用x表示
位[7:0]位控制位域,用c表示
例如:MSR CPSR, R0;
MSR CPSR_C, R0;//仅修改控制域位;
5,加载/存储指令(LDR,LDRB,LDRH,STR,STRB,STRH)
LDR 字数据加载指令
格式:LDR 目的寄存器, <储存器地址>;
从储存器中将一个32位的字数据传送到目的寄存器中。
当目的寄存器为PC是,跳到该地址执行。
储存器地址参考寻址方式,十分灵活;
LDRB 字节数据加载指令
格式:LDRB 目的寄存器, <存储器地址>;
从存储器中将一个8位的字节数据传送到目的寄存器,同时将高 24位清零。
当目的寄存器为PC是,跳到该地址执行。
LDRH 半字数据加载指令
格式:LDRH 目的寄存器, <存储器地址>;
从存储器中将一个16位的半字数据传送到目的寄存器,同时将高 16位清零。
当目的寄存器为PC是,跳到该地址执行。
STR 字数据存储指令
格式:STRB 源寄存器, <存储器地址>;
从源寄存器中将一个32位的字数据传送到存储器地址。
STRB 字节数据存储指令
格式:STR 源寄存器, <存储器地址>;
从源寄存器中将一个8位的字节数据传送到存储器地址。
STRH 半字数据存储指令
格式:STRH 源寄存器, <存储器地址>;
从源寄存器中将一个16位的半字数据传送到存储器地址。
6,批量数据加载/存储指令(LDM,STM)
LDM 批量数据加载指令
格式:LDM(或STM){类型} 基址寄存器{!}, 寄存器列表{^};
多用于将多个寄存器的内容入栈或出栈。
类型:
IA 每次传送后地址加1
IB 每次传送前地址加1
DA 每次传送后地址减1
DB 每次传送前地址减1
FD 满递减堆栈
ED 空递减堆栈
FA 满递增堆栈
EA 空递增堆栈
{!}加上的话将最后的地址写入基址寄存器
{^}加上的话,当指令位LDM,且寄存器列表中包含R15时,除了正常的数据传送外还将SPSR复制到CPSR。
同时还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。
7,数据交换指令(SWP,SWPB)
SWP 字数据交换指令
格式:SWP 目的寄存器, 源寄存器1, [源寄存器2]
将源寄存器2所指向的存储器中的字数据传送到目的寄存器中,同时源寄存器1中的字数据传送到源寄存器2所指向的存储器中。
显然,当源寄存器1和目的寄存器是同一个寄存器时。该指令为交换数据。
例如: SWP R0,R0,[R3];
SWPB 字节数据交换指令
格式:SWP{条件}B 目的寄存器, 源寄存器1, [源寄存器2]
存储器中的字节数据传送到目的寄存器会将目的寄存器的高24位清零,其余同理;
8,移位指令(LSL,ASL,LSR,ASR,ROR,RRX)
LSL 逻辑左移
格式:通用寄存器, LSL(或ASL) 操作数;
例如:MOV R0, R1, LSL#2;//将R1左移两位后传送到R0中;
补0;
LSR 逻辑右移
格式:通用寄存器, LSR(或ASR) 操作数;
(算术右移,如果最高位为1,则补1,否则补0, 如将10000000算术右移7位,应该变成11111111,
而逻辑右移7位,则不考虑符号位,变为00000001,这点就是算术右移和逻辑右移的区别。)
ROR 循环右移
格式:通用寄存器, ROR 操作数;
移出的低位补高位;
操作数可以为寄存器也可以为立即数;
RRX 带扩展的循环右移
格式:通用寄存器,RRX 操作数;
右移时,左端用仅为标志位C来填充;
9,协处理器指令(CDP,LDC,STC,MCR ARM MRC)
CDP 协处理器数操作指令
格式:CDP 协处理器编码, 协处理器编码1, 目的寄存器, 源寄存器1,源寄存器2, 协处理器编码2;
用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。
协处理器编码1和2时协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,不涉及ARM处理器的寄存器和存储器。
例如:CDP P3, 2, C12, C3, 4;//该指令完成且处理器P3的初始化;
LDC 协处理器数据加载指令
格式:LDC{L} 协处理器编码, 目的寄存器, [源寄存器];
将源寄存器中所指向的存储器中的字数据传送到目的寄存器,若协处理器不能成功执行传送操作,则产生未定义指令异常;
例如:LDC P3, C4, [R0];//将ARM处理器的寄存器R0所指向的存储器中的字数据传送到协处理器P3的寄存器C4中;
STC 协处理器数据存储指令
格式:STC{L} 协处理器编码,源寄存器, [目的寄存器]
将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成特定的操作,则产生未定义指令异常。
MCR ARM处理器寄存器到协处理器寄存器的数据传送指令
格式:MCR 协处理器编码,协处理器操作码1,源寄存器, 目的寄存器1,目的寄存器2, 协处理器操作码2;
将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成特定的操作,则产生未定义指令异常。
协处理器编码1和2是协处理器将要执行的操作,源寄存器位ARM处理器的寄存器,目的寄存器1和2为协处理器的寄存器
例如:MCR P3, 3, R0,C4,C5, 6;//将R0中的数据传送到协处理器P3中的寄存器C4和C5中;
MRC 协处理器寄存器到ARM处理器寄存器的数据传送指令
格式:MRC 协处理器编码,协处理器操作码1,目的寄存器, 源寄存器1,源寄存器2, 协处理器操作码2;
同理
阅读全文
0 0
- ARM指令集--移位指令
- ARM 指令集>>跳转指令
- ARM指令集 LDR指令
- ARM 指令集 比较指令
- arm指令集比较指令
- arm指令集分支指令
- ARM指令集
- ARM 指令集
- ARM指令集
- ARM 指令集
- ARM指令集
- ARM 指令集摘要
- ARM、THUMB指令集
- ARM指令集
- ARM汇编指令集
- ARM指令集
- ARM汇编指令集
- ARM指令集
- oracle 把A用户所有表的查看权限赋给B用户(批量赋权)
- effective C++条款十九解读
- Eexecutor异步执行框架
- Paired Up
- 点击tableViewHeader控制cell关闭展开以及label的代码自定义约束
- ARM指令集
- python 2.7 在windows 下使用pip install xxx出现unicodeDecodeError解决办法
- WPF软件正版激活功能的实现
- python之argparse
- 数组去重的2种方法
- GIT使用前的安装
- Android热门前沿相关面试知识
- python
- discuz提醒抱歉,您的请求来路不正确或表单验证串不符,无法提交解决办