一、什么是汇编语言
汇编语言(Assembly Language)是面向机器的程序设计语言。在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址妈。这样用符号代替机器语盲的二进制码,就把机器语音变成了汇编语言。于是汇编语言亦称为符号语言。
学习汇编语言的第一个步骤,决定在现有环境中使用什么类型的汇编语言。不同的汇编器有使用不同语法格式编写程序语句,不同的处理器使用不同的汇编指令集。
主要学习Linux下的IA-32和ARM汇编
二、处理器指令
所有处理器都按照制造厂商在芯片内部定义的二进制代码操作数据,这些代码定义处理器应该利用程序员提供的数据完成什么功能。这些预置的代码称为指令码(instruction code)
指令指针(introction pointer)用于帮助处理器了解那些指令码已经处理过了,以及接下来要处理的是那条指令。
数据指针(data pointer)用于帮助处理器了解内存中数据区域的起始位置,这个区域被称为堆栈(stack)
IA-32指令码格式
1、指令前缀
指令前缀可以包含1-4个修改操作码行为的1字节前缀,按照前缀的功能,这些前缀被分为4个组,修改操作码时每个组的前缀一次只能使用一个。
- 锁定前缀和重复前缀
- 段覆盖前缀和分支前缀
- 操作数长度覆盖前缀
- 地址长度覆盖前缀
-
锁定前缀表示将独占地使用共享内存区域,重复前缀用于表示重复的功能。
-
段覆盖定义前缀可以覆盖定义了的段寄存器值的指令,分支提示前缀尝试向处理器提供在条件跳转语句中最可能的路径的线索
-
操作数长度覆盖前缀通知处理器,程序将在这个操作码内切换16位和32位的操作数长度
-
地址长度覆盖前缀通知处理器,程序将切换16位和32位的内存地址。这两种长度都可以被声明为程序的默认长度
2、操作码
操作码是IA-32指令格式中唯一必须的部分,它定义由处理器执行的基本功能或者基本任务。
3、修饰符
修饰符定义执行的功能中涉及到什么寄存器和内存位置修饰符包含3个单独的值中:
- 寻址方式说明符字节(ModR/M)
- 比例-索引-基址(SIB)字节
- 1、2或者4个的地址移位字节
ModR/M字节
其中ModR/M字节由3个字段的信息构成
mod字段和r/m字段一起使用,用于定义指令中使用的寄存器或者寻址模式。在指令中,可能的寻址模式有24个,加上8个通用寄存器,共有32个可能的值。
reg/opcode字段用于允许使用更多的3位进一步定义操作码的功能或者可以用于定义寄存器值。
r/m字段用于定义该功能的操作数的另一个寄存器,或者可以把它个mod字段组合在一起定义指令的寻址模式。
SIB字节
SIB也有3个字段的信息构成
- 比例字段确定操作的比例因子。
- 索引字段指定内存访问中用作索引寄存器的寄存器。
- 基址字段指定用作内存访问的基址寄存器的寄存器。
modR/M和SIB字节的组合创建一个表,可以定义用于访问数据的众多可能的寄存器组合和内存模式。
地址移位字节
地址移位字节用来指定对于ModR/M和SIB字节中定义的内存位置的偏移量
4、数据元素
一些指令从内存位置或者处理器寄存器读取数据,而一些指令码在其本身内包含数据,这个值经常被用于表示静态数字值或者内存位置。根据数据长度,这个值可以包含1、2、或者4个字节的信息。
三、汇编语言
汇编语言使用助记符来表示指令
汇编语言程序由三个组件构成:
- 操作码助记符
- 数据段
- 命令
1