1.08k likes | 1.25k Vues
第四章 微型机算机指令系统. 8086/8088 的指令格式及寻址方式 8086/8088 的指令系统 简单的汇编语言程序设计. 指令 是指示计算机完成特定操作的命令。 指令系统 是计算机能够执行全部命令的集合,它取决于计算机的硬件设计。指令系统因机而异,没有通用性。. §4.1 指令格式及寻址方式. 操作码 操作数. 指令格式. 微型计算机的指令由操作码 (OP) 和操作数两部分组成,如图所示。 操作码部分决定指令的操作类型 操作数部分可以是指令所需的操作数,也可以是操作数的地址或关于操作数地址的其他信息。. 指令格式.
E N D
第四章 微型机算机指令系统 • 8086/8088的指令格式及寻址方式 • 8086/8088的指令系统 • 简单的汇编语言程序设计 指令是指示计算机完成特定操作的命令。指令系统是计算机能够执行全部命令的集合,它取决于计算机的硬件设计。指令系统因机而异,没有通用性。
操作码 操作数 指令格式 • 微型计算机的指令由操作码(OP)和操作数两部分组成,如图所示。 • 操作码部分决定指令的操作类型 • 操作数部分可以是指令所需的操作数,也可以是操作数的地址或关于操作数地址的其他信息。
指令格式 • 指令在机器中用若干位二进制数表示。 • 8086/8088指令为1-6个字节。第1个字节和第2个字节(部分位)表示操作码,其余为指令的操作数。 • 操作数根据指令的不同有所区别,通常一条指令包含一个或两个操作数,前者称为单操作数指令,后者称为双操作数指令。 • 双操作数分别称为源操作数(SRC)和目的操作数(DST)。
指令格式 • 机器语言: • 指令的二进制编码称为机器码(MachineCode)。用指令的机器码直接来编制用户程序,称为机器语言。 • 缺点:没有明显的特征不好记忆,不易理解,易出错。编程序成为一种十分困难十分繁琐的工作。 • 汇编语言: • 用一些助记符来代替操作码(如数的传送指令用助记符MOV,加法用ADD,转移用JMP)。用这些指令的助记符和代表操作数的符号来编写用户源程序就是汇编语言。 • 优点:每条指令有明显的特征,易于理解和记忆,也不易出错。
8086/8088的寻址方式 • 计算机可以对存储器、寄存器中的数据进行各种操作,如取数、存数、加运算、减运算等,这就需要找到数据的存放地址,再对其中的数据执行相应的操作,最后将运算结果送往指定的地址单元或寄存器。 • 指令的寻址方式就是寻找指令操作数所在地址的方式,以确定数据的来源和去处。 • 熟练地掌握寻址方式对学习指令系统和汇编语言程序设计具有重要作用。
8086/8088的寻址方式 8086/8088支持如下6种寻址方式: • 立即寻址 • 直接寻址 • 寄存器寻址 • 寄存器间接寻址 • 变址寻址 • 基址加变址寻址
立即寻址 (Immediate Addressing) • 此方式中指令操作数部分直接给出指令的操作数,它与指令操作码相接,顺序存放在代码段中。立即数可以是8位也可以是16位 • 示例: • MOV AH,36H ;(AH)←立即数36H • MOV BX,1234H ;(BX)←立即数1234H
立即寻址 (Immediate Addressing) • 说明: • 立即数寻址方式只能用于源操作数,主要用于给寄存器赋值。 • 立即数寻址方式不执行总线周期,执行速度快。 • 立即数为16位时,低位字节存放在存储器低地址单元,高位字节存放在存储器高地址单元。
直接寻址 (Direct Addressing) • 操作数在存储器中,指令中直接给出操作数所在存储单元的有效地址(EA) ,也称为偏移地址,它代表操作数所在存储单元距离段首地址的字节数。有效地址是一个无符号的16位二进制数。 • 示例: MOV AH,[2100H] ;将DS段中2100H单元的内容送给AH MOV AH,AUGEND ;当AUGEND等于2100H时操作同上 MOV AX,[2100H) ;将DS段中2100H单元的内容送给AL ;2101H单元的内容送给AH
直接寻址 (Direct Addressing) • 说明: • 直接寻址方式的操作数所在存储单元的段地址一般在数据段寄存器DS中。 • 如果操作数在其他段,则需要在指令中用段超越前缀指出相应的段寄存器名。 • AUGEND是一种符号表示法,此内容将在伪指令中给予讲解。 例:MOV AX,ES:[2000H] ;将附加段寄存器ES的内容乘16,再加上2000H作为操作数所在存储单元的地址,取出该存储单元的内容送到寄存器AX中。
寄存器寻址 (Register Addressing) • 此方式的操作数放在寄存器内,由指令直接给出某个寄存器的名字,以寄存器的内容作为操作数。寄存器可以是16位的AX、BX、CX、DX、SI、DI、SP、BP寄存器,也可以是8 位的AH、AL,BH、BL、CH、CL、DH、DL寄存器。 • 示例: MOV AX,CX ;(AX)←(CX) DEC AL ;(AL)←(AL)-l MOV DS,AX ;(DS)←(AX)
寄存器寻址 (Register Addressing) • 说明: • 寄存器寻址方式的指令操作在CPU内部执行,不需要执行总线周期,执行速度快。 • 寄存器寻址方式既适用于指令的源操作数,也适用于目的操作数,并且可同时用于源操作数和目的操作数。
寄存器间接寻址(Register Indirect Addressing) • 操作数在存储器中,指令中寄存器的内容作为操作数所在存储单元的有效地址。寄存器可以是某个基址寄存器BX、BP,或某个变址寄存器SI、DI。 • 操作数有效地址为: EA={(BX)|(BP)|(SI)|(DI)} • 物理地址的计算方法为: 物理地址=16X(DS)+(BX|SI|DI) 物理地址=16X(SS)+(BP) (寄存器为BP)
寄存器间接寻址(Register Indirect Addressing) • 示例: 已知:(DS)=2100H, (DI)=2000H 指令:MOV AX,[DI] ;(AX)←((DI)) 物理地址=16X(DS)+(DI)=16X2100H+2000H=23000H 指令执行结果是将23000H和23001H单元的内容送人寄存器AX中。 • 注意:如果操作数所在存储单元不在数据段中,需要在指令中用段超越前缀表明其所在段的段名。
变址寻址 (Index Addressing) • 操作数在存储器内,指令中寄存器的内容与指令指定的位移量(DISP)之和作为操作数所在存储单元的有效地址。寄存器可以是基址寄存器BX、BP,也可以是变址寄存器SI、DI。位移量是一个8位(DISP8)或16位(DISPl6)的带符号数。 • 有效地址EA的计算方法为: EA={(BP)|(SP)|(SI)|(DI)}+(DISP8|DISP16}
变址寻址 (Index Addressing) • 物理地址计算方法: 物理地址=16X(DS)+(SI|DI|BX)+DISP 物理地址=16X(SS)+(BP)+DISP • 示例: 已知:(DS)=3000H,(SI)=2000H, DAl=3000H(16位位移量) 指令: MOV AX,DAl[SI) 或 MOV AX,[DAl+SI] 物理地址=16X(DS)+(SI)+DISPl6 =30000H+2000H+3000H=35000H 执行结果是将35000H和35001H单元的内容送入寄存器AX中。
基址加变址寻址 • 操作数在存储器内,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)内容之和再加上位移量作为操作数所在存储单元的有效地址EA。 • EA的计算方法为: EA={(BX)|(BP)}+{(SI)|(DI)}+{DISP8|DISP16} • 物理地址计算方法为: 当使用基址寄存器BX时,段寄存器为DS 物理地址=16X(DS)+(BX)+(SI|DI)+DISP 当使用基址寄存器BP时,段寄存器为SS 物理地址=16X(SS)+(BP)+(SI|DI)+DISP
基址加变址寻址 • 示例: 已知:(DS)=3000H,(BX)=2000H, (SI)=1000H,MASK=0250H 指令:MOV AX,MASK [BX][SI] 或 MOV AX,MASK+[BX+SI] 有效地址: EA=(BX)+(SI)+DISP=2000H+1000H+0250=3250H 物理地址=16X(DS)+EA=30000H+3250H=33250H 执行结果将33250H单元的内容送人寄存器AL中.将33251H单元的内容送人寄存器AH中.
§4.2 8086/8088的指令系统 8086/8088指令系统共有133种基本指令,按功能可分为数据传送类,算术运算类、逻辑运算与移位类、串操作类、控制转移类、处理机控制类等六大类。
数据传送指令 • 数据传送类指令实现CPU内部寄存器之间、CPU与存储器之间、CPU与I/O端口之间的数据传送。 • 数据传送类指令又可分为以下类别: • 通用传送指令 • 累加器专用传送指令 • 堆栈操作指令 • 地址传送指令 • 标志寄存器传送指令
通用传送指令 • 传送指令 指令格式:MOV DST,SRC;(DST)←(SRC) 其中SRC表示源操作数,DST表示目的操作数 • ①累加器和存储器单元之间的传送 MOV mem,ac ; (mem)←(ac) MOV ac,mem ; (ac)←(mem) 其中mem代表存储器单元,ac代表累加器。 [例] MOV [2100H],AL ;(2100H)←(AL。) MOV AX,[2lOOH] ; (AX)←(2100H),(2101H)。
通用传送指令 • ②通用寄存器之间的传送 MOV reg1,reg2 ;(reg1)←(reg2) regl,reg2代表寄存器 [例] MOV AH,AL :(AH)←(AL) MOV DI,AX ;(DI)←(AX) • ③通用寄存器和存储器单元之间的传送 MOV reg,mem ;(reg)←(mem) MOV mem,reg ;(mem)←(reg) [例] MOV CL,[2300H] ; (CL)←(2300H) MOV [BX],DH ;((BX))←(DH)
通用传送指令 • ④立即数传送 MOV reg,data ;(reg)←data data代表立即数 MOV mem,data ;(mem)←data [例] MOV SI,2233H ;(SI)←2233H • ⑤段寄存器和通用寄存器之间的传送 MOV reg,segreg ;(reg)←(segreg) MOV segreg,reg ;(segreg)←(reg) segreg代表段寄存器 [例] MOV AX,ES ; (AX)←(ES) MOV DS,BX ; (DS)←(BX)
通用传送指令 • ⑥段寄存器和存储器单元之间的传送 MOV segreg,mem ;(segreg)←(mem) MOV mem,segreg ;(reg)←(segreg) [例] MOV ES,[2300H) ;(ES)←(2300H),(230lH) MOV [2302H],DS ;(2302H),(2303H)←(DS)
通用传送指令 • 有关传送指令的注意事项: • MOV指令的两个操作数(源、目的)均可采用不同的寻址方式,但是必须有一个为寄存器。 • MOV指令可以传送8位或16位的数据,但是必须与8位或16位寄存器相对应。 • 不允许把立即数作目的操作数,也不允许向段寄存器送立即数。 • 不允许在段寄存器之间、存储器单元之间传送数据。 • 不能把寄存器CS、IP用作目的操作数,不能随意改变他们的内容。 • 通用传送指令不影响标志位。
通用传送指令 交换指令 • 指令格式:XCHC OPR1,OPR2 ;(OPR1)(OPR2) • 功能:实现两个操作数内容(8或16位)的互换。 • 说明: • 两个操作数不能为段寄存器或立即数,并且不能同时为存储器操作数。 • CS、IP寄存器的内容不能交换。
通用传送指令 • [例] • 指令:XCHG AH,AL ;(AH)(AL) • 已知:(BX)=1122H,(BP)=0123H,(DI)=0078H, (SS)=2200H,(2219BH)=3344H 指令:XCHG BX,[BP+D1] 源操作数的物理地址=16X(SS)+(BP)+(DI) =22000H+0123H+0078H=2219BH 指令执行结果为:(BX)=3344H,(2219BH)=1122H。
堆栈操作指令 • 堆栈是按“先进后出”原则工作的一段存储器区域。8086/8088系统中,堆栈位于堆栈段,其段地址由SS寄存器指示。堆栈操作还与堆栈指针寄存器SP有关,SP的内容始终为当前栈顶所在的存储单元地址,栈顶将随进栈或出栈操作而变化。 • 指令格式: • 进栈 PUSH SRC ;(SP)←(SP)-2,((SP)+1,(SP))←(SRC) • 出栈 POP DST ;(DST)←((SP)+1,(SP))、(SP)←(SP)+2
堆栈操作指令 • [例] 已知:(AX)=1122H,(BX)=3344H,(SP)=1010H 执行指令: PUSH AX ;(SP)←100EH,(100FH)←11H,(100EH)←22H PUSH BX ;(SP)←100CH,(100DH)←33H,(100CH)←44H POP AX ;(AX)←(100DH,100CH),(SP)←100EH POP BX ;(BX)←(100FH,100EH),(SP)←1010H 执行结果: (AX)=3344H,(BX)=1122H,(SP)=1010H
堆栈操作指令 • 堆栈操作注意事项: • 8086堆栈操作必须是字数据。 • 源操作数SRC、目的操作数DST,可以是存储器、寄存器或段寄存器,但是不能将数据弹至段寄存器CS。 • 堆栈操作可以用于数据的暂存与恢复、子程序返回地址及中断断点地址的保护与返回。 • 堆栈操作指令不影响状态标志位。
累加器专用传送指令 • 以累加器为中心,实现数据的输入/输出和换码操作。 • 输入/输出(I/O)指令:实现I/O端口与CPU之间的数据传送。输入/输出指令按长度分为长格式和短格式: • 长格式指令代码为2个字节,第二字节用PORT表示端口号,它指定的端口地址范围是00至FFH。 • 短格式指令代码为1个字节,它指定的端口地址范围是0000至 FFFFH。短格式指令必须将端口地址放入寄存器DX中。
累加器专用传送指令 • 用输入指令完成从输入端口到CPU的数据传送 • 指令格式: • 长格式 IN AL,PORT ;(AL)←(PORT) . IN AX,PORT :(AX)←(PORT+1,PORT) • 短格式 IN AL,DX ;(AL)←((DX)) 1N AX,DX ;(AX)←((DX)+1,(DX))
累加器专用传送指令 • 用输出指令完成从CPU到输出端口的数据传送 • 指令格式: • 长格式 OUT PORT,AL ;(PORT)←(AL) OUT PORT,AX :(PORT+1,PORT) ←(AX) • 短格式 OUT DX,AL ;((DX))←(AL) OUT DX,AX ;(DX)+1,(DX)) ←((AX)
累加器专用传送指令 • [例] IN AL,09 ;(AL)←09号端口的内容 OUT (40H),AL ;(40H)←(AL) MOV DX,0600H ;(DX)←0600H OUT DX,AX ;(0601H,0600H)←(AX) • 注意: • 输入/输出指令只能使用累加器AL或AX接收或发送数据。 • 使用短格式指令,必须将端口地址放人寄存器DX中。 • 输入/输出指令不影响标志位。
累加器专用传送指令 • 换码指令(查表转换指令): 该指令通过查表完成所需要的代码转换。 • 指令格式:XLAT OPR ;(AL)←((BX)+(AL)) 或XLAT • [例]已知:(DS)=E000H, (BX)=0030H,(AL)=01 数据表:(E0030H)=30H,(E0031H)=31H,(E0032H)=32H 指令:XLAT 执行结果:(AL)=31H,即将地址E0031H单元的内容31H送人寄存器AL中。AL中的代码由01H(十进制数字1)转换为31H(ASCII码)。
累加器专用传送指令 • 使用换码指令前,首先应建立被转换代码(字节型)的数据表,并将表格的首地址存入寄存器BX中;再将代码(相对于表格首地址的位移量)存入寄存器AL中; • 指令执行后,寄存器AL中的内容就是查表得到的转换代码。 • 换码指令只能使用寄存器BX、AL,不影响标志位。
地址传送指令 • 此指令的功能是将操作数所在存储器的地址送入目标寄存器。 • 指令格式: • 有效地址送寄存器 LEA REG,SRC ;(REG)←SRC • 指针送寄存器和DS LDS REG,SRC ;(REG)←(SRC),(DS)←(SRC+2) • 指针送寄存器和ES LES REG,SRC ;(REG)←(SRC),(ES)←(SRC+2)
地址传送指令 • LEA指令将源操作数的有效地址送人指定寄存器,LDS或LES指令将源操作数指定的4个连续字节单元的内容,分别送入指令指定的寄存器以及DS或ES中。 • [例1] LEA AX,[5678H] ;(AX)--5678H • [例2] 已知:(DS)=C000H (C2480H)=1357H (C2482H)=2468H 指令:LDS SI,[2480H] 执行结果:(SI)=1357H, (DS)=2468H • 注意:指令的源操作数不能使用立即数和通用寄存器,目的操作数不能使用段寄存器。地址传送指令不影响状态标志位。
标志寄存器传送指令 • 指令格式: • LAHF ;(AH)←(PSW低字节) • SAHF ;(PSW低字节)←(AH) • PUSHF ;(SP)←(SP-2)、((SP+1)(SP))←(PSW) • POPF ;(PSW)←((SP)+1,(SP))、(SP)←(SP)+2 • 注意: • LAHF/SAHF指令是寄存器AH与标志寄存器PSW的低字节之间完成的字节型数据传送。 • PUSHF/POPF指令是标志寄存器PSW与堆栈间进行的字型数据传送。 • 指令SAHF和POPF将影响标志位。
算术运算指令 • 8086的算术运算类指令能够对二进制或十进制(BCD码)数进行加、减、乘、除运算,操作数的数据形式可以是8或16位的无符号数或带符号数。 • 对于单操作数指令,不允 许使用立即数形式;对于双操作数指令,只有源操作可以使用立即数,两个操作数中必须 有一个在寄存器中。
加法指令 • 指令格式: • 加法 ADD DST,SRC ;(DST)←(SRC)+(DST) • 带进位加法 ADC DST,SRC ;(DST)←(SRC)+(DST)+CF • 加1 INC OPR ;(OPR)←(OPR)+1 • 注意:这三条指令运算结果将影响状态标志位,但是INC指令不影响标志CF。ADC指令主要用于多字节或高精度数据相加运算
加法指令 • 因为运算结果没有超出单字节无符号数范围,所以CF=0;运算结果超出单字节有符号数范围所以OF=1,其他标志ZF=0,SF=1 • 以上运算可以用两条指令实现: MOV AH,01H ADD AH,7FH
加法指令 • 因为运算结果超出单字节无符号数范围,所以CF=1;运算结果未超出单字节有符号数范围所以OF=0,其他标志ZF=1,SF=0 • 以上运算可以用两条指令实现: MOV AH,01H ADD AH,FFH
减法指令 • 指令格式: • 减法 SUB DST,SRC ;(DST)←(DST)-(SRC) • 进位减法 SBB DST,SRC ;(DST)←(DST)-(SRC)-CF • 减1 DEC OPR ;(OPR)←(OPR)-1 • 求补 NEG OPR ;(OPR)←0FFFFH-(OPR)-1 • 比较 CMP OPR1,OPR2 ;(OPR1)-(OPR2)
减法指令 • SBB指令主要用于多字节或多精度数据相减的运算; • NEG指令对操作数进行取反加l的操作; • CMP指令类似SUB指令执行减法操作,但不产生运算结果,只对标志位产生影响。 • 这几条指令的运算结果都影响状态标志位,只是DEC指令不影响标志CF。
例4.23:已知三个无符号数;X=1234 5678H,Y=5678 9ABCH,Z=0102 0304H顺序放在符号地址DATA开始的存储器单元中。请编制程序段:实现(X+Y-Z)的运算,并将结果送人DATA+12开始的存储器单元中。 程序段如下: MOV AX,DATA ; 取被加数X MOV DX,DATA+2 ADD AX,DATA+4 ; 计算(X+Y) ADC DX,DATA+6 SUB AX,DATA+8 ; 计算(X+Y-Z) SBB DX,DATA+10 MOV DATA+12,AX ; 送存计算结果 MOV DATA+14,DX
乘法指令 • 乘法运算分为无符号数运算和有符号数运算,各有相应的指令,并使用双操作数。两个8位二进制数相乘,积为16位二进制数;两个16位二进制数相乘,积为32位二进制数。 • 指令格式: • 无符号数乘法 MUL SRC ;(AX)←(AL)X(SRC) 8位数乘法 ;(DX,AX)←(AX)X(SRC) 16位数乘法 • 带符号数乘法 IMUL SRC ;操作同上,但是操作数为带符号数
乘法指令 • 进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中:进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。源操作数不允许使用立即数寻址方式。 • 乘法指令运算结果只影响状态标志CF、OF,对其他状态标志位无影响(状态不定)。对于MUL指令,如果字节型数据相乘之积(AH)=0或字数据相乘之积(DX)=0,则CF=OF=0,否则CF=OF=1;对于IMUL指令,如果字节数据相乘之积AH或字数据相乘之积DX的内容是低一半的符号扩展,则CF=OF=0,否则CF=OF=1。
乘法指令 • [例4.24] 已知:(AL)=0FFH视为无符号数,数值为254,视为带符号数,数值为-2。(BH)=0AH视为无符号数,数值为10,视为带符号数,数值为+10。 执行指令 MUL BH 后(AX)=09ECH,CF=OF=1 执行指令 IMUL BH 后(AX)=FFECH,CF=OF=0