[音乐] 好,我们再来看一看IA-32的指令格式,
IA-32的指令格式比较复杂,它由很多字段组成,有
操作码字段,操作码字段给出操作性质,有寻址方式字段,
有SIB字段,位移字段,我们刚才看到的什么504啊,104啊等等这些位移量,
还有立即数等等,这样的一些字段,这个是用来指出存储器操作数
的,我们刚才看到的那个表当中,如果这个操作数是存储器的话,它有很多寻址方式,
有位移寻址方式,有基址寻址方式,基址加变址
或者基址加变址加位移等等, 这个是存储器操作数的寻址方式,指出来的一些信息,
那么位移量和立即数可以是1个字节,2个字节,4个字节,
位移量也就是说可以是8位的,可以16位的,可以32位的,一个立即数也是这样子,
比如说位移是4个字节,立即数也是4个字节的话,这样就有8个字节,
所以这个指令可能会很长,那么SIB这个字段 实际上是指出这个基址寄存器和变址寄存器
以及比例因子的,所以在这个里面,它给出基址、 变址
这两个寄存器的编号,这个编号是3位的编号,因为它有8个通用寄存器,
它可以是8的通用寄存器当中的任意一个, 8个通用寄存器,那么就可以用3位
来给寄存器进行编号,000一直到111 是0到7这样8个寄存器,
SS是占两位,可以是char型,比如说这个数组元素是 char型的话,
它就没有比例因子,它是1就乘1,然后可以是short型 那么每个数组元素占两个字节的时候,比例因子应该是2,
如果是int 型的,32位的
这样的一个数组元素的话,它的比例因子应该是4, 如果是double
型的,是64位的,比例因子就是8, 所以它一共有4种情况,因此这边有2位就可以了,比如00
表示1,01表示2,10表示4,11表示8,
这四种情况,它用2位表示,这个分别用3位,因为有8个寄存器,所以各用3位,
操作码字段,这边是一个到两个字节,所以操作码可以是
一个字节,可以是两个字节,然后操作码字段这边,除了这个opcode操作码以外,
它还有一个W位和D位这样两个
一共有3个字段,在这个里面它的排列组合可以确定是怎么
操作,而且这个操作的目标,也就是这个操作数的长度是16位的还是32位的,
方向是什么等等,寻址方式就是这边可以有
可以没有,就是这个字段可以有,可以是一个字节,可以没有,
一个字节的时候,它有2位表示寻址方式位,有3位表示寄存器的编号,或者是
操作码的扩展字段,然后是R/M模式位,这个模式位确定它是
寄存器操作数,还是存储器操作数,可以看出IA-32的指令格式是非常复杂的,
我们举个例子,比如说有一条指令,这个 二进制代码,也就是这个机器指令是这样的3个字节,
就是10008,1101D,0000是0,0100是4,
0000是0,0010是2,3个字节的这样的一个机器 指令,对应的汇编指令是这样的格式,它的含义是
这个意思,我们可以看出在这个里面,其中的比例因子是1,这个
1由这两位给出,然后这个是变址寄存器eax,
那么eax实际上是000,我们可以看到它实际上是指出
变址寄存器的编号是000,也就是说用eax作为变址寄存器
然后这个比例因子是1,用00表示,
然后这个是基址寄存器,是010,编号为010的这个寄存器
是edx,这个edx说明是基址寄存器。
所以这是基址寄存器,这是变址寄存器,这个是比例因子, 这三个信息是靠这个SIB
这8位来表示的,这8位就是000000010,
这8位,然后这个字节实际上就是这样的寻址方式,字节,
Mod字段这边的两位是00, 这个三位是000,这三位是100,然后前面的是OP字段,
也就是操作码字段,所以我们可以看出这个机器指令
和汇编指令是一一对应的,实际上 机器执行的时候,是对这样一个0/1序列进行执行的,
因此,我们的机器硬件就是我们的计算机要能识别。
首先要对 指令能够划分,划分出这个是OP字段,这个是Mod字段,
这个是寄存器的编号,这个是R/M这个字段,后面这个是SIB字段,
机器要能够进行正确的划分,这种划分实际上是由OP决定的,
这是指令译码的一些问题,在这一讲里面我们讲了
IA-32的一些基本内容,IA-32 的通用寄存器的组织啊,
还有它的特殊的比如说EFLAGS寄存器,EIP寄存器
以及它的寻址方式,操作数类型等等,可以看出它是一种典型的
复杂指令集计算机,它的指令是非常复杂的,刚才我们看到指令可能会很长,
而且呢,有些字段可以有,可以没有,可以是1个字节,可以2个字节,可以4个字节,
然后每个字段是什么含义呢,还要有另外一个字段来解释, 操作码也可能不一样长,指令也不一样长,所以它是非常复杂的,
所以它是一种复杂指令集计算机,有8个通用的寄存器,
并且可以扩展,从8位扩展到16位,到32位,两个专用寄存器,而有6个段寄存器是间接的
给出段址,它不是直接的,这个段寄存器里面 放的是一个指针,根据这个指针到另外一个地方去取,
取出来的段基址,然后再加上有效地址才能得到无限性地址,
并且它的寻址空间是4个GB,因为它的存储单元的地址是32位的, 2的32次方是等于4个G
然后是按字节编址的,所以它有4G的空间,每一个单元是一个字节,并且是小端方式,
它的寻址方式可以在指令当中直接给出一个操作数,这个我们称为
立即寻址方式,其实在指令当中给出的操作数所在的寄存器的编号
我们称为寄存器寻址方式,可以在指令当中 给出基址寄存器编号,变址寄存器的编号,
比例因子和位移量,给出这样的一些信息,那么,这些信息可以排列组合,可以只给出比-
如说位移 量,或者只给出基址寄存器,只给出变址寄存器,或者某两个组合,某三个组合等等,
那么这样的话,就可以组合成很多不同的寻址方式,这些寻址方式,它得到
的这个操作数都是在存储器里面,所以存储器的寻址方式是比较复杂的,
它的寻址方式一共有这么多种,存储器寻址方式它是用SR来决定,
段基址,然后后面这个就是有效地址,这个有效地址实际上就是一种偏移量,
比如说这个里面这个edx就是基址,eax就是变址寄存器,
S是个比例因子,它是4,位移量是8,这个就是
寄存器寻址方式,那么还有一种特殊的寻址方式是针对指令来说的,
前面的这些都是指操作数,如果执行到某条指令我要跳转到另外一条指令的时候,那么另外一条
指令的地址,我也要能够得到,那么这个地址通常是一种相对寻址方式,
就是用当前的这个指令的地址加上一个位移量,那个跳转可以往后跳,可以往前跳,
这个位移量可以是负的,可以是正的,这样的话就得到 跳转到的那个目标指令的这个地址,这是相对寻址方式,
然后这个指令,它是一种变长指令字,也就是刚才我们讲过的,因为它是一种复杂指令集-
计算机, 所以它的指令的长度是可变的,而且操作码也是可变的,
汇编的格式呢,目前常用的有两种,一种是Intel 的格式,一种是AT&T的格式,我们这个
课程里面主要是用这个AT&T格式,也就是我们刚才给出来的这样一种寄存器前面带百分号-
的这样一种格式, 这一节课我们主要介绍了IA-32的基本的一些内容,
后面可能还会详细的介绍各种不同的指令等等的一些具体的内容。
[音乐]