ARM汇编学习笔记四

四、GUN ARM汇编基础

1.GNU ARM汇编器

GNU ARM 汇编语言基本格式:

  • label:instruction or directive or pseudo-instruction @comment
  • instruction:机器指令,处理器中有特定硬件来执行;
  • direvtive:伪操作,没有对应机器指令,只起编译器指示作用;
  • pseudo-instruction:伪指令,会被编译为一条或者多条机器指令;

2.GNU编译环境构成

 GNU编译工具主要包括汇编器as、编译器gcc、链接器ld、反汇编工具objdump等,没种工具都有X86版本和ARM版本。

3.段以及LDS文件

 GNU ARM以段为单位来组织程序,段是具有相同属性的一段内容,汇编所产生的目标文件至少具有text(存放MOV、SUBS等)、data、bss这三个段,分别对应可执行代码,初始化数据以及未初始化数据。
 一般通过LDS链接脚本文件完成段定义的过程,如下面的uart.lds文件:

SECTION  // 段声明
{
     
  .=0x23E00000 //定义段首链接地址
.text:
      {
     
        start.o //指明首先链接start.o文件
        *(.text)
      }

.bss:
      {
     
        *(.bss) //定义bss段并且跟在text段之后
      }

.data:
      {
     

        *(data) //定义data段
      }

}

4.GNU ARM常用伪操作

符号定义伪操作

  • .equ symbobl,expr //将symbol定义为expr
  • .global symbol //将symbol定义为全局标号
  • .extern symbol //声明symbol为一个外部变量

数据定义伪操作

  • .word expr {,expr}… //分配子内存单元并用expr初始化
  • .byte expr {,expr}… //分配字节内存单元并用expr初始化
  • .long expr {,expr}… //同.word
  • .ascii expr {,expr}… //字符串,非零结束符
  • .string expr {,expr}… //字符串,零结束符同.asciz
  • .zreo expr {,expr}… //用0田中size字节的内容

汇编与反汇编控制伪操作

  • .arm //定义以下代码用arm指令集编译,同.code32
  • .thumb //定义以下代码用thumb指令集编译,同.code16
  • .end //汇编结束标志

预定义控制操作

  • .if // 条件判断语句
  • .else //条件判断语句
  • .endif // 条件判断语句
  • .macro // 宏定义开始
  • .endm //宏定义结束
  • .exitm // 中途跳转出宏
  • .include “file_name” //包含文件标识
/*---宏定义以及使用实例---*/
.macro HANDLER HandleLabel
   sub sp,sp,#4    //给中断入口留地方
   stmfd sp!,{
     R0}  //要用到的R0 先放栈保护现场
   ldr R0 ,=HandleLabel //取地址
   ldr R0 ,[R0]      //中断服务程序入口给R0
   str R0 ,[sp,#4]   //ISR入栈
   ldmfd sp!, {
     R0,PC}//恢复R0并将PC指向ISR
.endm
调用时:
HandlerFIQ:  HANDLER HandleFIQ
HandlerIRQ:  HANDLER HandleIRQ

结尾:

  初学ARM汇编将其分段整理成笔记供自己参考也供与大家学习,如有错误请大佬们直言指出,如果感觉有用那就点个赞留个言,谢谢观众老爷们的赏脸。
  若想获得上述内容的PDF版本移步到GitHub下载。
  地址: https://github.com/QianquanChina/Study-Notes

-----缱绻

你可能感兴趣的:(ARM汇编学习,linux,编程语言,arm)