null微型计算机原理及应用
西南民族大学电信学院
授 课 教 师:杜 诚
联系方式:13076035417
Email:dcheng_76@tom.com
微型计算机原理及应用
西南民族大学电信学院
授 课 教 师:杜 诚
联系方式:13076035417
Email:dcheng_76@tom.com
null第三章 80X86指令系统
从Intel微处理器技术的发展来看.自8086到目前的Pentium 4形成成功能升级的产品系列。虽然,这些CPU内部的微体系结构变化很大,但它们一直把8086的指令系统作为基础上指令系统,保持默)86指令系统的向上兼窬性.后面产品只是在前面产品指令系统的基础进行一些扩充。成为8086的的母集,以保护软什开发的投资。这就形成了,兼容的指令系统。null§3.1 指令的基本格式一 指令构成
微机指令系统通常由几十种或百余种指令组成。每种指令又由两个字段构成:计算机中,指令主要由操作码和操作数两部分组成。
操作码是核心部分,它规定了计算机将要执行的操作;
操作数指明了命令执行的对象本身或对象所在的地址,null1.操作码字段
该字段指示计算机所要执行的操作类型,由一组二进制代码表示,在汇编语言中又用助记符代表。2.操作数字段
该字段是指出指令执行的操作所需的操作数。在操作数字段中,可以是操作数本身,或是操作数地址或是操作数地址的计算方法。null微计算机中此字段通常可有一个或两个,称前者为单操作数指令,称后者为双操作数指令。
而双操作数又分别称为源操作数和目的操数。在指令执行之前,SRC和DST均为参加运算处理的两个操作数,指令执行之后在DST中存放运算处理的结果。 null8086的通用指令格式
8086的指令长度可在1~6字节的范围,如图所示。其中B1和B2为基本字节,B3~B6 将根据不同指令作相应的安排。地址或立即数
的低字节地址或立即数
的高字节立即数低字节立即数高字节R编码§3.2 8086的寻址方式§3.2 8086的寻址方式存放于CPU内部的寄存器中
存放于存储器单元内
来自I/O端口
由操作码隐含地指定
由指令直接给出操作数说明操作数的来源
以及存储器操作数地址构成的方法null1、固定寻址
8086的单操作数指令,其操作是规定在CPU中某个固定的寄存器中进行,这个寄存器又被隐含在操作码中,因此,这种寻址方式的指令大多为单字节指令。固定寻址的指令,不需要计算EA,执行速度快,加之大多为单字节指令,因此特别适合在微处理机中使用。null例:
PUSH DS ;目的操作数隐含为栈顶字单元
POP BX ;源操作数隐含为栈顶字单元
LAHF ;源操作数隐含为标志寄存器低字节,
;目操作数隐含为寄存器AHnull 2. 立即寻址(Immediate addressing)
操作数直接存放在指令中,紧跟在操作码之后,作为指令 的一部分,存放在代码段里,这种操作数称为立即数。
立即数可以是8位或16位的。
16位的立即数是高位字节放在高地址,低位字节放在低地址。
使用场合:经常用于给寄存器赋初值。
注意:只能用于源操作数字段,不能用于目的操作数字段。 null例: MOV AL,05H
指令执行后: (AL)=05H例: MOV AX,3064H
指令执行后: (AX)=3064H
立即寻址方式null例如:MOV AL,C3H ;执行后,(AL)=C3H。
MOV AX ,2050H ;执行后,(AX)=2050H,其中:(AH)=20H,(AL)=50H。
这种寻址方式只能用于源操作数,且因操作数是直接从指令中取得,不执行总线周期,所以这种寻址方式的显著特点是执行速度快,主要用来给寄存器赋初值。null3、寄存器寻址方式 (Register addressing)
操作数在寄存器中,指令指定寄存器号。
对于16位操作数,寄存器可以是:
AX,BX,CX,DX,SI,DI,SP,BP。
以及段寄存器。
对于8位操作数,寄存器可以是:
AL,AH,BL,BH,CL,CH,DL,DH。
这种寻址方式因为操作数在寄存器中
不需要访问存储器的运算速度较高。null例:
指令执行前:(AX)=3064H
(SS)=1234H
MOV SS,AX
指令执行后:
(SS)=3064H
(AX)保持不变。 指令执行前:指令执行后:寄存器寻址方式null4. 存储器寻址用存储器寻址的指令,其操作数一般位于代码段,堆栈段,附加段的存储器中,指令中给出的是存储器单元的地址或产生存储器单元地址的信息。CPU 根据操作数字段提供地址信息,由EU计算出有效地址EA,在计算出PA。
一条指令中只能有一条存储器操作数。null(4.1)直接寻址(Direct addressing)
操作数地址的16位偏移量,直接包含在指令中,
存放在代码段中指令操作码之后,
但操作数一般存放在数据段中,
必须先求出操作数的物理地址,
然后再访问存储器才能取得操作数。
物理地址 : PA=16d×(DS)+EA
nullMOV AX , [1050H]假设DS = 4500H执行后:
AX = 2762Hnull例:MOV AX,[3100H]
(DS)=6000H , (63100H)=3050H
则:(AX)=3050H
又如:用符号地址代替数值地址。
MOV AX,VALUE
VALUE——有效操作数单元的
符号地址。
如:VALUE在附加段中,
则应指定段跨越。
MOV AX,ES:VALUE直接寻址方式null
注意:
(1)直接寻址方式适用于处理单个变量。
(2)直接寻址方式隐含的段寄存器是 DS,
8086/8088允许段跨越,即允许使用 CS SS ES
作为段寄存器,这时,必须在指令中特别标明。
null(4.2) 寄存器间接寻址方式(Register indirect addressing)
操作数在存储器中,
操作数地址的16位偏移量包含在 BP、BX、SI、DI寄存器中。
1、若选择SI、DI、BX作为间接寻址
操作数一般在现行数据段区域中,用(DS)作为段地址。
即操作数物理地址为:
物理地址PA=16 d ×(DS)+(BX)
物理地址PA=16 d × (DS)+(SI)
物理地址PA=16 d × (DS)+(DI)
寄存器间接寻址过程寄存器间接寻址过程BX、SI、DI的值
或BP的值BX、SI、DI的默认段寄存器DS之值×16
或BP的的默认段寄存器SS之值×16有效地址
EA段基址物理地址PA寄存器间接寻址示例寄存器间接寻址示例MOV AX , [BX]假设BX = 5432H
DS = 0200H执行后:
AX = 0E1FHnull
例:MOV BX,[DI]
(DS)=6000H
(DI)=2000H
PA=62000H
(62000H)=50A0H
(BX)=50A0H寄存器间接寻址方式
MOV BX,[DI]null2 、若选择BP寄存器作为间接寻址
操作数在堆栈段区域中,用SS寄存器的内容作为段地址。
操作数物理地址:
PA=16d × (SS)+(BP)
例: MOV [BP], AX
执行前: (SS)=1000H ,
(BP)=3000H ,
(AX)=1234H
执行后:PA=13000H
(13000H)=1234H
寄存器间接寻址方式
MOV [BP], AXnull3 、用 SI、DI、BX 、BP作为间接寻址允许段跨越
指令中可以指定段跨越前缀来取得其他段中的数据。
例:MOV ES:[DI], AX
MOV DX, DS:[BP]
这种寻址方法可以用于
表格
关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载
处理。null(4.3) 寄存器相对寻址方式
操作数的有效地址是一个基址或变址寄存器的内容
和指令中指定的8位或16位位移量之和。
例: MOV DL,[BP+2]
等效写法:
MOV DL,[BP]2
MOV DL,2[BP]基址寻址方式
使用基址寄存器(BX或BP),并带位移量的间接寻址。操作数EA=BX或BP值+位移量。nullnull变址寻址方式
使用变址寄存器(SI或DI)、并带位移量的间接寻址。操作数EA=SI或DI值+位移量。例:MOV [SI+10],AH
其它等效写法:
MOV [SI]10,AH
MOV 10[SI],AHnull8086/8088 CPU 中有两个变址寄存器 :
源变址寄存器 SI ;
目的变址寄存器 DI 。
操作数一般在内存的数据段中,但允许段跨越。
除有段跨越前缀之外,形成物理地址有二种方式:
nullMOV DL,[BP+2] ( 设BP原值为4000H) Bit 19 4 3 020 位 物 理 地 址Memory基址寻址过程nullMOV [SI]10 ,AH ( 设SI原值为008CH) Bit 19 4 3 020 位 物 理 地 址Memory变址寻址过程null例:
MOV AX, COUNT [BP]
或MOV AX, [COUNT+BP]
或MOV AX, COUNT+[BP]
COUNT为16位位移量。
指令执行前: (SS)=5000H,
(BP)=3000H,
COUNT=2040H,
(AX)=1234H
指令执行后:EA=5040H
PA=55040H
(55040H)=5548H
(AX)=5548H 寄存器相对寻址方式
MOV AX,COUNT[BP]null(4.4) 基址变址寻址方式
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,基址寄存器名和变址寄存器名均有指令指定。null除有段跨越前缀之外,形成物理地址有二种方式:null例:
MOV AX, [BX][SI]
或 MOV AX, [BX+SI]
执行指令前:
(DS)=3200H,
(BX)=0456H,
(SI) =1094H
(334EAH)=4567H
执行指令后:
EA=14EAH
PA=334EAH
(AX)=4567H
基址加变址寻址方式
MOV AX,[BX+SI]null(4.5)相对基址加变址寻址方式
操作数有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和 。使用一个基址寄存器、一个变址寄存器的间接寻址。操作数EA=BX或BP值+ SI或DI值+位移量。
null除有段跨越前缀之外,形成物理地址有二种方式:nullnullMOV [BX+DI+4] ,CX
( 设BX原值为1000H,DI原值为0300H) Bit 19 4 3 020 位 物 理 地 址Memory相对基址加变址寻址null例:
MOV AX, MASK[BX][DI]
MOV AX, MASK [BX+DI]
MOV AX,[MASX+BX+DI]
执行指令前:
(DS)=3000H
(BX)=1346H
(DI)=0500H
MASK=1234H
(32A7AH)=4050H
执行指令后:
EA=2A7AH
PA=32A7AH
(AX)=4050H 相对基址加变址
MOV AX, MASK+[BX+DI]null(4.6)串寻址适用于数据串操作指令。
它使用了一种隐含的变址寄存器寻址。MOVSB MOVSWnull4、I/O端口寻址
仅用于输入/输出指令IN、OUT。
长格式I/O寻址——端口地址在8位以内,端口地址直接做操作数。可寻址的I/O空间为256字节。
例: IN AX,43H
OUT 0FH,AL
短格式I/O寻址——端口地址16位,固定使用DX做操作数,DX的值就是该16位端口的地址。可寻址的I/O空间为65536字节。 例: IN AL,DX
OUT DX,AXnull在8086/8088CPU的七种寻址方式的基础上,又扩充了三种。
8086/8088CPU七种寻址方式:
立即寻址 寄存器寻址 直接寻址
寄存器间接寻址 相对寄存器寻址 基址加变址寻址
相对基址加变址寻址
80386、80486、80586、Pentium 扩充了三种寻址方式:
带比例因子的变址寻址
基址加比例因子的变址寻址
相对基址加比例因子的变址寻址。nullEA=基址+(变址比例因子)+ 位移量
位移量:8位,16位,32位。
比例因子:取1,2,4,8。3.3指令时间一条指令的执行时间是指取指令和执行指令所花
时间的总和。null在80x86CPU中,EU和BIU是并行工作的。BIU可以预先把指令取到指令队列,形成了取指和执行的重叠。
在计算指令的执行时间时,就不把取指时间计算在内,执行指令的时间,除了EU中的基本执行时间外,
有些指令在执行过程中可能需多次访问内存,
包括取操作数和存放操作结果等,都要执行总线
的读/写周期;null每次访问内存之前,需要计算有效地址EA,计算有效地址所需的时间又由寻址方式决定,不同寻址方式下计算有效的时间如表所示。null计算EA 需要的 时钟数:如下表所示: (若段超越,再加两个时钟周期)null不同功能的指令,其基本执行时间也不相同,这里的基本执行时间列举在表中,
同一类指令,因寻址方式不同.访问存储器次数不一,因而执行时间也不同
执行一条指令所花的总时间=基本执行时间+计算EA的时间十执行总线读/写周期的时间(后两项对存储器操作数才有)。nullnull 除上面的这些因素外。
还应注意字操作数在内存或在I/O端口的存放格式。
8086的数据总线是16位的。
CPU和存储器、IO端口之间传送数据时,在一个总线周期(基本总线周期为4T)中可以传送16位数据,即一个字。null存储器组织时,若存取的字操作数是从偶地址开始存放的规则字。则存取可在1个总线周期完成;若存取的字操作数是从奇地址开始的非规则字,则存取需2个总线周期才能完成。
因此,这种情况下,每访问一次内存。
便需多加一个总线周期的时间。null如果存取的是字节操作数。而这个字节数是在偶地址单元或偶数端口,那么在一个总线周期中,只有数据总线的低8位起传输作用,而高8位则处于空闲状态。
相反.若字节数是在奇地址单元或奇数端口,则在一个总线周期中只有数据总线高8位起传输作用。而低8位处于空闲状态。8086数据总线的这种传输特性如图所示。nullnull一个具体例子来说明:
[例3.1]设8086的时钟频率为5MHz(即时钟周期一0.2µs)。试求ADD指令在各种寻址方式下,指令的执行时间t。
解:根据表3~4可知:
(1)两操作数为:寄存器,寄存器,结果也放在寄存器的情况下,对于字操作数或字节操作数均花3个时钟周期。即:
t=3X0.2=0.6µs
(2)两操作数为:寄存器,存储器(用相对基址加变址寻址),结果存寄存器,这时需访问一nullnull次内存。在这种情况下.对于字节操作或对规则字操作.所需时间用时钟数表示为:
t=9+EA=9+12=21T
第l项的9为这种、寻址方式下指令基本运算和基本操作时间,第2项为计算EA的时间
t=21x0.2=4.2µs
对于非规则字的操作,则应在上面的时间上再加上一个总线周期时间(4T),即
t=(21+4)T=5.0µsnull (3)两个操作数为:存储器(用基址变址寻址),寄存器,结果存人存储器,这时需访问两次内存。
对于字节操作或对规则字操作,指令的执行时间为:
t=16+EA=16+8=24(T)=4.8μs
第l项的l 6为这种寻址方式下指令基本运算和基本操作时间,第2项为计算EA时间。
对于非规则字操作,指令执行时间应在上面的时间上再加两个总线周期,即
t=(16+8+4+4)T=32T=6.4μsnull 8086和8088具有完全相同的指令系统。
该指令系统包含133条基本指令,这些指令与寻址方式组合,再加上不同的数据形式(字节或字)。可构成上千种指令,是80x86指令系统的基本部分。这些指令按功能可分为以下六类:3.3 8086/8088指令系统null8086有如下几大类指令:
数据传送指令、
算术运算指令、
逻辑运算指令、
控制转移指令、
串操作指令、
处理器控制指令、
null3.4.1数据传送(Data Transfer)类指令
这类指令用以实现CPU的内部寄存器之间、CPU内部寄存器和存储器之间、CPU累加器AX或AL和I/O端口之间的数据传送。
这类指令又可分为4小类,其指令均含两个操作数。而且除SAHF和POPF指令外,其余指令均不影响状态标志位。null通用数据传送指令MOV
堆栈操作指令PUSH、POP
数据交换指令XCHG
查表指令XLAT
地址传送指令LEA、LDS、LES
标志传送指令LAHF、SAHF、PUSHF、POPFnull1.MOV dst, src ; (dst) (src)
目的 源 目的 源
功能:
把一个字节(B)或一个字(W)操作数由源传送至目的。
实现:寄存器 寄存器/存储器之间;
立即数寄存器/存储器
段寄存器寄存器/存储器之间的数据传送。nullnull 具体说,通用数据传送指令能实现:
① CPU内部通用寄存器及段寄存器之间的数据传送
(除了码段寄存器CS和指令指针IP以外)。
通用寄存器之间任意传送,段寄存器之间不能传送。
例:
MOV DL,CH ; 8位寄存器 8位寄存器
MOV AX,DX ; 16位寄存器 16位寄存器
MOV SI, BP
MOV DS,BX ;通用寄存器 段寄存器
MOV AX, CS ;段寄存器 通用寄存器null立即数传送至CPU内部通用寄存器组
(AX、BX、CX、DX、BP、SP、SI、DI)。
用于给寄存器赋初值。
不能直接给段寄存器赋值
例:MOV CL,04H ;立即数8位寄存器
MOV AX,03FFH ;立即数16位寄存器
思考:为什么加WORD PTR , BYTE PTR ?不加对吗?
MOV WORD PTR [ SI] ,057BH ;立即数存储器
MOV BYTE PTR MEM, 5 ;立即数存储器nullCPU内部通用寄存器及段寄存器(除CS和IP外)
与存储器(所有寻址方式)之间数据传送。
可以实现一字节或一个字的传送。
段寄存器,存储单元之间不能直接传送
例:MOV MEM , AX ; 累加器存储器,直接寻址
MOV MEM ,DS ;段寄存器存储器,直接寻址
MOV DISP[BX] ,CX ;寄存器存储器,变址寻址
MOV AX , DISP [SI] ;存储器累加器,变址寻址
MOV DS , MEM ;存储器段寄存器,直接寻址
MOV CX , DISP [BX] [SI] ;存储器累加器,相对基址加变址null【注1】两个mem之间不能直接进行数据传送或其他操作。
【注2】立即数不能做目的操作数。
【注3】该指令不影响标志位。
【注4】段寄存器CS不能做目的操作数。
【注5】当源操作数为段寄存器时,不能用立即数做目的操作数。
null 注意:
(1)不能用一条MOV指令实现以下传送。
存储单元之间的传送
MOV MEM2 , MEM1 错。
MOV AX , MEM1
MOV MEM2 , AX 对。
立即数送段寄存器
例 : MOV DS,2000H 错。
MOV AX, 2000H
MOV DS , AX 对。 null ③段寄存器之间的传送
MOV ES , DS ; 错
MOV AX , DS
MOV ES , AX ; 对 。
④ 注意CS和IP的使用
CS和IP不能作为目标操作数,
CS可以作为源操作数。
例: MOV CS,AX ; 错
MOV AX,CS ;对 。
MOV IP, AX ;错
MOV AX, IP ; 对。null1.MOV DS,2010H
;错 不能将立即直接给段寄存器
2.MOV BX,[SI+DI]
;错 无[SP+DI]寻址,
必须是基址(BX或BP)+变址(SI或DI)
3.MOV DI,[AX]
;错 无[AX]寻址,存储器地址只能通
过BX,BP,SI,DI寻址
判断下列指令正误并说明理由:null4.MOV AX,[BX+BP]
;错 无[BP+BX]寻址,理由同第2题
5 .MOV DX, [SP]
;错 无[SP]寻址方式,存储器地址只能 通
过BX,BP,SI,DI寻址
6.MOV AX,ES:[BX]
;对 null2. PUSH (Push word onto stack)
POP (Pop word off stack)
这是两条堆栈操作指令。
堆栈——按照先进后出原则组织的一段内存区域,
特点:
①下推式的(规定堆栈设置在堆栈段内)改变SP的内容,随着推入堆栈内容增加,SP的值减少。
②先进后出工作原则(Last In First Out 简称LIFO)
null堆栈在内存中的情况:
可以用一条立即数传送指令给SP赋值,确定SP在SS段
中的初始位置。
例:设:(SS)=9000H ,
堆栈段为64KB
MOV SP,0E200H
;(SP)=0E200H堆栈在内存中的情况则:整个堆栈段的物理地址范围为:
90000H~9FFFFH
栈顶的物理地址为:9E200H
堆栈在内存中的情况如右图所示:
null堆栈用途:
存放CPU寄存器或存储器中暂时不使用的数据,使用数据时将其弹出;
调用子程序,响应中断时都要用到堆栈。
调用子程序(或过程)或发生中断时要保护断点的地址,子程序或中断返回时恢复断点。null堆栈操作指令 (堆栈操作指令有两条):
入栈指令
格式:PUSH src ; (SP) (SP)-2
((SP)+1,(SP)) (src)
把一个字从源操作数由SP指向堆栈顶部。
操作如:PUSH AX允许的操作数类型:
寄存器
存储器
段寄存器示例:
PUSH AX
PUSH WORD PTR [BP]
PIISH DSnull 存放CPU寄存器或存储器中暂时不使用的数据,
PUSH AX ; 将(AX)入栈null出栈指令
格式:POP dest ;(dest) ((SP)+1,(SP))
(SP) (SP)+2
把现行SP所指向堆栈顶部的一个字 指定的目的操作数,同时进行修改堆栈指针的操作。
操作如: POP BX示例:
POP AX
POP WORD PTR [BP][SI]
POP ES允许的操作数类型:
寄存器
存储器
段寄存器null使用数据时将其弹出: POP BXnull这类指令格式简单.但使用时有几点必须注意:
①堆栈操作指令中,有一个操作数是隐含的。该操作数就是(SP)指示的栈顶存储单元;
②8086堆栈都是字操作,而不允许对字节操作。因此PUSH AL是错误的;
③每执行一条入栈指令,(SP)自动减2,入栈时.高位数先入栈;执行弹出时,正好相反,每弹出一个字,(SP)自动加2:null④cs寄存器的数据可以人栈,但不能随意弹出一个数据到cs;
⑤在使用堆栈操作保存多个寄存器内容和恢复多个寄存器时,要按“先进后出”的原则来编写入栈和出栈指令顺序。
⑥入栈指令PUSH与出栈指令POP实际上是两个互逆
的过程。入栈时,先修改指针再压人数据;出栈时
,先把数据弹出再修改指针。null[例3~2] 有一主程序调用一子程序,子程序中将用到AX,BX,CX和DX。为了使主程序中这些寄存器内容不被破坏,在进入子程序时应进行入栈保护;子程序执行完后.再出栈恢复原来的数据。保护和恢复应按”先进后出、后进先出”的原则安排指令。子程序中的保护现场和恢复现场的程序段为:
nullSUBROUT PROC NEAR ;定义过程
PUSHF ;保护现场
PUSH AX
PUSH BX
PUSH CX
PUSH DX
…… ;(子程序主体)
POP DX ;恢复现场
POP CX
POP BX
POP AX
POPF
RET
SUBROUT ENDPnull3、交换指令(Exchange)
格式:XCHG dest , src ;(dest) (src)
执行操作:
把一个字节或一个字的
源操作数与目的操作数相交换。
可以 实现: 寄存器之间
寄存器和存储器之间null 例 设原CX=2FFFH,AX=0080H。
执行指令XCHG AX,CX后,
CX = 0080H ,AX = 2FFFH 。
示例: XCHG AL,BL
XCHG BX,CX
XCHG [2200H],DX
XCHG [BX],[DI] (错)
XCHG DS, AX (错)null【注1】立即数不能做XCHG指令的操作数。
【注2】该指令不影响标志位。
【注3】该指令不能同时为存储器操作数。
【注4】该指令不能使用段寄存器操作数。nullXLAT(Trans late)换码指令:
该指令不影响标志位。
格式:XLAT str_table;
或 XLAT (AL)←((BX )+(AL))
str_table——表格符号地址(首地址),
只是为了提高可读性而设置,汇编时仍用BX。
允许的操作数类型: label
示例: XLAT TABLE ;TABLE代表转换表首址
或XLATnull XLAT指令使用方法:
先建立一个字节表格;
表格首偏移地址存入BX;
需要转换代码的序号(相对与表格首地址位移量)存入AL;(表中第一个元素的序号为0)
执行XLAT指令后,表中指定序号的元素存于AL中。(AL)为转换的代码。nullXLAT指令应用:
例:内存的数据段中有一张十六进制数字的ASCII码表。首地址为:Hex_table ,欲查出
表中第10个元素(‘A’)
null
执行指令序列:
MOV BX,OFFSET Hex_table
MOV AL,0AH
XLAT Hex_table
假设:
(DS)=F000H,
Hex_table=0040H
(AL)=0AH
执行XLAT以后:
(AL)=41H=(F004AH),
即“A”的ASCII码。16进制数的ASCII码表XLAT指令应用null(四)目的地址传送指令(Address-object transfer)
8086 /8088 提供三条:
地址指针写入指定寄存器或寄存器对指令。
1、LEA(Load Effective Address)
2、LDS (Load pointer using DS)
3、LES (Load pointer using ES)null1、LEA(Load Effective Address)
格式: LEA reg16 , mem16 ;EA(reg16)
功能:
把指令中指定的存储器操作数有效地址装入指定的寄存器 。
例:设(BX)=0400H,(SI)=003CH
LEA BX,[BX+SI+0F62H]
执行指令后:
EA=(BX)+(SI)+0F62H=0400H+003CH+0F62H=139EH
(BX)=139EHnullLEA 指令中的
目标寄存器必须是16位的通用寄存器,
源操作数必须是一个存储器。
LEA BX,[BP+SI]
LEA SP,[0502H]null注意:设
(DS)=3000H
BUFFER=1000H
(31000H)=0040H
(1) LEA 指令与MOV 的区别
LEA BX , BUFFER ;(BX)=1000H
MOV BX , BUFFER ; (BX)=0040H
LEA 指令与MOV等价
LEA BX , BUFFER ; (BX)=1000H
MOV BX , OFFSET BUFFER ; (BX)=1000Hnull LEA SI , AREA1
LEA DI , AREA2
MOV CX, 100
AGAIN: MOV AL , [SI]
MOV [DI], AL
INC SI
INC DI
DEC CX
JNZ AGAIN例:将数据段中从
AREA1开始存放的
100个字节搬到附
加段AREA2为首地
址的区域中。null2、LDS (Load pointer using DS)
格式:LDS reg16, mem32 ;(reg16)←(EA)
(DS)←((EA)+2))
功能:将指令指定32位地址指针送指令指定寄存器和DS。
将指令指定mem32单元的前两个单元内容(16位偏移量)装入指定通用寄存器,把后两个单元内容(段地址) 装入到DS段寄存器。
null例:
假设: (DS)=3000H
指令: LDS SI, [2130H]
执行指令后:
(SI)=3C1FH
(DS)=2000H
null3、LES (Load pointer using ES)
格式:LES reg16, mem32;(reg16)←(EA)
(ES)←((EA)+2))
功能:把源操作数指定的4个相继字节送指令指定的寄存器 及ES寄存器中。
此指令常常指定DI寄存器。
将指令指定mem32单元的前两个单元内容(16位偏移量)装入指定通用寄存器,把后两个单元内容(段地址) 装入到ES段寄存器。null例:
假设: (DS)=3000H
指令: LES SI, [2130H]
执行指令后:
(SI)=3C1FH
(ES)=2000H
null例:
假设: (DS)=B000H
(BX)=080AH
指令: LES DI, [BX]
执行指令后:
(DI)=05A2H
(ES)=4000Hnull [例3 6] 设某程序在调用子程序ROUT之前,在堆栈顶部存放着一个字符串的首地址。要求在执行程序ROUT时.将该字符串首地址取到ES和DI,然后调用字符串显示子程序DISP进行显示。调用子程序ROUT前后的堆栈状况如图所示。
null ROUT:PUSH BP
MOV BP,SP
PUSH ES
PUSH DI
LES DI,[BP+4]
CALL DISP
….(后续处理)
POP DI
POP ES
POP BP
RET程序段为:null综合举例:
设:
(DS)=5000H
TABLE=1000H
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
下列指令执行结果:
MOV BX,TABLE ;(BX)=0040H
MOV BX,OFFSET TABLE ;(BX)=1000H
LEA BX,TABLE ;(BX)=1000H
LES BX,TABLE ;(BX)=0040H,(ES)=3000H
LDS BX,TABLE ;(BX)=0040H,(DS)=3000Hnull(五)标志传送指令(Flag register transfer)
采用了隐含寄存器(AH、Flags)操作数方式。
8088有四条标志传送操作指令:
1. LAHF(Load AH from flags)
2. SAHF(Store AH into flags)
3. PUSHF(Push flags onto stack)
4. POPF(Pop flags off stack)
null1.LAHF(Load AH from flags)格式:LAHF ;(AH)←(PSW的低字节)
功能:标志寄存器低八位 (AH)。LAHF指令操作图示意null2. SAHF(Store AH into flags)
格式:SAHF ;(PSW的低字节)←(AH)
功能:(AH)送标志寄存器低八位。
3. PUSHF(Push flags onto stack)
格式:PUSH F ;(SP)←(SP)-2
((SP)+1,(SP))←(PSW)
功能 : 标志进栈。
4. POPF(Pop flags off stack)
格式:POP F;(PSW)←((SP)+1,(SP))
功能 :标志出栈。 (SP)←(SP)+2
null注意:
(1) 标志位的影响
LAHF、PUSHF不影响标志位,
SAHF、POPF由装入的值确定标志位的值, 即影响标志位。判断下列指令正误并说明理由:1 .PUSH AL
;错 不能对字节进行堆栈操作null 2 .XCHG CL,CH
;对
3.LDS CH,[DI]
;错 LDS指令目的操作数应为一个16为寄存器
4.LEA BX,1000H
;错 LEA源操作数应为一个存储器操作数,
不能是立即数 5.LEA DX,DI
;错 LEA源操作数应为一个存储器操作数,
不能是寄存器
null6 .OUT DX,CL
;错 端口只能通过AL或AX传送数据
7.OUT DX,BX
;错 端口只能通过AL或AX传送数据
8.IN AL,0A00H
;错 端口地址大于FFH应用DX寻址端口
数据传送指令小结数据传送指令小结源、目操作数长度必须一致。
源、目操作数不能同时是存储器操作数。
源、目操作数不能同时是段寄存器。
立即数和代码段寄存器CS不能作目操作数。null当目操作数是段寄存器时,源操作数不能是立即数。
可以使用段寄存器的指令:MOV、PUSH、POP。
除XCHG指令外,其它数传指令仅改变目操作数,源操作数保持不变。
除SAHF、POPF指令外,其它数传指令的执行不影响标志位。null二. 算术运算指令(Arithmetic)
内容:
8086/8088提供
加、减、乘、除四种基本算术操作;
(一)加法指令(Arithmetic)
(二)减法指令(Subtraction)
(三)乘法指令(Multiplication)
(四)除法指令(Division)
nullnullnull溢出
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
归纳: CF检测无符号数的溢出
OF检测符号数的溢出
算术运算指令特点:
大部分都影响标志位,不同指令影响不同:
(1) 这类指令除加1和减1指令不影响CF外
都会影响 SF,ZF,AF,PF,CF,OF
(2)加、减、乘、除除加1和减1外,
都有两个操作数null① OF(Overflow Flag)溢出标志(一般指补码溢出)
OF=1:在运算过程中,如操作数超过了机器表示的范围称为溢出。
OF=0:在运算过程中,如操作数未超过了机器能表示的范围称为 不溢出。
字节允许范围 -128—+127,
字运算范围 -32768—+32767 。null② SF(Sign Flag)符号标志
SF=1:记录运算结果的符号为负。
SF=0:记录运算结果的符号为正。
③ ZF(Zero Flag)零标志
ZF=1:运算结果为0。
ZF=0:运算结果不为0。
④ CF(Carry Flag)进位标志
CF=1:记录运算时从最高有效位产生进位值。
CF=0:记录运算时从最高有效位不产生进值。null⑤ AF(Auxiliary Carry Flag)辅助进位标志
AF=1:记录运算时第3位(半个字节)产生进位值。
AF=0:记录运算时第3位(半个字节)不产生进位值。
⑥ PF(Parity Flag)奇偶标志
PF=1: 结果操作数低8位中有偶数个1。
PF=0: 结果操作数低8位中有奇数个1。
用来为机器中传送信息时可能产生的代码出现情况提供检验条件。 D3 D0D7 D4null(一)加法指令(Arithmetic)
1、 ADD(Addition)加法指令
2、 ADC(Add with carry)带进位加法指令
3、 INC(Increment by 1)加1指令
4、AAA(ASCII adjust for addition)
加法ASCII调整指令
5、DAA(Decimal adjust for addition)
加法十进制调整指令
null1、 ADD(Addition)加法指令
格式:ADD dest ,src ;(dest) (dest)+(src)
Src:立即数,寄存器,存储器。
dest:寄存器,存储器。可以进行8位、16位的无符号数
和带符号数的加法运算;
源操作数和目标操作数不能同时
为存储器,不能为段寄存器;null特点:指令影响标志位的情况:
OF=1, 8位带符号数相加,和超出范围
(-128~+127),
16位带符号数相加,和超出范围
(-32768 ~ +32767);
CF=1, 8位无符号数相加,和超过255,
16位无符号数相加,和超过65535。
其他条件标志(SF,AF,PF,ZF)根据定义设定。null例: ADD DI,SI
ADD AX,[BX+2000H]
ADD [BX+DI],CX
ADD AL,5FH
ADD [BP],3AHnull 例
MOV AX, 5463H ;(AX)= 5463H
ADD AX,0F0F0H
;(AX)=5463H+0F0F0H=4553H
影响标志位的情况:
null第三位向第四位没有进位 ∴AF=0;次高位向最高位有进位 ,最高位向前有进位, ∴OF = 1 1 = 0最高位有进位 ∴CF=1;低8位中1的个数为偶数 ∴PF=1;运算结果本身≠0 ∴ZF=0;运算结果最高位为0 ∴SF=0;null2、 ADC(Add with carry)带进位加法指令
格式:ADC dest,src ;
(dest)←(dest)+(src)+CF
CF: 进位标志CF的现行值(上条指令CF值)
Src:立即数,寄存器,存储器。
dest:寄存器,存储器。
用途:主要用于多字节运算中。null 类型举例:
ADC CX, 300 ;寄存器+立即数+CF
ADC AL, BL ;寄存器+寄存器+CF
ADC DX, COUNT[SI] ;寄存器+存储器+CF
ADC BLOCK[DI], BX ;存储器+寄存器+CF
ADC BYTE PTR MEM, 6 ;存储器+立即数+CFnull用途举例:
计算两个双倍精度字相加
1234FEDCH+11228765H=?
两个双倍精度字存放在:
1000H,2000H的开始单元。双倍精度字
内存存放null 程序:
MOV SI,1000H
MOV AX,[SI]
MOV DI,2000H
ADD AX,[DI]
MOV [SI],AX
MOV AX,[SI+2]
ADC AX,[DI+2]
MOV [SI+2],AX双倍精度字
内存存放nullADD/ADC对条件标志位(CF/OF/ZF/SF)的影响:CF位表示无符号数相加的溢出。
OF位表示带符号数相加的溢出。null3、INC (Increment by 1 )加 1 指令
格式:INC dest;(B/W), (dest)←(dest)+1
dest : 寄存器、存储器。不能是段寄存器。
功能:对指定的目标操作数+1 操作数单元。
用途:用于在循环程序中修改地址指针和循环次数。
标志位影响情况:影响SF,ZF,AF,PF,OF。
不影响CF。null操作数类型:可以是寄存器,存储器。不能是段寄存器。
例:
INC CX
INC BYTE PTR [BX+100H]
INC WORD PTR [DI]
INC DS ; 错十进制调整指令十进制调整指令(1)加法的十进制调整指令DAA
(2)加法的非压缩BCD码调整指令AAA
BCD码本质上是十进制数,即应遵循逢十进一
的规则。而计算机是按二进制(十六进制)进
行运算,并未按十进制规则进行运算。null4、组合BCD码调整指令DAA (无操作数)
何时使用?
对什么进行调整?
影响SF、ZF、AF、CF、PF
DAA指令应紧跟在ADD或ADC指令之后。null两个组合BCD码相加结果在AL中,通过DAA调整得到一个正确的压缩BCD码.
指令操作(调整方法):
若AL的低4位>9∨AF=1
则(AL)←(AL)+6,AF←1
若AL的高4位>9∨CF=1
则(AL)←(AL)+60H,CF←1
除OF外,DAA指令影响所有其它标志。null例:
MOV AL,89
MOV BL,75
ADD AL,BL
DAA
执行ADD后,(AL)=BCH,高4位低4位均大于9,
故DAA指令执行加66H调整,最后结果为:
(AL)=22H, CF=1, AF=1 1000 1001 89
+ 0111 0101 75
1111 1110 FEH
+ 0110 0110 66H
1 0010 0100 1 64H
(进位) (进位)
null【例3