- 和其他语言不一样,汇编语言没有统一的编译器,汇编语言的格式随着编译的不同而不同,因此了解什么是汇编语言是学习汇编语言的第一道门槛。
- 首先,我们需要知道汇编语言为什么出现,为了回答这个问题,我们就不得不聊一聊处理器指令。
处理器指令:
在计算机内部,处理器基于芯片制造商内置于芯片内的二进制代码来处理数据,这些代码定义了处理器操作数据的行为。这些代码通常被叫做指令编码,不同的处理器,指令编码也一般不一样。
指令编码:
处理器通过不断读取内存中的指令编码来运行,指令编码包含一个或多个字节的数据用来完成不同的任务,指令编码用到的数据也被处理器读取到内存,本质上指令编码和相关的数据对处理器来说没有什么不同。
为了区分指令编码和数据,我们用指针来区分,指令指针指向要操作的对象,数据指针指向相关的数据。
指令指针总是指向当前要执行的指令。
数据指针用来标识当前内存中程序数据开始的地方,这个区域也称为栈。
指令编码的格式:
这里我们以当前使用比较广泛的IA-32指令编码来说明,指令编码主要包含4个部分:
-
指令前缀(可选)
-
操作码
-
修饰符(可选)
-
数据 (可选)
操作码:
从上面可以看出指令编码中唯一必须的元素就是操作码,他的主要功能是用来完成不同的任务。
指令前缀:
指令前缀的主要功能是修饰操作码,按功能主要分为4种类型:
锁和重复前缀
段重载和分支预测前缀
操作数size重载前缀
地址size重载前缀
修饰符:
一些操作码需要额外的修饰符来指定寄存器或内存的位置
数据:
操作码操作的对象
汇编语言:
汇编语言主要包括3部分:
- 助记符
- 数据区
- 指令
助记符
汇编语言定义的运算符号
数据区
汇编语言主要使用两种方式来定义数据:
- 内存中
- 栈中
栈这种定义数据的方式比较简单,主要通过运算符直接操作
内存定义的方法主要包含两个部分:
- 标签
- 数据类型
testvalue:
.long 150
message:
.ascii "this is a test message"
pi:
.float 3.14159
指令
最终要的指令是 .section 被用来定义段,汇编语言中最重要的3个段:
- 数据段
- 堆栈段
- 文本段