一.数据操作指令
1、数据移动命令: mov/mvn 1) mov :数据传输命令语法: mov{cond}{s} Rd,operand2eg:mov r1,r2@r1=r2注意:操作数2(operand2)为收银台#0xFFFFFF00 @有效数OK 2) mvn :数据读取反向传输命令语法: mov{cond}{s} Rd,operand2eg:mov r1,R2 @ R1=^ R22,算术指令: add ADC sub sbbb operand21 ) add :通常的加法指令2 ) adc :进位加法指令eg: @个64位的数量下位32位r0@第64位的数量,上位32位为r3,下位32位为r2@,结果,上位32位为r5,下位32位为r4mov r0,# 0 #6@首先排在后32位,需要状态位的r2 @ r4=r0 r2=0x00000003@再高32位,注意进位加法adc r5,r1,r3 @ r5=r1 r3 C=0xA :发生进位,c为否则,03 ) sub )普通减法命令4 ) sbc )借位减法命令eg )两个64位的数减法@第一个64位的数高位32位为r1,低位32位为r0@第二个64位的数高位32位为r3,低位32位为r2@的结果高位32位这是为了在产生借用标志subs r4、r0、r2 @ r4=r0 – r2=0xFFFFFFFF@之后再高计算32位,带借用的减法sbc r5、r1为R3@R5=r1-R3-(1-C )=否则c为15 ) mul :通常的乘法运算命令eg:mov r1、#4 mov r2、#5mul r0、R1, r2@ r0=r1 * r2注意:乘法指令的第二个操作数是寄存器4、位运算指令: and orr eor bic通用语法: opcode{cond}{s} Rd、Rn、operand21}and位和运算指令与1不同或0不变3 )清除按eor位异或运算指令(如果不同,则为1;如果相同,则为0;如果不同,则为1;如果相同,则为04 ) bic位运算指令,根据第二个操作数中的哪一个为1,确定第一个操作寄存器假设不知道r0寄存器中的值@ 1,保证其他比特不变的a-(and r1,r0,#0xEFb- ) and r1,r0,#((0x10 ) c-) and r1 #”2保证r0寄存器中的第[20]个位置1,保证其它位不变#(0x120 ) 3使r0寄存器中的第([11:8] )个位为1,保证其它位不变#(0xf8 ) (4)使r0寄存器的第[3:0] )个位为0,保证其它位不变(a-) bic r5、r0、# ) (0()0xf )5) r0寄存器的) r0,# ) #(0xF 26 )第二步骤,清除对应位置1orr r0,r0,#(0xa26 ) ) 6保证其他位不变@第一步骤,首先是bic r0,r0,#(0x3F 25 ) #0xf @0xF05,比较指令: cmp语法: cmp{cond} Rn,operand2作用:比较Rn和operand2两个数的大小,本质上进行减法运算注意:比较指令没有目标寄存器,状态{S}位15cmp r0,r1@ r0 r1 r0=r0 – r1 subhi r0,r0,r1@ r0 r1 r1=r1 – r0 subcc r1,r1,r0
二、跳转指令: b/bl
跳转命令的本质:修改PC值1 ) b )不将返回地址保存在lr寄存器中,而是跳转到标签的位置语法: b(cond ) label2) bl )自动保存返回地址,跳转到标签的位置语法: bl ) connection mov pc,label
析: mov r0, #9mov r1, #15loop:cmp r0, r1beq stopsubhi r0, r0, r1subcc r1, r1, r0b loop
求两数的最大公约数:
三、Load/Store指令
1、单寄存器操作指令:ldr / str ldrh / strh ldrb / strb1)ldr:将Rm寄存器指向的内存空间的内容读到Rn寄存器中,读4个字节大小的数据,语法:ldr{cond} Rn, [Rm]eg:ldr r0, =0x800000FFldr r1, [r0]注意:不需要是立即数,可以赋值的范围是:0x00000000 – 0xFFFFFFFF2)str:将Rn寄存器中的值写到Rm寄存器指向的内存地址空间中,写4个字节大小的数据语法:str{cond} Rn, [Rm]eg:str r1, [r0]3)eg: ldr r0, =0x40000800ldr r1, =0x11111111ldr r2, =0x22222222ldr r3, =0x33333333@ 将r1中的值存储到r0+4的地址空间中,r0中的值不变str r1, [r0, #4] @ 将r2中的值存储到r0的地址空间中,r0=r0+4 str r2, [r0], #4@ 将r3中的值存储到r0+4的地址空间中,r0=r0+4@ !:更新地址str r3, [r0, #4]!4)ldrh / strh ldrb / strb用法与上述一致h(half word):读写半字b(byte):读写一个字(可以用作判断大小端)2、多寄存器操作指令:ldm / stm 1)ldm: 一次可以完成多个寄存器的读操作语法:ldm{cond} Rn, {寄存器列表}2)stm: 一次可以完成多个寄存器的写操作语法:stm{cond} Rn, {寄存器列表}eg:将r1-r3中的值,存储到r0指向的内存地址空间中ldr r0, =0x40000800ldr r1, =0x11111111ldr r2, =0x22222222ldr r3, =0x33333333@ stm r0, {r1-r3}@ stm r0, {r1,r2,r3}@ stm r0, {r1-r2,r3}@ stm r0, {r3, r2, r1} 会报警告但是没错,照样是从r1-r3,不是从r3-r1将r0指向的地址空间中连续的20个字节中的内容读到r4-r7寄存器中ldm r0, {r4-r7}注意:寄存器列表中的寄存器不管顺序如何,都是高地址对应大编号的寄存器,低地址对应小编号的寄存器。3、栈操作指令:ldmfd / stmfd 栈指针寄存器 r13(sp):存放栈顶的地址 减栈:栈指针向低地址方向移动增栈:栈指针向高地址方向移动满栈:栈指针指向的栈空间有效的数据,向栈空间压入数据时,应先将栈指针移动到一个空的位置,再向栈空间中压入数据,此时栈指针依然指向一块有数据的栈空间。空栈:栈指针指向的栈空间没有有效的数据,向栈空间压入数据时可以直接压入,再将栈指针移动到一个空的位置。对于栈的操作方式:@ 满增栈(FA) :Full Ascending ldmfa/stmfa@ 满减栈(FD) :Full Descending ldmfd/stmfd@ 空增减(EA) :Empty Ascending ldmea/stmea@ 空减栈(ED) :Empty Descending ldmed/stmed@ ARM默认采用的是**满减栈** ldmfd/stmfd1)stmfd:看图了解向内存压栈图1,2语法:stmfd{cond} sp!, {寄存器列表}2)ldmfd:看图了解向内存压栈图3语法:ldmfd{cond} sp!, {寄存器列表}注意:!:更新栈指针的地址eg:看图4
四、特殊功能寄存器传送指令:msr / mrs
1)msr:cpsr = operand2语法:msr{cond} cpsr, operand22)mrs:Rm = cpsr语法:mrs{cond} Rm, cpsr应用:从SVC(超级管理员)模式切换到USR(用户)模式SVC模式:0b10011USR模式:0b10000方法:修改模式位保证其他位不变,将低四位清零@ 1 0011 –> 1 0000mrs r0, cpsr bic r0, r0, #0x1Forr r0, r0, #0x10msr cpsr, r0
五、软中断指令
六、混合编程