ARM GNU 汇编伪指令简介

 ARM GNU 汇编伪指令简介

1 ARM GNU 汇编伪指令简介

  (1)abort
       .abort 停止汇编
  (2)align
      .align absexpr1,absexpr2
     以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或32. 第二个表达式值表示填充的值
  (3)if...else...endif
     .if
     .else
     .endif: 支持条件预编译
  (4)include
     .include "file": 包含指定的头文件, 可以把一个汇编常量定义放在头文件中
  (5)comm
     .comm  symbol, length:
     在bss段申请一段命名空间,该段空间的名称叫symbol, 长度为length. Ld连接器在连接
     会为它留出空间

  (6)text
     .text subsection:切换当前节,即将下面的程序汇编到.text节的编号为subsection的子节中。如未提供subsection,其缺省值为0。
  (7)data
     .data subsection: 切换当前节,即将下面的数据汇编到.data节的编号为subsection的子节中。如未提供subsection,其缺省值为0。
  (8)previous
     .previous:将当前节换回到前一个节与子节,即将下面的指令或数据汇编到当前节之前使用的节与子节中。
  (9)equ
     .equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间

  (10)global
     .global symbol: 定义一个全局符号, 通常是为ld使用
  (11)section
     .section name [,"flags",@type,flag_specific_arguments]:切换当前节,即将下面的代码或数据汇编到name节中。其中flag可以是a(节是可分配的),w(节是可写的),
     x(节是可执行的);type可以是@progbits(节中包含数据),@nobits(节中不含数据,只是占位空间),@note(节中包含注释信息,不是程序).
  (12)subsection
     .subsection num:切换当前字节,即将下面的代码或数据放在由num指定的子节中,节保持不变.

  (13)ascii
     .ascii  "string"...: 定义一个到多个字符串并为之分配空间,字符串后不自动加0结尾。
  (14)asciz
    .asciz "string"...:定义一个到多个字符串并为之分配空间,字符串后自动加0结尾。
  (15)string
     .string "str":将字符串拷贝到目标文件中,串以0结尾。

  (16)byte
     .byte expressions: 定义一个字节, 并为之分配空间
  (17)word
     .word expressions: 定义一个字,并为之分配空间, 4 bytes

  (18)short
     .short expressions: 定义一个短整型, 并为之分配空间
  (19)int
     .int expressions: 定义一个整型,并为之分配空间
  (20)long
     .long expressions: 定义一个长整型, 并为之分配空间
  (21)quad
     .quad bignums:定义一个1~8字节的长整数。

  (22)fill
     .fill repeat,size,value:将value值拷贝repeat次,其中每个value中占用size字节.
  (23)space 和 skip
     .space size,fill和.skip size,fill:在目标文件的当前位置处留出size字节的空间,并在其中填入值fill,如未指定fill,则填入0。
  (24)rept 和 endr
     .rept count和.endr:将.rept和.endr之间的行重复count次。
  (25)set
     .set symbol,expression:将符号symbol的值设为expression。
  (26)type
     .type name,@type:将符号name的type属性设为type。其中type可以是function或object。
  (27)size
     .size name,expression:将符号name所占空间设为expression。
  (28)macro/endm
     .macro: 定义一段宏代码, .macro表示代码的开始, .endm表示代码的结束, .exitm
     跳出宏, 示例如下:
     .macro SHIFTLEFT a, b
     .if \b < 0
      mov \a, \a, ASR #-\b
     .exitm
     .endif
      mov \a, \a, LSL #\b
     .endm
  (29)req
      name .req register name: 为寄存器定义一个别名
  (30)code
     .code [16|32]: 指定指令代码产生的长度, 16表示Thumb指令, 32表示ARM指令
  (31)ltorg
     .ltorg: 表示当前往下的定义在归于当前段,并为之分配空间
  (32)org
     .org new-lc,fill:从new-lc标识的新位置开始存放下边的代码或数据,之前空出来的空间用fill填充.

2 ARM GNU专有符号
  (1)@ 表示注释从当前位置到行尾的字符.
  (2)# 注释掉一整行.
  (3); 新行分隔符.

3 操作码
  (1)NOP: nop 空操作, 相当于MOV r0, r0
  (2)LDR: ldr , = 相当于PC寄存器或其它寄存器的长转移
  (3)ADR: adr 相于PC寄存器或其它寄存器的小范围转移
  (4)ADRL: adrl 相于PC寄存器或其寄存器的中范围转移


你可能感兴趣的:(ARM GNU 汇编伪指令简介)