嵌入式软件工程师&&太极拳
全部博文(548)
分类: LINUX
2011-02-20 19:56:01
ARMv4T指令集详解(共 38 条指令) 目录 一、数据传送指令 二、算术指令 三、移位 四、逻辑指令 五、比较指令 六、数据处理指令位图 七、常量的装载 八、乘法指令 九、乘法指令位图 十、分支指令 十一、单寄存器load-store指令 十二、内存寻址方式 十三、多寄存器load-store指令 十四、交换指令 十五、swi(software interrupt)软件中断指令 十六、程序状态寄存器指令 十七、协处理器指令 一、数据传送指令 1、 mov指令 格式: mov{}{s} Rd,op 2、 mvn指令 格式: mvn{ }{s} Rd,op 3、代码: if(cond == 1) { Rd = op; //mov // Rd = ~op; //mvn } 二、算术指令 1、 add加法指令 格式: add{ }{s} Rd,Rn,op 代码: if(cond == 1) { Rd = Rn + op; } 2、 adc带进位加法指令 格式: adc{ }{s} Rd,Rn,op 代码: if(cond == 1) { Rd = Rn + op + C; } 3、 sub减法指令 格式: sub{ }{s} Rd,Rn,op 代码: if(cond == 1) { Rd = Rn - op; } 4、 sbc带借位减法指令 格式: sbc{ }{s} Rd,Rn,op 代码: if(cond == 1) { Rd = Rn - op - (~C); } 5、 rsb逆向减法指令 格式: rsb{ }{s} Rd,Rn,op 代码: if(cond == 1) { Rd = op - Rn; } 6、 rsc带借位的逆向减法指令 格式: rsc{ }{s} Rd,Rn,op 代码: if(cond == 1) { Rd = op - Rn - (~C); } 三、移位 1、 op 立即数: #number //#label 寄存器: Rm 寄存器移位: Rm,<移位符> #number 或 Rm,<移位符> Rs 举例: mov r0,#100 //r0 = 100 mov r0,r1 //r0 = r1 mov r0,r1,lsr #1 //r0 = r1 >> 1 mov r0,r1,lsr r2 //r0 = r1 >> r2 add r0,r1,r2,lsr #1 //r0 = r1 + r2 >> 1 2、移位符 lsl 逻辑左移 (unsigned)x << y 说明: 无符号左移补0 lsr 逻辑右移 (unsigned)x >> y 说明: 无符号右移补0 asl 算术左移 (signed)x << y 说明: 有符号左移补0 注意: 逻辑左移和算术左移结果一样 asr 算术右移 (signed)x >> y 说明: 有符号右移正数补0,负数补1 ror 循环右移 ((unsigned)x >> y) | (x << (32 - y)) 说明: x逻辑右移y | x逻辑左移 (32 - y) rrx 扩展循环右移 (C << 31) | ((unsigned)x >> 1) 说明: 相当于33位循环右移 注意: 没有y,只移一位 四、逻辑指令 1、 and逻辑与指令 格式: and{ }{s} Rd,Rn,op 2、 orr逻辑或指令 格式: orr{ }{s} Rd,Rn,op 3、 eor逻辑异或指令 格式: eor{ }{s} Rd,Rn,op 4、 bic位清除指令 格式: bic{ }{s} Rd,Rn,op 5、代码: if(cond == 1) { Rd = Rn & op; //and // Rd = Rn | op; //orr // Rd = Rn ^ op; //eor // Rd = Rn & (~op); //bic } 五、比较指令 1、 cmp比较指令 格式: cmp{ } Rn,op 代码: if(cond == 1) { N = Rn - op < 0; Z = Rn - op == 0; C = Rn >= op; V = Rn > op && Rd < 0; } 2、 cmn反比较指令 格式: cmn{ } Rn,op 代码: if(cond == 1) { N = Rn + op < 0; Z = Rn + op == 0; C = (Rn + op) > (unsigned)0xffffffff; V = Rn > 0 && op > 0 && Rd < 0; } 3、 tst位测试指令 格式: tst{ } Rn,op 代码: if(cond == 1) { N = Rn & op < 0; Z = Rn & op == 0; } 4、 teq相等测试指令 格式: teq{ } Rn,op 代码: if(cond == 1) { N = Rn ^ op < 0; Z = Rn ^ op == 0; } 六、数据处理指令位图 1、 op为寄存器 xxxx 000a aaas nnnn dddd cccc cttt mmmm 2、 op为立即数 xxxx 001a aaas nnnn dddd rrrr bbbb bbbb 3、 条件xxxx 编码 cond 条件 0000 EQ (等于,Equal) Z 0001 NE (不等于,Not Equal) ~Z 0010 CS (进位设置,Carry Set) C 0011 CC (进位清除,Carry Clear) ~C 0100 MI (负号,MInus) N 0101 PL (正号,PLus) ~N 0110 VS (溢出设置,oVerflow Set) V 0111 VC (溢出清除,oVerflow Clear) ~V 1000 HI (高于,HIgher) C && ~Z 1001 LS (低于或同于,Lower or Same) ~C || Z 1010 GE (大于等于,Greater or equal) N == V 1011 LT (小于,Less Than) N == ~V 1100 GT (大于,Greater Than) (N == V) && ~Z 1101 LE (小于等于,Less or equal) (N == ~V) || Z 1110 AL (总是,Always) 所有版本 1111 NV (从不cond,never) ARMv3之前版本,之后为非法条件,该编码位置已作为其他用途 只有条件为真时才会cond指令,否则忽略该指令,继续下一条 4、 数据处理指令aaaa 指令: mov mvn add adc sub sbc rsb rsc and orr eor bic cmp cmn tst teq 编码: 1101 1111 0100 0101 0010 0110 0011 0111 0000 1100 0001 1110 1010 1011 1000 1001 5、 条件标志s 指令含s则该位为 1 ,否则为 0 6、 寄存器Rd,Rn,Rm分别对应dddd,nnnn,mmmm R0 ---> R15 0000 ---> 1111 没有寄存器的则对应位置为 0,如:mov没有Rn寄存器nnnn位为 0000 ,cmp没有Rd寄存器dddd位为 0000 7、 移位数ccccc 立即数方式: 最大为 0x1f 寄存器方式: 第 1 - 4 个c为寄存器编号,第 5 个c为 0 8、 移位符ttt 移位符 : lsl lsr asr ror 立即数编码: 000 010 100 110 寄存器编码: 001 011 101 111 asl 与 lsl 的编码相同 ttt == 110 && ccccc == 00000 表示 rrx 9、 立即数构造 立即数 = bbbb bbbb 循环右移 rrrr * 2 次 这种方式并不能把所有的32位数都构造出来 如: #12345,#0xffff 七、常量的装载 1、 ldr伪指令 格式: ldr Rd,= //ldr只有带'='号时才是伪指令 说明: 将number或label的值赋给Rd,该指令会伪造成mov、mvn、ldr等可能的指令 举例: ldr r0,=0x100 //mov r0,#0x100 ldr r0,=0x0 //mvn r0,#0x0 ldr r0,=0x12345 //ldr r0,[pc,#offset] //offset是该指令到.word的偏移量减去 8 (为什么要减去 8 请见第十二节 第7部分) // ... //这里可能是其他指令或没指令 //.word 0x12345 2、 adr / adrl伪指令 格式: adr Rd,=label 说明: 此指令不能用立即数,其他基本和ldr一样,小范围时用adr,大范围用时adrl