Arm伪指令

伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。

伪指令的意义在于指导编译过程。

伪指令是和具体的编译器相关的,我们使用gun工具链,因此学习gun环境下的汇编伪指令。

gun汇编中的一些符号:

@  用来做注释

#    也用来做注释,一般用于行首,表示这一行都是注释而不是代码

:  以冒号结尾的是标号

.    在gun汇编中表示当前指令的地址

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

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

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

.ascii .byte .short .long .word

.quad .float .string@定义数据

.align 4    @以16字节对齐

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

.equ    @类似C中宏定义

例如:

IRQ_STACK_START:

  .word  0x12345678

等价于 unsigned int IRQ_STACK_START = 0x122345678;

.balignl 16,0xdeadbeef  @对齐+填充

b表示位填充;align表示要对齐;l表示long,以4字节为单位填充;16表示16字节对齐;0xdeadbeef是用来填充的原料

 

.end  @表示文件结束

.include  @头文件包含于

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

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

ldr  大范围的地址加载指令

adr  小范围的地址加载指令

adrl  中等范围的地址加载指令

nop  空操作

ARM指令中有一个ldr指令,也有一个ldr伪指令。一般都使用伪指令。

ldr指令:  ldr r0,#0xff

ldr伪指令:    ldr r0,=0xfff  @涉及到合法/非法立即数,涉及到ARM文字池

adr与ldr

adr编译时会被1条sub或add指令替代,而ldr编译时会被条mov指令 替代或者文字池方式处理;
 
adr总 是以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里;

ldr加载的地址和链接时给定的地址有关,由链接脚本决定。 
原文地址:https://www.cnblogs.com/sanshijvshi/p/10723800.html