80x86微机属CISC(复杂指令集计算机),通过上百条的计算机指令实现程序的数据和硬件资源处理,达成软件的应用目的。这一切都基于CPU和存储器数据传输与管理,而这需要CPU能够方便灵活地访问内部存储单元。所以80x86寻址方式是汇编语言的基础与重点。
本章主要内容
& 微机的寻址方式
& 80x86的指令格式
& 80x86的指令系统
& 80x86的多媒体扩展指令
指令的描述有助于说明计算机的CPU。指令格式的确定涉及到指令长度、操作码结构、寻址方式等多方面因素。
一条指令是一个有意义的二进制代码序列,它是机器语言的一个语句,确定了CPU所能完成的功能,是汇编语言进行程序设计的最基本部分。其基本格式为:
[标号:/变量] 指令操作码[操作数1[,操作数2[,操作数3]]] [;注释]
从上面的格式可以看出,操作数是指令或程序的主要处理对象,指令中如何表达操作数是正确运用汇编指令的一个重要因素。在指令中,操作数部分常常并没有直接给出操作的数据,而是给出了寻找操作数的方式,称为寻址方式。机器中操作数据的存放位置有以下3种。
· 操作数据包含在指令中,即指令中的操作数部分就是操作的数据。
· 操作数据在CPU的某个寄存器中。
· 操作数据在内存中,这时指令中的操作数包含寻找操作数据所在地址的信息。
学习寻址方式主要就是学习寻找操作数据所在地址信息的方式。我们知道,CPU内部所应用的内存地址是逻辑地址,即“段地址:偏移地址”,因为段地址通常都采用默认,所以寻址方式就是寻找操作数据偏移地址的方式。
指令系统中每条指令都有唯一确定的操作码。操作码的位数越多,所能表达的操作种类就越多。其编码有两类:规整型和非规整型。
(1)规整型。规整型操作码字段的长度和位置是固定的,又称定长编码,其编码最简单。定长编码多用在大中型计算机上,如IBM 370指令操作码都为8bit(位)。RISC指令集采用定长编码。定长编码有利于简化硬件设计、减少指令译码时间;但往往造成资源浪费(冗余),如8位操作码允许28=256条指令,但IBM 370仅有183条指令。
(2)非规整型。非规整型操作码的长度不定,且分散在指令字的不同位置上,又称变长编码。变长编码广泛用在小型、微型计算机上,如PDP小型机。CISC指令集是非规整型编码。
指令总长度一定,操作码和地址码的各自长度相互制约、此消彼长。因此设计指令系统时,操作数地址个数多(如三地址)的指令操作码短些,操作数地址个数少(如零、单地址)的指令操作码字段长些,这就是扩展操作码法,它是最常用的变长编码方式。扩展操作码法能灵活地充分利用指令的各个字段,在不增加指令长度的情况下,扩展操作码能表示更多的指令。80x86微处理器采用扩展操作码法。
变长编码增加指令译码的难度,控制器的设计较复杂。
每条指令必须包括CPU执行所需的全部信息。对双操作数指令,除了操作码OP(Operate)外,还必须包含:第一源操作数地址A1、第二源操作数地址A2、操作结果的存放地址A3以及下条指令在内存中的存放地址A4。
操作数要包含4个地址,太长也没有必要。实际中程序一般都按指令顺序存放在存储器中,运行程序时用一个程序计数器PC(Program Counter)来指向要执行指令的地址,每取出一个字节指令,PC自动加1指向下一个指令字节的存放地址,遇到转移指令时PC则指向转移目标指令的地址,因此指令中无须给出下条将要执行指令的存放地址。
现代计算机操作数有4种结构:三地址、双地址、单地址和零地址。
(1)三地址指令格式:OP A1 A2 A3。
操作为:[A1] OP [A2]→A3,PC+1→PC(隐含)。三地址指令在小型、微型计算机中很少使用。
(2)双地址指令格式:OP A1 A2。
操作为:[A1] OP [A2]→A1,PC+1→PC(隐含)。执行前,A1和A2中各存放一个源操作数,执行后结果存放到A1中。
[A2]称为源操作数,[A1]称为目标操作数(又称目的操作数)。
(3)单地址指令格式:OP A1。
操作为:[A1] OP REG(隐含)→REG,PC+1→PC(隐含)。单地址指令中只显式地出现一个操作数地址,另一个操作数默认约定、隐含在一个寄存器REG(如累加器A)中;或者该指令只是单目运算,只需要一个操作数:OP [A1]→A1。
(4)零地址指令格式:OP。
对0、1或2个隐含操作数执行OP操作,PC自动加1。零地址指令没有操作数地址,操作码指明该指令所执行的操作,该操作或者不需要操作数,或者其操作数隐含在寄存器中、由地址指针指向的堆栈或存储单元中。
以上隐含的PC+1→PC操作一般重复n次,n为指令的字节长度。
80x86微机属CISC(复杂指令集计算机),其指令系统采用变长指令。
8086/8088指令系统是CISC基本指令集。基本指令集的一条指令长度最短1个字节,最长6个字节。指令中总是用第一个字节表示操作码,第一个字节的最后两位有时还表示操作数的源/目标、字节/字等属性。
第二字节描述指令操作数的寻址方式,或者表示扩展操作码。描述寻址方式时该字节分3段:末3位(D2D1D0)是R/M字段,表示指令中的一个操作数是寄存器(register)还是存储器(memory)操作数以及存储器操作数的寻址方式;中间3位(D5D4D3)是R字段,表示另一个寄存器操作数,3位可表示8个通用寄存器;头两位(D7D6)是方式字段,表示R/M字段是寄存器还是存储器操作数(及其偏移量的大小)。
第三、四字节表示基址或变址寻址中的偏移量。一个字节表示8位偏移量、两个字节表示16位偏移量。
第五、六字节表示立即寻址中的立即数。一个字节表示8位立即数、两个字节表示16位立即数。80x86指令系统在8086/8088基本集基础上不断扩展,并保持向上兼容。随着寻址空间的扩大,操作数不断加长,32位的80486指令长度为1~12个字节。
指令在存储器中连续存放,指令中第一个字节的存放地址称为指令地址。