汇编指令(初阶版)

本文主要通过简单的汇编指令案例深化对汇编指令的熟悉,采用的是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 -----------------------------------------------------------

写在文末:以上为本章内容,适合刚接触汇编的入门者,需要注意的是对于这些基本的汇编指令在敲完后去理解,牢记最基本的指令。

猜你喜欢

转载自blog.csdn.net/bx1091182836/article/details/128610280