要学习一个东西首先要把概念搞清楚,下面只是自己的一些关于汇编的理解。
可执行文件中的01码是机器码,机器码不等于汇编码,虽然机器码可以很容易翻译成汇编码。
汇编码中包含很多汇编指令、伪指令和宏指令等,这些是不可以直接在机器上运行的。
机器指令是ARM指令集和Thumb指令集这些arm硬件支持的指令集组成的。
汇编码中的伪指令和宏指令这些都是汇编语言这个级别的指令,在汇编文件编译的时候汇编编译器as会去处理这些指令,在编译期间也会对宏进行展开,类似于gcc编译的时候对C代码中的宏展开一样。个人感觉这两类指令都是为编写汇编代码提供一些辅助作用,其次对编译器编译汇编代码也会提供一些辅助作用。
下面转发一篇关于ARM伪指令的文章,原帖
ARM汇编伪指令介绍.
在 ARM 的汇编程序中,有如下几种伪指令: 符号定义伪指令、 数据定义伪指令、 汇编控制伪指令、 宏指令以及其他伪指令。
符号定义( Symbol Definition )伪指令
符号定义伪指令用于定义 ARM 汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。
常见的符号定义伪指令有如下几种:
— 用于定义全局变量的 GBLA 、 GBLL 和 GBLS 。
— 用于定义局部变量的 LCLA 、 LCLL 和 LCLS 。
— 用于对变量赋值的 SETA 、 SETL 、 SETS 。
— 为通用寄存器列表定义名称的 RLIST 。
1、 GBLA、GBLL 和GBLS
语法格式:
GBLA ( GBLL 或 GBLS ) 全局变量名
GBLA 、 GBLL 和 GBLS 伪指令用于定义一个 ARM 程序中的全局变量,并将其初始化。其中:
GBLA 伪指令用于定义一个全局的数字变量,并初始化为 0 ;
GBLL 伪指令用于定义一个全局的逻辑变量,并初始化为 F (假);
GBLS 伪指令用于定义一个全局的字符串变量,并初始化为空;
由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。
使用示例:
GBLA Test1 ;定义一个全局的数字变量,变量名为 Test1
Test1 SETA 0xaa ;将该变量赋值为 0xaa
GBLL Test2 ;定义一个全局的逻辑变量,变量名为 Test2
Test2 SETL {TRUE} ;将该变量赋值为真
GBLS Test3 ;定义一个全局的字符串变量,变量名为 Test3
Test3 SETS “ Testing ” ;将该变量赋值为 “ Testing ”
2、 LCLA、LCLL 和LCLS
语法格式:
LCLA ( LCLL 或 LCLS ) 局部变量名
LCLA 、 LCLL 和 LCLS 伪指令用于定义一个 ARM 程序中的局部变量,并将其初始化。其中:
LCLA 伪指令用于定义一个局部的数字变量,并初始化为 0 ;
LCLL 伪指令用于定义一个局部的逻辑变量,并初始化为 F (假);
LCLS 伪指令用于定义一个局部的字符串变量,并初始化为空;
以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。
使用示例:
LCLA Test4 ;声明一个局部的数字变量,变量名为 Test4
Test3 SETA 0xaa ;将该变量赋值为 0xaa
LCLL Test5 ;声明一个局部的逻辑变量,变量名为 Test5
Test4 SETL {TRUE} ;将该变量赋值为真
LCLS Test6 ;定义一个局部的字符串变量,变量名为 Test6
Test6 SETS “ Testing ” ;将该变量赋值为 “ Testing ”
3、 SETA、SETL 和SETS
语法格式:
变量名 SETA ( SETL 或 SETS ) 表达式
伪指令 SETA 、 SETL 、 SETS 用于给一个已经定义的全局变量或局部变量赋值。
SETA 伪指令用于给一个数学变量赋值;
SETL 伪指令用于给一个逻辑变量赋值;
SETS 伪指令用于给一个字符串变