汇编伪指令的学习

xiaoxiao2021-02-28  147

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加载的地址和链接时给定的地址有关,由链接脚本决定。

转载请注明原文地址: https://www.6miu.com/read-21504.html

最新回复(0)