汇编基础1
1.格式
伪操作:它们不是ARM处理器实际的指令(如MOV, ADD等),而是写给汇编器看的命令,用于指导汇编器如何工作
area reset, code, readonlycode32entry内容 end
- area: 这是最重要的一个伪操作,用于定义一个段。程序、数据、堆栈等都需要被组织在不同的段中。
- reset: 这是你为这个段起的名字。名字 reset 具有很强的暗示性,通常用于表示复位向量段,即CPU上电或复位后首先执行的第一段代码所在的位置。
- code: 指定该段的属性为代码,意味着这个段包含可执行的指令。
- readonly: 指定该段的属性为只读。对于代码段来说,这通常是默认且必须的。
- code32: 表示后续指令使用 32位的 ARM 指令集。
- thumb: 表示后续指令使用 16位的 Thumb 指令集
2.指令
2.1 mov
MOV{S}<c> <Rd>, #<const>
MOV{S}<c> <Rd>, <Rm>
mov r0, #0x8 //r0赋值为0x8 mov r1, r0 //r1赋值为r0即0x8 mov r3, #31 //r3赋值为31mov r0 #1 mov r6, r0, lsl #31 //将r0左移31位然后赋值给r6 mov r7, r0, lsl r3
2.2 add(加法)
立即数作为第二操作数: ADD{S}<c> <Rd>, <Rn>, #<const>
寄存器作为第二操作数寄存器: ADD{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
寄存器作为第二操作数移位量: ADD{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>add r6, r0, #0xF0 //r6 = r0 + 0xf0 add r7, r0, r1 //r7 = r0 + r1 add r7, r0, r1, lsl #1 // r7 = r0 + (r1 << 1) add r8, r0, r1, lsl r2
注意
- {, <shift>} 其中{}代表可选择,“,”表示在使用时需要在Rm后添加“,” ,shift 移位量(立即数)
- add r0, #3, #2 :为什么没有这种形式,C语言int a = 1 + 2; 编译阶段计算, 不需要在机器指令中体现
2.3 sub(减法)
用法同加法
2.4 ldr(加载)
LDR<c> <Rt>, <label>
ldr r0, =0xfff0
2.5 mvn(按位取反)
MVN{S}<c> <Rd>, #<const>
MVN{S}<c> <Rd>, <Rm>{, <shift>}
MVN{S}<c> <Rd>, <Rm>, <type> <Rs>示例: mvn r0 , #0xffffffff // r0 = 0x0
2.6 bic(指定位置清0)
BIC{S}<c> <Rd>, <Rn>, #<const>
BIC{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
BIC{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>示例: bic r0, #(1 << 2) //第二位清0 bic r0, #4 //0x0100 ,即第四位清0
orr:指定位置一
用法同bic
3.循环
循环三要素
- 循环结束条件
- 推动循环趋向终结的语句
- 循环的循环体
3.1 b指令(标记位)
示例 ldr r0, =0x0fffmov r1, #0xf00mov r2, #0xf000cmp r0, r1bge greater //r0大于r1,执行greaterblt lessgreatermovge r3, r0b finish lessmovlt r3, r1
3.2 循环
示例:从1加到100的和mov r0, #0mov r1, #0 loopadd r1, r1, r0add r0, r0, #1cmp r0, #100ble loop //r0小于等于100, 就执行loop