GNU汇编伪指令操作

来源:互联网 发布:知乎 东风 编辑:程序博客网 时间:2024/05/22 00:55

在u-boot的源码中start.S等汇编文件中用到很多GNU的汇编伪指令,在这把常用的列举一下:

1.GNU 汇编伪指令

  1. .abort 停止汇编
  2. .align absexpr1,absexpr2
    以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或32. 第二个表达式值表示填充的值
  3. .if
    .else
    .endif: 支持条件预编译
  4. .include “file”: 包含指定的头文件, 可以把一个汇编常量定义放在头文件中
  5. .comm symbol, length:
    在bss段申请一段命名空间,该段空间的名称叫symbol, 长度为length. Ld连接器在连接
    会为它留出空间
  6. .text subsection:切换当前节,即将下面的程序汇编到.text节的编号为subsection的子节中。如未提供subsection,其缺省值为0
  7. .data subsection: 切换当前节,即将下面的数据汇编到.data节的编号为subsection的子节中。如未提供subsection,其缺省值为0
  8. .previous:将当前节换回到前一个节与子节,即将下面的指令或数据汇编到当前节之前使用的节与子节中
  9. .equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间
  10. .global symbol: 定义一个全局符号, 通常是为ld使用
  11. .section name [,”flags”,@type,flag_specific_arguments]:切换当前节,即将下面的代码或数据汇编到name节中。其中flag可以是a(节是可分配的),w(节是可写的),x(节是可执行的);type可以是@progbits(节中包含数据),@nobits(节中不含数据,只是占位空间),@note(节中包含注释信息,不是程序).
  12. .subsection num:切换当前字节,即将下面的代码或数据放在由num指定的子节中,节保持不变.
  13. .ascii “string”…: 定义一个到多个字符串并为之分配空间,字符串后不自动加0结尾
  14. .asciz “string”…:定义一个到多个字符串并为之分配空间,字符串后自动加0结尾
  15. .string “str”:将字符串拷贝到目标文件中,串以0结尾
  16. .byte expressions: 定义一个字节, 并为之分配空间
  17. .word expressions: 定义一个字,并为之分配空间, 4 bytes
  18. .short expressions: 定义一个短整型, 并为之分配空间
  19. .int expressions: 定义一个整型,并为之分配空间
  20. .long expressions: 定义一个长整型, 并为之分配空间
  21. .quad bignums:定义一个1~8字节的长整数
  22. .fill repeat,size,value:将value值拷贝repeat次,其中每个value中占用size字节
  23. .space size,fill和.skip size,fill:在目标文件的当前位置处留出size字节的空间,并在其中填入值fill,如未指定fill,则填入0
  24. .rept count和.endr:将.rept和.endr之间的行重复count次,如:
    .rept 0x200
    FL_SECTION_ENTRY __base,3,0,0,0
    .set __base,__base+1
    .endr
  25. .set symbol,expression:将符号symbol的值设为expression
  26. .type name,@type:将符号name的type属性设为type。其中type可以是function或object
  27. .size name,expression:将符号name所占空间设为expression
  28. .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 register name: 为寄存器定义一个别名
  30. .code [16|32]: 指定指令代码产生的长度, 16表示Thumb指令, 32表示ARM指令
  31. .arm 表示ARM指令等价于.code32
  32. .thumb 表示Thumb指令等价于.code16
  33. .ltorg: 表示当前往下的定义在归于当前段,并为之分配空间
  34. .org new-lc,fill:从new-lc标识的新位置开始存放下边的代码或数据,之前空出来的空间用fill填充
  35. .set symbol 声明一个外部符号
  36. .weak symbol 声明一个弱符号

2.GNU专有符号

  1. @ 表示注释从当前位置到行尾的字符.
  2. # 注释掉一整行.
  3. ; 新行分隔符.
  4. \ 换行符.
  5. ‘#’或‘$’直接操作数前缀

3.操作指令

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