ARM基本汇编操作指令
正点原子 开发板:iMX6ULL-mini
NXP(恩智浦):SOC:IMX6ULL
ARM kernal:Cortex-A7 V7
keil 4.12 smasung:s3c2440A ARM9 V5TE
立即数
- 能被编译器编译进指令中的数字量,称为立即数
- 立即数是前12位(imm12),又分为imm3 + 旋转位
是立即数的判断方法:
- 如果一个数在0~255之间,则是立即数
- 如果将一个数展开为二进制形式,存在一种循环右移(偶数位)的方式,使得移位后的结果高24bit全为0,那么这个数就是立即数
四种系统栈
- 满增栈
- 满减栈
- 空增栈
- 空减栈
注:其中ARM 内核是满减栈
CPSR条件标志位(NZCV)
N:符号标志位:上条指令执行结果最高位bit31为l,则N=1,当结果作为有符号解释时为负值;
Z:零值标志位:上条指令执行结果为0(即bit0-bit3l均为0),则Z=1;
C:进位/借位标志位:进行无符号解读,如果在加法过程中进位或者减法时没有借位,则为C=1,否则C=0
V:溢出标志位:进行有符号解读,是否发生溢出-231-231-1(两个正数加得负数,两个负数加得正数)
指令
-
mov
mov{s}< c > < Rd >, #< const >
mov{s}< c > < Rd >, < Rm >
示例
mov r0, #0x08 ;将0x08放入r0寄存器mov r1, r2 ;将r2寄存器的值放到r1寄存器
- add(加法指令)
-立即数作为第二操作数: ADD{S}< c > < Rd >, < Rn >, #< const >
-寄存器作为第二操作数寄存器: ADD{S}< c > < Rd >, < Rn >, < Rm >{, < shift >}
-寄存器作为第二操作数移位量: ADD{S}< c > < Rd >, < Rn >, < Rm >, < type > < Rs >
示例:
mov r0, #0x0fmov r1, #0x04add r2, r0, #0xf0add r3, r1, r2add r4, r2, r3, lsl #1 ;将r3逻辑左移1位再和r2相加放入r4寄存器
- sub(减法指令)
立即数作为第二操作数: SUB{S}< c > < Rd >, < Rn >, #< const >
寄存器作为第二操作数寄存器: SUB{S}< c > < Rd >, < Rn >, < Rm >{, < shift >}
寄存器作为第二操作数移位量: SUB{S}< c > < Rd >, < Rn >, < Rm >, < type > < Rs >
示例:
mov r0, #0xf0mov r1, #0x01sub r2, r0, #0x04sub r3, r2, r1 ;r2-r1
-
ldr(加载指令)
ldr< c > < Rt >, < label > -
sdr(存放指令)
-
mvn(按位取反移动指令)
MVN{S}< c > < Rd >, #< const >
MVN{S}< c > < Rd >, < Rm >{, < shift >}
MVN{S}< c > < Rd >, < Rm >, < type > < Rs >
mov r0, 0xffmvn r0, r0 ;r0按位取反后存放在r0
- bic(bit clear):指定位置清零指令
bic{s}< c > < Rd >, < Rn >, #< const >
bic{s}< c > < Rd >, < Rn >, < Rm >{, < shift >}
bic{s}< c > < Rd >, < Rn >, < Rm >, < type > < Rs >
示例:
mov r0, #0xf1bic r1, r0, #(1 << 4) ;将r0中(1<<4)的位置清零存放到r1中
- orr(指定位置置1指令)
orr{s}< c > < Rd >, < Rn >, #< const >
orr{s}< c > < Rd >, < Rn >, < Rm >{, < shift >}
orr{s}< c > < Rd >, < Rn >, < Rm >, < type > < Rs >
示例:
mvn r1, r1orr r2, r0, #(1 << 2) ;将r0中(1<<2)的位置置1的位置存放到r1中
- cmp(比较指令)
cmp< c > < Rn >, #< const >
cmp< c > < Rn >, < Rm >{, < shift >}
cmp< c > < Rn >, < Rm >, < type > < Rs >
示例
cmp r0, r1 ;<==> subs r0, r1
-
b bl bx : (跳转指令)
b< c > < lable >
b fun <==> ldr pc, =funbl< c> < label >
bl funbx< c> < Rm>
bx lr <==> mov pc, lr
bl和bx的区别:
bl会在执行跳转语句之前,将跳转语句的下一条语句pc值保存到 lr 中(保护现场)
bx会回复 lr 中的地址到pc (恢复现场)
- stmfd ldmfd:(批量数据传输的指令)
<1>stmfd(Store Multiple Full Descending):批量存储指令,将多个寄存器的值写入内存(压栈)
语法:stmfd 寄存器!, {寄存器列表}
例:stmfd sp!, {r0-r3, lr} //表示将 r0-r3 和 lr 的值依次压入栈中
<2>ldmfd(Load Multiple Full Descending):批量加载指令,从内存中读取数据到多个寄存器(弹栈)
语法:ldmfd 寄存器!, {寄存器列表}
例:ldmfd sp!, {r0-r3, pc} //表示从栈中依次读取数据到 r0-r3 和 pc 中
示例:
b asm_main
asm_fun0mov r0, #10mov r1, #12bx lrasm_twoNumMaxmov r0, #10mov r1, #20cmp r0, r1movge r3, r0movlt r3, r1stmfd sp!, {r0-r12, lr}bl asm_fun0ldmfd sp!, {r0-r12, lr}bx lrasm_mainldr sp, =0x40001000mov r0, #100mov r1, #200stmfd sp!, {r0-r12, lr}bl asm_twoNumMaxldmfd sp!, {r0-r12, lr}add r3, r0, r1