1. 伪操作:在汇编程序中不占用存储空间,但是可以在程序编译时起到引导和标识作用
.text .global .glbal .if .else .endif .data .word....
2. 汇编指令:每一条汇编指令都用来标识一个机器码,让计算机做一个指令运算
数据处理指令
程序流控制指令
存储器访问指令
状态寄存器传送指令 CPSR
软中断指令
3. 伪指令:不是汇编指令,但是也可以让处理器做一些数据处理,通常一条伪指令会由多条汇编指令联合实现
4. 注释
单行注释 : @ ;(有些是用‘;’)
多行注释 : /* */
条件注释
.if 1/0
指令段1
.else
指令段2
.endif
{} {s} , ,
:指令的操作码
cond:条件码后缀
s:指令的执行结果将会影响CPSR中的条件标志位。
:目标寄存器,指令的运算结果保存在目标寄存器中
:第一操作寄存器,只能是寄存器
:第二操作数,既可以是寄存器编号,又可以是立即数
意义:让第一操作寄存器中的值和第二操作数按照指令操作码进行运算,并且将运算的结果保存在目标寄存器中
注意:
1.一般一条汇编指令就占据一行代码
2.汇编不区分大小写
3.操作数前面要跟一个#
{} {s} ,
解释:
:指令的操作码
cond:条件码后缀
s:指令的执行结果将会影响CPSR中的条件标志位。
:目标寄存器,指令的运算结果保存在目标寄存器中
:第一操作数,既可以是寄存器编号,又可以是立即数
指令码助记符:
mov : 将操作数直接搬移到目标寄存器中
mvn : 将操作数按位取反之后搬移到目标寄存器中
循环右移:低位移除,补到高位
利用伪指令ldr即可完成非立即数的操作
格式:
ldr 目标寄存器名,=数据
格式:
{} {s} , ,
解释:将第一操作寄存器的数值移位第二操作数位,将结果保存在目标寄存器中
指令码:
lsl:左移运算,最高位移出,最低位补0
lsr:右移运算,最低位移出,最高位补0
ror:循环右移:最低位移出,补到最高位
.text
.global _start
_start:
mov r0,#0XFF
lsl r1,r0,#4 @0XFF左移四位结果保存到r1 0XFF0
lsr r2,r0,#4 @0XFF右移移四位结果保存到r2 0XF
ror r3,r0,#4 @0XFF循环右移四位结果保存到r3 0XF000000F
loop:
b loop
.end
格式:
{} {s} , ,
指令码:
and:进行按位与
orr:进行按位或
eor:按位异或
bic:按位清0
.text
.global _start
_start:
mov r0,#0XFF
and r1,r0,#(~(0X1<<4)) @第四位清0 0xEF
orr r2,r0,#(0X1<<9) @第9位置1 0X2FF
eor r3,r0,#0XF @0xf0
bic r4,r0,#(0X1<<4)@第四位清0 0xEF
loop:
b loop
.end
格式:
{}{s} , ,
指令码:
add : 加法运算 Rd=Rn+shifter_operand
adc : 进行加法运算时考虑CPSR的C位 Rd=Rn+shifter_operand+CPSR[c]
sub : 减法运算 Rd=Rn-shifter_operand
sbc : 进行减法运算时考虑CPSR的c位 Rd=Rn-shifter_operand-!CPSR[c]
RSB : 逆向减法Rd=shifter_operand-Rn
RSC : 带借位的逆向减法指令 Rd = shifter_operand – Rn - !CPSR[c]
mul : 乘法运算 Rd=Rn*shifter_operand
.text
.global _start
_start:
mov r0,#0XFFFFFFFE
mov r1,#3
adds r2,r0,r1 @0X1,运算的结果影响到条件位
adc r3,r1,r2 @r3=r1+r2+CPSR[c]
loop:
b loop
.end
MOV R1,#0xfffffffe @第一个数据的低32位
mov r2,#0x00000004 @第一个数据的高32位
MOV R3,#0x00000005 @第二个数据的低32位
mov r4,#0x00000004 @第二个数据的高32位
加法:
低32位:
adds r5,r1,r3
高32位:
adc r6,r2,r4
减法:
低32位:
subs r5,r3,r1
高32位:
sbc r6,r4,r2
格式:
cmp ,
比较指令的本质:
拿第一操作寄存器和第二操作数进行减法运算,并且减法运算的结果会影响到CPSR的条件位
可以根据比较指令之后的条件位的数值进行不同的运算,相当于c里的选择语句
这里需要对CPSR的条件位进行判断,我们依赖条件位的助记词{cond}后缀实现
.text
.global _start
_start:
MOV R1,#4
MOV R2,#4
CMP R1,R2
addeq r3,r1,r2 @if(r1==r2) r3=r1+r2
subne r4,r1,r2 @if(r1!==r2) r4=r1-r2
loop:
b loop
.end
一般实现程序的跳转有两种方式:
跳转指令:
.text
.global _start
_start:
MOV R1,#4
MOV R2,#4
CMP R1,R2
beq addfunc
bne subfunc
addfunc:
add r3,r1,r2
b loop
subfunc:
sub r4,r1,r2 @if(r1!==r2) r4=r1-r2
b loop
loop:
b loop
.end
.text
.global _start
_start:
MOV R1,#4
MOV R2,#4
CMP R1,R2
bleq addfunc
blne subfunc
addfunc:
add r3,r1,r2
mov pc,lr @程序返回
subfunc:
sub r4,r1,r2 @if(r1!==r2) r4=r1-r2
mov pc,lr @程序返回
loop:
b loop
.end
.text
.global _start
_start:
MOV R1,#4
MOV R2,#4
MOV R3,#4
MOV R4,#4
MOV R5,#4
MOV R6,#4
bx r3 @跳转到地址为4的指令位置
loop:
b loop
.end
.text
.global _start
_start:
MOV R1,#4
MOV R2,#4
MOV R3,#4
MOV R4,#4
MOV R5,#4
blx r3 @跳转到地址为4的指令位置
MOV R6,#4
loop:
b loop
.end