1、伪指令的意义
(1)伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。
(2)伪指令的意义在于指导编译过程。
(3)伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。
2、gnu汇编中的一些符号
(1)@ 用来做注释。可以在行首也可以在代码后面同一行直接跟,和C语言中//类似。
(2)# 做注释,一般放在行首,表示这一行都是注释而不是代码。
(3)/**/也可以做注释。
(4):以冒号结尾的是标号,标志某行指令的地址。
(5). 点号在gnu汇编中表示当前指令的地址。如b .是死循环语句。
(6)# 立即数前面要加#或$,表示这是个立即数。
3、常用gnu伪指令
(1).global _start @ 给_start外部链接属性
(2).section .text @ .section用来指定段的,此句指定当前段为代码段
(3).ascii .byte .short .long .word .quad .float .string @ 定义数据
(4).align 4 @ 以16字节对齐,表示2^4=16字节对齐
(5).balignl 16 0xabcdefgh @ 16字节对齐填充,b表示位填充,align表示对齐,l表示以4字节为单位填充,16表示16字节对齐,后面数字是填充原料。
(6).equ @ 类似于C中宏定义
4、偶尔用到的伪指令
(1).end @标识文件结束
(2).include @ 头文件包含
(3).arm / .code32 @声明以下为arm指令
(4).thumb / .code16 @声明以下为thubm指令
5、重要的伪指令
(1)ldr 大范围的地址加载指令
(2)adr 小范围的地址加载指令
(3)adrl 中等范围的地址加载指令
(4)nop 空操作
ARM中有一个ldr指令,还有一个ldr伪指令,一般都使用ldr伪指令而不用ldr指令,区别在于=和#。指令:ldr r0,#0xff(如果非法会报错),伪指令:ldr r0,=0xff adr编译时会被1条sub或add指令替代,而ldr编译时会被一条mov指令替代或者文字池方式处理。adr以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里。ldr加载的地址和链接时给定的地址有关,由链接脚本决定。