常用汇编语言语法

目录

指令及其含义:

指令:LDR(load)

指令:LDR(伪指令)

指令:STR(Srote)

指令:ldm

指令:stm

指令:B

指令:BL

指令:MOV(move)

指令:MOV(move)

指令:sub

指令:add

指令:cmp

指令:bne

指令:MRS

指令:MSR

指令:bic


  • 指令及其含义:

指令:LDR(load)

含义:读内存命令

例子:

指令:LDR R0 ,[R1]   --假设R1的值为x

命令解析:读取地址x上的数据(4个字节)保存到R0中。


指令:LDR(伪指令)

含义:伪指令(并不存在的指令,最终被解析成真正的汇编指令)

例子:

LDR R0,=0x12345678

命令解析:把0x12345678的值赋值给R0

补充:伪指令的含义

一条ARM指令为  32 位 ,其中肯定是由某些字节来表示MOV本身,某一位用来指定使用的寄存器(比如R0),剩下的位就不足32位了,如果我们需要使用命令:MOV R0 ,#0x12345678 ,此时MOV指令剩下的位已经不足32为了,所以这条指令就会出错,所以MOV指令不能写任意值,只能写简单的值(被称为立即数)。


指令:STR(Srote)

含义:写内存命令

例子:

指令:LDR R0 ,[R1]   --假设R1的值为x

命令解析:

例子:

指令:STR R0 ,[R1]   --假设R1的值为x

命令解析:把R0的值(4字节)写到地址x中去。


指令:ldm

含义:读内存读取数据,然后把读取的数据写入多个寄存器

命令解析:

例子:

ldmia    sp, {fp, sp, pc}

假设:sp=4080

例子:ia的含义是过后增加(Increment After),就是先读取后增加,而且的顺序的依据是:高编号的寄存器存储在高地址

fp,sp,  pc 这三个的寄存器编号分别如下所示(ARM编程手册查看)

pc->R15,sp->R13,fp->R11.所以存取的顺序是:fp-sp-pc(与指令顺序无关)

常用汇编语言语法_第1张图片

常用汇编语言语法_第2张图片

附录:

其他形式简单的描述指令的行为,意思分别是过后增加(Increment After)、预先增加(Increment Before)、过后减少(Decrement After)、预先减少(Decrement Before)。


指令:stm

含义:把多个寄存器的值写入内存

例子:

指令:stmdb    sp!, {fp, ip, lr, pc}

解析:假设sp=4096,db是预先减少(Decrement Before)的意思,就是先减少后存入sp开始的地址,而且存取的顺序的依据是:高编号的寄存器存储在高地址。fp, ip, lr, pc 这四个的寄存器编号分别如下所示(ARM编程手册查看)

pc->R15,lr->R14,ip->R12,fp->R11.所以存取的顺序是:pc-lr-ip-fp(与顺序无关)

常用汇编语言语法_第3张图片

存储的大体如下,先减后存入:

提示:sp!的含义代表的是,sp会等于执行完此条语句后的值,比如存入四个寄存器,那么得减掉4次,那么sp=4096-16=4080。

感叹后表示执行完语句后sp的值会被改变.

常用汇编语言语法_第4张图片

附录:

其他形式简单的描述指令的行为,意思分别是过后增加(Increment After)、预先增加(Increment Before)、过后减少(Decrement After)、预先减少(Decrement Before)。


指令:B

含义:跳转指令


 

指令:BL

含义:跳转到指定指令,把返回地址(下一条指令的地址)保存在lr寄存里边

例子:

BL  xx

aa

解析:命令跳转到xx处执行,且lr寄存器保存aa的地址,以便继续运行


 

指令:MOV(move)

含义:赋值指令

例子1:

MOV R0,R1 

命令解析:把R1的值赋值给R0

(即为:R0=R1)

例子2:

MOV R0,#0x100

命令解析:把0x100赋值给R0


 

指令:MOV(move)

含义:赋值指令

例子1:

MOV R0,R1 

命令解析:把R1的值赋值给R0

(即为:R0=R1)

例子2:

MOV R0,#0x100

命令解析:把0x100赋值给R0 


 

指令:sub

含义:减法指令

例子1:

指令:sub ro ,r1,#5 

解析:其含义是:r0 = r1 -5;

例子2:

指令:sub ro ,r1,r2 

解析:其含义是:r0 = r1 -r2


 

指令:add

含义:加法指令

例子1:

指令:add ro ,r1,#5 

解析:其含义是:r0 = r1 + 5;

指令:add ro ,r1,r2 

解析:其含义是:r0 = r1 + r2;


指令:cmp

含义: cmp(compare)指令进行比较两个操作数的大小

例子:例:cmp oprd1,oprd2

其含义为第一个操作减去第二个操作数,但不影响第两个操作数的值,它影响flag的CF,ZF,OF,AF,PF.

常用汇编语言语法_第5张图片

 

若执行指令后:ZF=1,则说明两个数相等,因为zero为1说明结果为0.

   当无符号时:

   若CF=1,则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1

   CF=0,则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2.

   当有符号时:

   若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2;

   若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1

   若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1

   若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2;

   最后两个可以作出这种判断的原因是,溢出的本质问题:

   两数同为正,相加,值为负,则说明溢出

   两数同为负,相加,值为正,则说明溢出

   故有,正正得负则溢出,负负得正则溢出


指令:bne

含义: 是个条件跳转,即:是“不相等(或不为0)跳转指令”。如果不为0就跳转到后面指定的地址,继续执行

例子:

    cmp    r3, #4    ; 0x4

    bne    a0

    ldr    r2, [fp, #-20]

当着两句连用时,代表r3-4,如果结果为0,则继续执行下面的语句ldr,如果结果不为0,则跳转到地址处执行。


⑭ 

指令:MRS

含义:MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。

格式MRS{条件}   通用寄存器,程序状态寄存器(CPSR或SPSR)

例子:

MRS R0,CPSR  @传送CPSR的内容到R0
MRS R0,SPSR  @传送SPSR的内容到R0


注意事项:
MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情冴: 
Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
Ⅱ.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。


指令:MSR

含义:MSR指令用亍将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。

格式MSR{条件}   程序状态寄存器(CPSR或SPSR)_<域>,操作数

例子:

MSR CPSR,R0    @传送R0的内容到CPSR
MSR SPSR,R0    @传送R0的内容到SPSR
MSR CPSR_c,R0   @传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域

注意事项:

<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:
位[31:24]为条件标志位域,用f表示;
位[23:16]为状态位域,用s表示;
位[15:8]为扩展位域,用x表示;
位[7:0]为控制位域,用c表示;
该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。


指令:bic

含义:BIC指令用于清除(操作数1)的某些位,并把结果放置到目的寄存器中。(操作数1)应是一个寄存器,(操作数2)可以是一个寄存器,被移位的寄存器,或一个立即数。(操作数2)为32位的掩码,如果在掩码中设置了某一位,则清除返一位。未设置的掩码位保持不变。

格式BIC{条件}{S}  目的寄存器,操作数1,操作数2

例子:
bic r0,r0,#0x1f
0x1f=0xb11111
其含义:清除r0的bit[4:0]位。
 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Linux裸机开发学习笔记)