大家好,今天给大家分享,GNU汇编的语法。

嵌入式中汇编语言的基本实现_linux

第一:汇编简介

        GNU 汇编语法适用于所有的架构,并不是 ARM 独享的,GNU 汇编由一系列的语句组成,

每行一条语句,每条语句有三个可选部分,如下:

label:instruction @ comment

label 即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到

指令的地址,标号也可以用来表示数据地址。注意 label 后面的“:”,任何以“:”结尾的标识

符都会被识别为一个标号。

instruction 即指令,也就是汇编指令或伪指令。

@符号,表示后面的是注释,就跟 C 语言里面的“/*”和“*/”一样,其实在 GNU 汇编文

件中我们也可以使用“/*”和“*/”来注释。

注意:ARM 中的指令、伪指令、伪操作、寄存器名等可以全部使用大写,也可以全部使用


小写,但是不能大小写混用。



第二:处理器内部数据传输方法


      


1MOV 指令

MOV 指令用于将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄

存器里面,使用示例如下:

MOV R0,R1        @将寄存器 R1 中的数据传递给 R0,即 R0=R1

MOV R0, #0X12    @将立即数 0X12 传递给 R0 寄存器,即 R0=0X12

2MRS 指令

MRS 指令用于将特殊寄存器(如 CPSR 和 SPSR)中的数据传递给通用寄存器,要读取特殊

寄存器的数据只能使用 MRS 指令!使用示例如下:

MRS R0, CPSR      @将特殊寄存器 CPSR 里面的数据传递给 R0,即 R0=CPSR

3MSR 指令

MSR 指令和 MRS 刚好相反,MSR 指令用来将普通寄存器的数据传递给特殊寄存器,也就

是写特殊寄存器,写特殊寄存器只能使用 MSR,使用示例如下:

MSR CPSR, R0      @将 R0 中的数据复制到 CPSR 中,即 CPSR=R0


4 BL 指令



BL 指令相比 B 指令,在跳转之前会在寄存器 LR(R14)中保存当前 PC 寄存器值,所以可以通过将 LR 寄存器中的值重新加载到 PC 中来继续从跳转之前的代码处运行,这是子程序调用一个基本但常用的手段。比如 Cortex-A 处理器的 irq 中断服务函数都是汇编写的,主要用汇编来实现现场的保护和恢复、获取中断号等。但是具体的中断处理过程都是 C 函数,所以就会存

在汇编中调用 C 函数的问题。而且当 C 语言版本的中断处理函数执行完成以后是需要返回到

irq 汇编中断服务函数,因为还要处理其他的工作,一般是恢复现场。这个时候就不能直接使用

B 指令了,因为 B 指令一旦跳转就再也不会回来了,这个时候要使用 BL 指令,示例代码如下:

BL 指令示例

push {r0, r1} @保存 r0,r1

 cps #0x13

@进入 SVC 模式,允许其他中断再次进去

bl system_irqhandler

@加载 C 语言中断处理函数到 r2 寄存器中

 cps #0x12 @进入 IRQ 模式

 pop {r0, r1}

 str r0, [r1, #0X10] @中断执行完成,写 EOIR

上述代码中就是执行 C 语言版的中断处理函数,当处理完成以后是需要返回来继续

执行下面的程序,所以使用了 BL 指令。


总结:ARM 汇编就讲解到这里,主要说明了一些最常用的指令,还有很多不常用的指令没有讲


解 , 用到了再看也不迟哦。