本文主要通过简单的汇编指令案例深化对汇编指令的熟悉,采用的是Keil uVision4软件模拟arm汇编,涉及到概念性问题需要牢记,基本的汇编指令格式要动手敲。
1.汇编指令格式和机器汇编指令格式
汇编指令:机器指令的助记符,以文本形式出现,cpu不能读取执行,需要编译成机器指令,cpu才能读取执行
比如,32位的处理器机器指令为00010101001010101010001100010000,对应的汇编指令为mov r0,#1
伪指令:不是汇编指令,是用来指导编译过程的假指令
如:.text .end
@.text作用是告诉编译器将以下的指定放到代码段
@.end的作用是告诉编译器程序结束了
注:在汇编指令中,符号“@”表示注释,和linux下的//作用相同
注:上图为 Keil uVision4软件的寄存器示例
汇编指令基本格式
<OPCODE> {<COND>} {S} <RD>, <RN>, {<OPERAND2>}
其中:<>内的项是必须的,{}内的项是可选的
OPCODE:指令助记符
COND:执行条件
S:是否影响CPSR寄存器的值
RD:目标寄存器
RN:第一个操作数的寄存器
OPERAND2:第二个操作数,可以是寄存器,也可以是立即数
2.三级流水线
一条指令要被执行,需要经过取指 译码 执行
3.汇编指令
3.1 数据搬移指令
mov r0,r1 @将r1取反后赋值给r0
mov指令的0xffffffff是合法的立即数,因为它被编译成了mov r0,0x0000 0000
mov r0,r1,lsl,#1 @将r1左移1位赋值给r0 左移1位就是乘以2
mov r0,r1,lsr,#1 @将r1右移1位赋值给r0 右移1位就是除以2
3.2 算数指令
add r0,r1,r2 @r0 = r1 + r2
sub r3,r1,r2 @r3 = r1 - r2
mul r3,r1,r2 @r3 = r1 * r2
add r0,r1 @r0 += r1
add r0,r1,lsl,#1 @r0 = r0 + r1 << 1
3.3 逻辑指令
and r0,r1,r2 @r0 = r1 & r2
orr r0,r1,r2 @r0 = r1 | r2
bic r0,#0x3 @将r0的第0位和第1位清0
3.4 比较指令
cmp r0,r1 @比较r0和r1的大小
tst r0,#0x2 @判断r0的第1位是否为0
注:cmp会自动影响cpsr的值,tst也会改变cpsr的条件位
3.5 跳转指令
b 语句标号 @无条件跳转,与linux下的goto作用相同
bl 语句标号 @在跳转的时候会将下一条指令的地址自动保存在lr寄存器中
标准规定:传参:r0,r1,r2,r3代表函数的前四个参数,r0表示返回值
函数的调用者给r0-r3赋值,子函数去取值就表示传参
子函数给r0赋值,调用者取r0的值就表示得到了返回值
------------------------------------------------------------------------ end -----------------------------------------------------------
写在文末:以上为本章内容,适合刚接触汇编的入门者,需要注意的是对于这些基本的汇编指令在敲完后去理解,牢记最基本的指令。