两个概念:指令与伪指令一.ARM汇编的特点
指令是CPU机器指令的助记符,经过编译后会得到一串1010…组成的机器码,可以由CPU读取执行。
伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。
’
(指令可以类比为米,编译过程就是相当于煮饭的过程,最后生成的饭就是相当于1010的机器码,让CPU读取,而伪指令就相当于煮饭用的锅,只参与煮饭(编译过程),最终锅是不会成为米饭的)
ldr(load register)指令将内存内容加载入通用寄存器。
str(store register)指令将寄存器内容存入内存空间中。
ldr/str 组合用来实现 ARM CPU和内存数据交换
寄存器寻址 | mov r1, r2 | r2的值赋值给r1 |
立即寻址 | mov r0, #0xFF00 | 把16进制数#0xFF00赋值给r0 |
寄存器移位寻址 | mov r0, r1, lsl #3 | 把r1里面的数左移3位后赋值给r0 (右移lsr) |
寄存器间接寻址 | ldr r1, [r2] | 把r2里面存的地址相对应的内容赋值给r1(r2相当于是一个指针) |
基址变址寻址 | ldr r1, [r2, #4] | 把r2l里面存的地址加4后相对应的内容赋值给r1 |
多寄存器寻址 | ldmia r1!, {r2-r5, r12} | r1作为基地址 r2 <-[r1] , r3 <-[r1+04] ,r4 <-[r1+08] , r5 <- [r1+12] , r12 <-[r1+16] |
堆栈寻址 | stmfd sp!, {r2-r7, lr} | 把r2 - r7寄存器里面的内容压到内存的栈上 |
相对寻址 | beq flag flag: | flag: 标号用于标记后面那句指令的地址,常用于表示入口点,类似于C语言中的函数名;C语言中的goto可以跳转到一个标号,在arm汇编中用指令b flag:j就可以跳转到flag:对应的标号处执行 |
PC指向正被取指的指令,而非正在执行的指令为增加处理器指令流的速度,ARM使用多级流水线.,(S5PV210使用13级流水线,ARM11为8级)允许多个操作同时处理,而非顺序执行,一般中断返回到PC时需要注意流水线的问题。下图为3级流水线工作原理示意图。
6类指令:1.数据处理指令:
数据处理指令:
——数据传输指令, MOV MVN
——算术指令, ADD SUB RSB ADC SBC RSC
——逻辑指令, AND ORR EOR BIC
——比较指令, CMP CMN TST TEQ
——乘法指令, MUL MLA UMULL UMLAL SMULL SMLAL
——前导零计数。
程序状态寄存器访问指令:MRS MSR
跳转指令: B BL BX
访存指令: LDR/STR LDM/STM SWP
异常中断产生指令: SWI
协处理器指令: mcr mrc
数据传输指令 | mov mvn | (1) mov(move): mov r1,r0 @两个寄存器之间数据传递; (2) mov r1,#0xff @将立即数赋值给目标寄存器; (3) mvn和mov用法一样,区别是mov原封不动传递,而mvn是按位取反后传递。 |
算术指令 | add sub r*** adc ***c rsc | add(加法运算) sub(减法运算) r***(反减运算) adc(带进位的加法运算) ***c(带进位的减法运算) rsc(带进位的反减指令) |
逻辑指令 | and orr eor bic | and(逻辑与) orr(逻辑或) eor(逻辑异或) bic(位清除指令) |
比较指令 | cmp cmn tst teq | cmp(等价于sub r2,r0,r1(r2=r0-r1)) cmn(等价于add r0,r1) tst(对特定位进行操作) teq(对两个数进行异或);比较指令不用加s后缀就可以影响spsr中的标志位 |
乘法指令 | mvl mla umull umlal | 实际编程比较少用 |
前导零计数 | clz | 统计一个数的二进制位前面有几个0 |
[@,#,//,/~/] 注释,和C语言的//是一样的2.常用GNU伪指令
: 冒号,在汇编中以冒号结尾的是标号,标号标记标号后面的指令的地址,举例汇编的死
循环: flag: b flag
. 点号,代表当前指令的地址,例如:b .指令会进入死循环
#立即数前面要加#或$,代表一个立即数(不区分进制)
更多回帖