Arm伪指令

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

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

伪指令是和具体的编译器相关的,咱们使用gun工具链,所以学习gun环境下的汇编伪指令。spa

 

gun汇编中的一些符号:code

@  用来作注释ci

#    也用来作注释,通常用于行首,表示这一行都是注释而不是代码编译器

:  以冒号结尾的是标号string

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

#   当即数前面要加#或$,表示这是个当即数编译

 

.global _start  @给_start外部连接属性float

.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加载的地址和连接时给定的地址有关,由连接脚本决定。
相关文章
相关标签/搜索