第3章指令系统及汇编程序.docx
《第3章指令系统及汇编程序.docx》由会员分享,可在线阅读,更多相关《第3章指令系统及汇编程序.docx(38页珍藏版)》请在冰豆网上搜索。
第3章指令系统及汇编程序
第3章指令系统及汇编程序
引入:
指令系统和寻址方式是计算机系统的主要组成部分。
凡是能够在计算机系统上直接运行的目标程序都是由指令组成的。
指令系统是计算机系统中软件与硬件之间的一个主要分界面,也是他们之间互相沟通的桥梁。
对于软件设计人员,学习通用计算机系统的指令系统和寻找方式是非常重要的。
只有对指令系统和寻址方式有比较系统和深入的了解,才能设计出高水平的程序,特别是系统程序。
本章知识要点:
1)指令和指令系统的概念
2)几种寻址方式
3)指令的种类
4)汇编程序的指令系统和设计过程
3.1指令和指令系统概述
3.1.1指令和指令系统的概念
指令:
微处理器的每一条基本操作或运算称为一条指令,是计算机用以控制各部件协调动作的命令。
指令系统:
计算机之所以能脱离人的直接干预自动地完成某项既定操作,是靠执行预先存入在计算机内存中的一条条指令来完成的。
不同的计算机具有各自不同指令,对某种特定的计算机而言,其所有指令的集合称为该计算机的指令系统。
指令系统的特点:
一个微处理器的指令系统是设计微处理器时决定的,成为微处理器固有的功能。
指令系统所能完成的功能的强弱,是这种微处理器功能强弱的具体表现。
因此指令系统是表征一台计算机性能的重要因素,它的格式与功能不仅直接影响到机器的硬件结构,而且也影响到系统软件。
3.1.2指令的一般格式
指令是由操作码和地址码两部分组成的,其基本格式如图3-1所示。
操作码字段
地址码字段
图3-1指令的格式
一、操作码字段
操作码是用来指明该指令所要完成的操作,如加法、减法、传送、移位、转移等等。
通常,其位数反映了机器的操作种类,也即机器允许的指令条数,如操作码占7位,则该机器最多包含27=128条指令。
操作码的长度可以是固定的,也可以是变化的。
前者将操作码集中放在指令字的一个字段内,如上图所示。
这种格式便于硬件设计,指令译码时间短,广泛用于字长较长的、大中型计算机和超级小型计算机以及RISC(ReducedInstructionSetComputer)中。
如IBM370和VAX—11系列机,操作码长度均为8位。
操作码长度不固定的指令,其操作码分散在指令字的不同字段中。
这种格式可有效地压缩操作码的平均长度,在字长较短的微机中被广泛采用。
如PDP-11,Intel8086/80386等,操作码的长度是可变的。
操作码长度不固定会增加指令译码和分析的难度,使控制器的设计复杂。
通常采用扩展操作码技术,使操作码的长度随地址数的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。
二、地址码字段
地址码用来指出该指令的源操作数的地址(一个或两个)、结果的地址以及下一条指令的地址。
这里的地址可以是主存的地址,也可以是寄存器的地址,甚至可以是I/O设备的地址。
根据地址码部分给出的地址个数,指令分为以下几种:
(1)零地址指令
零地址指令在指令字中无地址码,格式如图3-2所示。
如进栈(PUSH)、出栈(POP)这类指令,其操作数的地址隐含在堆栈指针SP中。
OP
图3-2零地址指令
(2)一地址指令
一地址指令的地址码字段只有一个,如果将一个操作数的地址隐含在运算器的ACC中,则指令字中只需给出一个地址码,构成了一地址指令。
其格式如图3-3所示。
OP
A1
图3-3一地址指令
它可完成(ACC)OP(A1)→ACC的操作,ACC既存放参与运算的操作数,又存放运算的中间结果,这样,完成一条一地址指令只需两次访存。
在指令字长仍为32位、操作码位数仍固定位8位时,一地址指令可直接寻址的范围达224,即16M。
(3)二地址指令
二地址指令中只含两个地址字段,其格式如图3-4所示。
OP
A1
A2
图3-4二地址指令
它可完成(A1)OP(A2)→A1的操作,即A1字段既代表源操作数的地址,又代表存放本次运算结果的地址。
有的机器也可以表示(A1)OP(A2)→A2的操作,此时A2除了代表操作数源地址外,还代表中间结果的存放地址。
这两种情况完成一条指令仍需访问四次存储器。
如果使其完成(A1)OP(A2)→ACC,此时,它完成一条指令只需三次访存,它的含义是中间结果暂存于累加器ACC中。
在不改变指令字长和操作码的位数前提下,二地址指令可直接寻访的主存地址数为212=4K。
(4)三地址指令
三地址指令中只有三个地址,其格式如图4-5所示。
OP
A1
A2
A3
图3-5一地址指令
它可完成(A1)OP(A2)→A3的操作,这种指令的地址隐含在程序计数器PC之中。
如果指令字长不变,设OP仍为8位,则三个地址字段各占8位,故三地址指令直接寻址范围可达28=256。
同理,若地址字段均为主存地址,则完成一条三地址指令也需访问四次存储器。
(5)多地址指令
有多个操作数存放的地址,微型机上很少使用这种指令。
3.2寻址方式
3.2.1寻址方式、有效地址的概念
操作数可能在指令中、在寄储器中、在寄存器中。
通过寻址来确定本条指令数据的地址及下一条要执行指令的地址,称寻址方式。
寻址方式主要用于汇编语言及高级语言的编译程序中,高级语言一般不用。
不同系列的计算机其寻址方式不相同,但基本原理差不多
表示在指令中的操作数地址,通常被称为形式地址;用这种形式地址并结合某些规则,可以计算出操作数在存储器中的存储单元地址,这一地址被称为数据的物理(有效)地址。
寻址方式与硬件结构紧密相关,而且也直接影响指令格式和指令功能。
3.2.2常见的几种寻址方式
8086/8088提供了8种寻址方式,它们是立即数寻址方式、寄存器寻址方式、直接寻址方式、间接寻址方式、变址寻址方式、基址寻址方式、基址加变址寻址方式和带有移位量的基址加变址寻址方式。
80x86/Pentium有11种寻址方式,与8086/8088相比增加了比例变址寻址方式、基址加比例变址寻址方式和带位移量的基址加比例变址寻址方式。
一、立即数寻址
操作数直接给出在指令字中,即指令字中直接给出的不再是操作数地址,而是操作数本身。
它的主要用法是把一个确定的数据传送到一个通用的寄存器中。
该寻址方式常用来给寄存器赋初址,指令执行速度快。
如:
MovAx,1680H
图3-6立即数寻址
二、寄存器寻址
在寄存器寻址方式中,操作数放在寄存器中,在指令中直接以寄存器的名字来表示操作数的地址。
例如MOVA,R0就属于寄存器寻址,即将R0寄存器的内容送到累加器A中。
三、直接寻址
直接寻址是指在指令的操作数地址字段直接给出操作数在存储器中的地址,即指令的地址码就是操作数的有效地址。
这也是计算机中常用的寻址方式之一,是一种针对于内存的寻址方式。
如:
MovAx[1680H]
图3-7直接寻址
四、间接寻址
(1)寄存器间址:
若指令指定一个寄存器,则寄存器的内容为操作数在存储器中的地址。
这种方式为寄存器间址,程序员必须保证操作数地址必须已经放入寄存器中。
如:
MovAx,[Bx]
为寄存器间址方式:
把Bx寄存器中的中的内容作为地址,把该地址段所指的存储器单元的内容放入BX。
(2)存储器间址:
指令给出一个存储器的地址,该地址所指的单元存放的是操作数的地址。
再如:
JUMP(A1)将A1的内容作为地址
存储器间址:
把A1的内容A2作为操作数的地址。
五、变址寻址
操作数的有效地址是变址寄存器(DI,SI)中的内容加上指令中给出的地址(称为变址偏移量),又称变址+位移量寻址,这是一种最常用的寻址方式,用于读写存储器,用于字符串处理指令中。
如:
MovAx,[DI+0168H]
图3-8变址寻址
六、基址寻址
操作数的有效地址是基址寄存器的内容加上指令中给出的地址(又称位移量)(又称基址加位移量的寻址)。
如:
MovAx,[Bx+0168H]
图3-9基址寻址
七、基址加变址寻址
操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)和一个变址寄存器(SI,DI)的内容之和。
在不使用段超越前缀的情况下,有下列规定:
若有效地址用SI,DI和BX等之一来指定,则其缺省的段寄存器为DS;
若有效地址用BP来指定,则其缺省的段寄存器为SS(即:
堆栈段)。
如:
MOVAX,[BX+SI]
执行指令前:
(DS)=3200H,(BX)=0456H,(SI)=1094H,(334EAH)=4567H
执行指令后:
EA=14EAH,PA=334EAH,(AX)=4567H
八、带有位移量的基址加变址寻址
操作数有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和。
除有段跨越前缀之外,形成物理地址有二种方式:
例:
MOVAX,MASK[BX][DI]
MOVAX,MASK[BX+DI]
MOVAX,[MASX+BX+DI]
执行指令前:
(DS)=3000H,(BX)=1346H,(DI)=0500H,MASK=1234H,(32A7AH)=4050H
执行指令后:
EA=2A7AH,PA=32A7AH,(AX)=4050H
九、比例变址寻址方式
操作数的有效地址为[变址寄存器]×比例因子+位移量。
其中乘以比例因子的操作在CPU内部由硬件完成。
十、基址加比例因子变址寻址方式
操作数的有效地址为[基址寄存器]+[变址寄存器]×比例因子。
十一、带位移量的基址加比例变址寻址方式
操作数的有效地址为[基址寄存器]+[变址寄存器]×比例因+位移量。
在寻址过程变址寄存器内容乘以比例因子的操作在CPU内部由硬件完成。
3.3指令的种类
计算机的功能主要取决于指令系统的功能,为了满足计算机功能上的需要,现代计算机都有上百条甚至几百条指令,下面将详细介绍这些指令。
8086/8088的指令系统是80x86/Pentium的基本指令集。
8086/8088的指令按功能可以分为六类:
数据传送指令,算术运算指令,逻辑运算与移位指令、字符串处理指令、控制转移以及处理器控制指令。
下面仅这几种指令加以介绍。
3.3.1数据传送指令
数据传送指令用于实现通用寄存器之间、通用寄存器与内存储器存储单元之间、内存储器不同存储单元之间、通用寄存器与外围设备(接口)之间(有些场合也可以单独划分为输入/输出指令)的数据传送功能。
从内存储器和外围设备(接口)操作性质的不同,又可以区分为读和写两种操作,它指明数据传送的方向。
一、通用数据传送指令
MOV(Move)传送
PUSH(Pushontothestack)进栈
POP(Popfromthestack)出栈
XCHG(Exchange)交换
(1)MOV指令
格式为:
MOVDST,SRC
执行的操作:
(DST)<-(SRC)
(2)PUSH进栈指令
格式为:
PUSHSRC
执行的操作:
(SP)<-(SP)-2((SP)+1,(SP))<-(SRC)
(3)POP出栈指令
格式为:
POPDST
执行的操作:
(DST)<-((SP+1),(SP))
(SP)<-(SP)+2
(4)XCHG交换指令
格式为:
XCHGOPR1,OPR2
执行的操作:
(OPR1)<-->(OPR2)
二、累加器专用传送指令
IN(Input)输入
OUT(Output)输出
XLAT(Translate)换码
这组指令只限于使用累加器AX或AL传送信息。
(1)IN输入指令
长格式为:
INAL,PORT(字节)INAX,PORT(字)
执行的操作:
(AL)<-(PORT)(字节)
(AX)<-(PORT+1,PORT)(字)
短格式为:
INAL,DX(字节)INAX,DX(字)
执行的操作:
AL<-((DX))(字节)AX<-((DX)+1,DX)(字)
(2)OUT输出指令
长格式为:
OUTPORT,AL(字节)OUTPORT,AX(字)
执行的操作:
(PORT)<-(AL)(字节)
(PORT+1,PORT)<-(AX)(字)
短格式为:
OUTDX,AL(字节)OUTDX,AX(字)
执行的操作:
((DX))<-(AL)(字节)
((DX)+1,(DX))<-AX(字)
在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号。
所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口。
当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息。
(3)XLAT换码指令
格式为:
XLATOPR
或:
XLAT
执行的操作:
(AL)<-((BX)+(AL))
三、有效地址送寄存器指令
LEA(Loadeffectiveaddress)有效地址送寄存器
LDS(LoadDSwithPointer)指针送寄存器和DS
LES(LoadESwithPointer)指针送寄存器和ES
(1)LEA有效地址送寄存器
格式为:
LEAREG,SRC
执行的操作:
(REG)<-SRC
指令把源操作数的有效地址送到指定的寄存器中。
LDS指针送寄存器和DS指令
(2)格式为:
LDSREG,SRC
执行的操作:
(REG)<-(SRC)(DS)<-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中。
该指令常指定SI寄存器。
(3)LES指针送寄存器和ES指令
格式为:
LESREG,SRC
执行的操作:
(REG)<-(SRC)(ES)<-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中。
该指令常指定DI寄存器。
四、标志寄存器传送指令
LAHF(LoadAHwithflags)标志送AH
SAHF(storeAHintoflags)AH送标志寄存器
PUSHF(pushtheflags)标志进栈
POPF(poptheflags)标志出栈
(1)LAHF标志送AH
格式为:
LAHF
执行的操作:
(AH)<-(PWS的低字节)
(2)SAHFAH送标志寄存器
格式为:
SAHF
执行的操作:
(PWS的低字节)<-(AH)
(3)PUSHF标志进栈
格式为:
PUSHF
执行的操作:
(SP)<-(SP)-2((SP)+1,(SP))<-(PSW)
(4)POPF标志出栈
格式为:
POPF
执行的操作:
(PWS)<-((SP)+1,(SP))(SP)<-(SP+2)
3.3.2算术运算指令
是每台计算机都必须具有的指令,它通常用于在计算机的运算器部件中完成对一或两个数据的算术运算。
一、加法指令
ADD(add)加法
ADC(addwithcarry)带进位加法
INC(increment)加1
(1)ADD加法指令
格式:
ADDDST,SRC
执行的操作:
(DST)<-(SRC)+(DST)
(2)ADC带进位加法指令
格式:
ADCDST,SRC
执行的操作:
(DST)<-(SRC)+(DST)+CF
ADD加1指令
格式:
INCOPR
执行的操作:
(OPR)<-(OPR)+1
二、减法指令
SUB(subtract)减法
SBB(subtractwithborrow)带借位减法
DEC(Decrement)减1
NEG(Negate)求补
CMP(Compare)比较
(1)SUB减法指令
格式:
SUBDST,SRC
执行的操作:
(DST)<-(DST)-(SRC)
(2)SBB带借位减法指令
格式:
SBBDST,SRC
执行的操作:
(DST)<-(DST)-(SRC)-CF
(3)DEC减1指令
格式:
DECOPR
执行的操作:
(OPR)<-(OPR)-1
(4)NEG求补指令
格式:
NEGOPR
执行的操作:
(OPR)<--(OPR)
(5)CMP比较指令
格式:
CMPOPR1,OPR2
执行的操作:
(OPR1)-(OPR2)
三、乘法指令
MUL(UnsignedMultiple)无符号数乘法
IMUL(SignedMultiple)带符号数乘法
MUL无符号数乘法指令
格式:
MULSRC
执行的操作:
字节操作数:
(AX)<-(AL)*(SRC)
字操作数:
(DX,AX)<-(AX)*(SRC)
IMUL带符号数乘法指令
格式:
IMULSRC
执行的操作:
与MUL相同,但必须是带符号数,而MUL是无符号数。
四、除法指令
DIV(Unsigneddivide)无符号数除法
IDIV(Signeddivide)带符号数除法
CBW(Convertbytetoword)字节转换为字
CWD(Contertwordtodoubleword)字转换为双字
(1)DIV无符号数除法指令
格式:
DIVSRC
执行的操作:
字节操作:
(AL)<-(AX)/(SRC)的商(AH)<-(AX)/(SRC)的余数
字操作:
(AX)<-(DX,AX)/(SRC)的商(AX)<-(DX,AX)/(SRC)的余数
(2)IDIV带符号数除法指令
格式:
DIVSRC
执行的操作:
与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同。
(3)CBW字节转换为字指令
格式:
CBW
执行的操作:
AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH。
(4)CWD字转换为双字指令
格式:
CWD
执行的操作:
AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH。
3.3.3逻辑运算与移位指令
为处理字节或字中各位的信息,8086/8088提供了两组位处理指令:
逻辑运算指令和移位指令。
一、逻辑运算指令
如下表,所有的指令都对起操作数按位进行操作,操作数可以是字节或字。
目标不能是立即数;当有两个操作数时,则两个操作数不能同时是存储器操作数;无论是目的操作数还是源操作数都不能是段寄存器。
NOT指令性不影响任何标志位,其它指令执行后,总是使OF=CF=0,SF,ZF和PF根据运算结果置位或复位,以反映操作结果的特征,而AF状态不定。
名称
操作码(助记符)
操作数
举例
“非”
NOT
目标
NOTAX
“与”
AND
目标,源
ANDAL,0F0H
“或”
OR
目标,源
ORBL,AL
“异或”
XOR
目标,源
XORBX,BX
“测试”
TEST
目标,源
TESTAX,1000000B
二、移位与循环移位指令
8086/8088的位处理指令中有8条移位与循环指令。
看图移位指令有算术移位与逻辑移位,算术与逻辑左移的操作完全相同,但逻辑右移的目标操作数的左端移入0,而算术右移则保持目标操作数的符号位(即最高有效位)不变。
循环指令有不通过进位位与通过进位位的循环指令,通过进位位的循环指令把CF标志作为目标操作数的扩展,参与循环操作。
和移位指令不同之处是:
循环移位时移出的目标操作数位并不丢失,而是循环送回目标操作数的另一端。
(1)非循环移位指令
算术左移指令SAL(ShiftArithmeticLeft)
算术右移指令SAR(ShiftArithmeticRight)
逻辑左移指令SHL(ShiftLeft)
逻辑右移指令SHR(ShiftRight)
(2)循环移位指令
不含进位位的循环左移指令ROL
不含进位位的循环右移指令ROR
含进位位的循环左移指令RCL
含进位位的循环右移指令RCR
3.3.4字符串处理指令
串:
顺序放在内存中的一组相同类型的数据。
串操作:
对串中的元素进行相同的操作。
串操作的寻址方式有:
源操作数指针———DS:
SI(DS可超越)
目的操作数指针——ES:
DI
每次串操作后,串操作指令自动修改SI和DI——字节±1,字±2。
DF标志决定±.(注意:
退出串操作后,指针指向最后操作的元素的下一个元素)。
一、重复前缀
有的串操作指令前面可加上重复前缀REP。
当使用REP前缀时,该指令重复执行,重复执行次数由CX决定(带有REP前缀的串操作指令每执行一次,CX自动减1)。
重复前缀包括:
REPCX≠0时重复执行
REPE/REPZCX≠0∧ZF=1时重复执行
REPNE/REPNZCX≠0∧ZF=0时重复执行
二、基本串操作指令
(1)串传送指令MOVSB/MOVSW
指令执行的操作为:
MOVSB:
((ES):
(DI))←((DS):
(SI))
SI±1,DI±1
MOVSW:
((ES):
(DI+1)(DI))←((DS):
(SI+1)(SI))
SI±2,DI±2
例:
用串传送指令实现200个字节的数据传送:
LEASI,MEM1
LEADI,MEM2
MOVCX,200
CLD
REPMOVSB
HLT
(2)串比较指令CMPSB/CMPSW
指令执行的操作为:
CMPSB:
((DS):
(SI))-((ES):
(DI))
SI±1,DI±1
CMPSW:
((DS):
(SI+1)(SI))-((ES):
(DI+1)(DI))
SI±2,DI±2
(3)串扫描SCASB/SCASW
执行的操作:
对字节:
(AL)-((ES):
(DI))
DI±1
对字:
(AX)-((ES):
(DI+1)(DI))
DI±2
搜索指令执行的仍是比较(减法)操作,结果只影响标志位,要搜索的关键字放在AL(字节)或AX(字)中。
本指令用于在串中查找指定的信息。
(4)串装入指令LODSB/LODSW
执行的操作为:
对字节:
(AL)←((DS):
(SI))
SI±1
对字:
(AX)←((DS):
(SI+1)(SI))
SI±2
串装入指令通常不加重复前缀。
(5)串存储指令STOSB/STOSW
指令的操作为:
对字节:
((ES):
(DI))←(AL)
DI±1
对字:
((ES):
(DI+1)(DI))←(AX)
DI±2
本指令用于把一块存储区域填充成某一初始值(即对存储区进行初始化)。
存储区域的首地址要预先设置到ES:
DI中,存储到串中的数据要预先存到AL(AX)中
例:
把从A000H开始的2KB内存单元清零。
程序段如下:
MOVDI,0A000H
MOVAX,0
MOVCX,1024
CLD
REPSTOSW
3.3.5控制转移指令
控制转移指令用来控制程序执行的顺序,通过控制转移指令可以实现各种结构化程序设计,如分之结构程序、循环结构程序等。
8086/8088有四类控制转移指令:
转移指令,包括无条件转移和条件转移指令。
重复控制指令。
调用和返回指令。
中断指令。
8086/8088使用CS段寄存器和IP指令指针寄存器的值来寻址,以取指令来执行