ARM汇编伪指令

伪指令的意义

  • 伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。
  • 伪指令的意义在于指导编译过程。
  • 伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。

gnu汇编中的一些符号

@ 用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//类似

# 做注释,一般放在行首,表示这一行都是注释而不是代码。

:以冒号结尾的是标号

. 点号在gnu汇编中表示当前指令的地址

# 立即数前面要加#或$,表示这是个立即数

常用gnu伪指令

.global _start       @ 给_start外部链接属性

.section .text       @ 指定当前段为代码段

.ascii .byte .short .long .word .quad .float .string @ 定义数据

.align 4          @ 以16字节对齐

.balignl 16 0xabcdefgh   @ 16字节对齐填充

偶尔会用到的gnu伪指令

.end         @标识文件结束

.include       @ 头文件包含

.arm / .code32    @声明以下为arm指令

.thumb / .code16  @声明以下为thubm指令

最重要的几个伪指令

  • ldr 大范围的地址加载指令
  • adr 小范围的地址加载指令
  • adrl 中等范围的地址加载指令
  • nop 空操作
  • ARM中有一个ldr指令,还有一个ldr伪指令 一般都使用ldr伪指令而不用ldr指令

adr与ldr

  • adr编译时会被1条sub或add指令替代,而ldr编译时会被一条mov指令替代或者文字池方式处理;
  • adr总是以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里
  • ldr加载的地址和链接时给定的地址有关,由链接脚本决定。
原文地址:https://www.cnblogs.com/jxjl/p/6977883.html