420 likes | 728 Views
第四章 80x86 微处理器的指令系统. 主讲:刘英. 主要内容. 4.1 Intel 80x86 的寻址方式 4.2 Intel 80x86 指令系统. 指令的一般格式. 操作码 操作数. 4.1 Intel 80x86 的寻址方式. 指令:计算机提供给用户的硬件命令 指令系统:所有指令的集合 操作码: 指计算机所要执行的操作,即指出操作类型,是一种助记符。 操作数: 指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。 例: MOV AX , CX ;将 CX 的内容送入 AX 中。
E N D
第四章 80x86微处理器的指令系统 主讲:刘英
主要内容 • 4.1 Intel 80x86的寻址方式 • 4.2 Intel 80x86指令系统
指令的一般格式 操作码 操作数 4.1 Intel 80x86的寻址方式 • 指令:计算机提供给用户的硬件命令 • 指令系统:所有指令的集合 • 操作码:指计算机所要执行的操作,即指出操作类型,是一种助记符。 • 操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。 • 例:MOV AX,CX;将CX的内容送入AX中。 • 寻址方式:就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。
操作数 寻址方式 直接寻址 寄存器间接寻址 寄存器相对寻址 存储器数 基址变址寻址 相对基址变址寻址 串操作寻址 4.1 Intel 80x86的寻址方式 • 计算机中操作数按存放的方法分为: • 立即数(指令中) • 寄存器数 • 存储器数 • I/O端口 立即数 立即数寻址 寄存器数 寄存器寻址 直接寻址 端口寻址 寄存器间接寻址
例如:MOV AX,1234H 存储器 AH AL 代码段 AX 12H 34H 操作码 34H 12H 4.1.1 立即寻址 • 操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
4.1.1 立即寻址 • 立即操作数可以是8位或16位,并且是指令的一部分。立即数据总是紧跟在指令操作码之后并和操作码一起存放在代码段中,因而立即数据总是和操作码一起被放入BIU中的指令队列里,在指令执行时不需再存取存储器。 • MOV AH, 80H • ADD AX, 1234H • 在汇编语言中,规定:立即数不能作为指令中的第一操作数。该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。 • 使用立即寻址的指令主要用来给寄存器赋初值。
例如:MOV AX,BX BH BL AX 23H 45H 4.1.2 寄存器寻址 • 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等,指令指定寄存器号。
4.1.2 寄存器寻址 • 对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP或BP; • 而对8位操作数,寄存器可以是AH,AL,BH,BL,CH,CL,DH或DL。 • MOV AX, BX • MOV CL, DL • INC CX • ROL AH, 1 • 特点: • 操作数在CPU内,不用通过总线读写,速度快; • 目的和源操作数均可采用此寻址方式,但必须使用同样字长的寄存器。
例如:MOV AX,[3000H] 假设(DS)=1000H PA=1000H 10H+3000H=13000H .... A1H 00H 代码段 AH AL 30H 34H 12H AX .... 13000H 13001H 数据段 12H 34H 4.1.3 直接寻址 • 操作数的有效地址(Effective Address, EA。在IBM PC中把操作数的偏移地址称为有效地址)是指令的一部分,它与操作码一起存放在代码段中,但操作数一般是在数据段中,因而这种寻址方式是以DS的内容为基准。可使用段超越前缀来改变数据所在段地址。
4.1.3 直接寻址 • 举例: • MOV AL,[2000H];将DS*10H+2000H单元的内容送 AL; • MOV AX,[2000H];将DS*10H+2000H单元的内容送AL,DS*10H+2000H+1单元的内容送AH; • MOV AL,ES:[2000H];这里ES是段超越前缀,所以源操作数是在ES*10H+2000H的内存单元中。 • MOV [3000H],AL;目的操作数采用直接寻址,将AL送DS*10H+3000H的内存单元。 • 适于处理单个变量
(BX) (SI) (DI) 4.1.4 寄存器间接寻址 • 操作数的有效地址EA存放在基址寄存器(BX或BP)或变址寄存器(DI或SI)中。 • 隐含段地址:SI、DI、BX为DS;BP为SS。可用段跨越。 • BX,SI,DI 操作数在数据段(DS) • 物理地址 = (DS) 10H + • BP 操作数在堆栈段(SS) • 物理地址 = (SS) 10H + (BP)
.... 操作码 代码段 AH AL .... 35H 12H AX 31000H 31001H 数据段 12H 35H 4.1.4 寄存器间接寻址 例如:MOV AX,[SI] 假设(DS)=3000H, (SI)=1000H PA=3000H 10H+1000H=31000H
4.1.4 寄存器间接寻址 • 举例 • MOV AL,[BX]; [DS*10H+BX]送AL • 设DS=3000H,BX=2000H,(32000H)=45H,则执行该指令后,AL=45H。 • MOV AL,[BP]; [SS*10H+BP]送AL • 设 DS=2000H,SS=1000H, BP=0100H,(10100H)=3BH,(20100H)=4CH。执行这条指令后,AL=3BH。 • MOV AX,[BX]; [DS*10H+BX]送AL,[DS*10H+BX+1]送AH • 常用于访问存储器中的一维数组或表格。
(BX) (BP) (SI) (DI) 8位 16位 位移量 + 有效地址 EA= 4.1.5 寄存器相对寻址(变址寻址) • 操作数的有效地址EA是8位或16位的位移量与基址寄存器BX或基址指示器BP或某个变址寄存器(DI或SI)之和。 • 隐含段地址:SI、DI、BX为DS;BP为SS。可用段跨越。
.... 操作码 20H 代码段 00H AH AL .... 86H 12H AX 42020H 42021H 数据段 12H 86H 4.1.5 寄存器相对寻址(变址寻址) 例如:MOV AX,DATA[BX] 假设(DS)=4000H,(BX)=2000H,DATA=0020H PA=4000H 10H+2000H+0020H=42020H
4.1.5 寄存器相对寻址(变址寻址) • 举例 • MOV AL,5[BX] • MOV AL,[BX+5] • COUNT EQU 5 • MOV AL,COUNT[BX] • 以上三个例子是等价的,它执行的操作是:[DS*10H+BX+5]送AL。这里,5称为位移量(displacement),它可以是8位或16位的二进制数。 • 适用于数组和表格处理,首地址存放在位移变量中,修改寄存器的值以访问数组中的各个元素。
基址 变址 (BX) (BP) (SI) (DI) + 有效地址 EA= 4.1.6 基址变址寻址 • 有效地址EA是由基址寄存器BX(或基址指示器BP)的内容与变址寄存器(DI或SI)的内容之和。 • 注意:必须是一个基址寄存器和一个变址寄存器的组合,不可同为基址寄存器(BX、BP)或同为变址寄存器(SI、DI)。 • 同样适用于数组和表格处理。 例如:MOV AX, [BX][DI] 假设(DS)=4000H,(BX)=2000H,(DI)=2000, PA=4000H 10H+2000H+2000H+0100H=44100H
8位 16位 (BX) (BP) (SI) (DI) 有效地址 EA= + + 位移量 4.1.7 相对基址变址寻址 • 操作数EA的有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和。 • 常用于对二维数组的寻址,例如,存储器中存放多个记录组成的文件,则位移量指向文件的首地址,基址寄存器指向某个记录,变址寄存器指向该记录中的一个元素。 例如: MOV AX,[BX][SI]DATA MOV AX,[BX+SI] DATA MOV AX,[BX+SI+DATA] 假设(DS)=4000H,(BX)=2000H,(SI)=2000,DATA=0100H PA=4000H 10H+2000H+2000H+0100H=44100H
4.1.7 相对基址变址寻址 • 段寄存器使用的基本约定
4.2 Intel 80x86指令系统 • 8086/8088指令系统共包含92种基本指令 • 8086指令按照功能分为6大类: • 数据传送指令 14条 • 算术运算指令 20条 • 逻辑运算和移位指令 13条 • 串操作指令 13条 • 控制转移指令 28条 • 处理器控制指令 12条
4.2.1 数据传输指令 说明: · 表示运算结果影响标志位, - 表示运算结果不影响标志位。
4.2.1 数据传输指令 • (一)通用数据传送指令 • 通用数据传送指令包括 • 1.传送指令MOV • 2.数据交换指令XCHG • 3.查表转换指令 XLAT • 4.堆栈操作指令PUSH和POP
4.2.1 数据传输指令 • 1.最基本的传送指令MOV • MOV指令是形式最简单、用得最多的指令。它可以实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的内部寄存器或内存单元。 • 语句格式: MOV OPRD1,OPRD2 • 功能:将源操作数传送入目的地址,源地址内容不变。即(OPRD1)(OPRD2)。 • 其中:OPRD1可以是通用寄存器、段寄存器、存储器操作数;OPRD2可以是通用寄存器、段寄存器、存储器操作数、立即数。
4.2.1 数据传输指令 • 例如: • MOV AL,BL • MOV ES,DX • MOV AX,[BX] • MOV [DI],AX • MOV CX,[1000] • MOV BL,40 • MOV DX,5040 • MOV WORD PTR[SI],6070
4.2.1 数据传输指令 • 注意: • 一般CS和IP的内容不通过MOV指令进行修改,它们只能作为源操作数; • 两个存储器操作数之间不允许直接进行信息传送,但可以用CPU内部寄存器为桥梁来完成这样的传送;如: MOV AX,[SI]; MOV [BX],AX; • 两个段寄存器之间不能直接传送信息,也不允许用立即寻址方式为段寄存器赋初值;如: MOVAX,0 MOVDS,AX • 目的操作数,不能用立即寻址方式; • OPRD1与OPRD2必须类型匹配,即同时是字节或字类型。
4.2.1 数据传输指令 • 例:错误的MOV 指令如下所示: • MOV AX,BL • MOV DS,1000H • MOV [BX],[SI] • MOV ES,CS • MOV CS,AX • 例:设B是已定义的字节变量,判断指令的正确性。 • MOV AX,B • MOV AL,0 ;类型不匹配 ;不允许立即数送段寄存器 ;不允许内存操作数之间传送 ;不允许段寄存器之间传送 ; CS不能作为目的操作数 ;错误,类型不匹配 ;正确,MASM可以判断出要送字节0
4.2.1 数据传输指令 • 2.堆栈操作指令 • 堆栈概念:存储器的一段区域,按“先进后出”的原则进行存出操作。8086/8088系统,堆栈位于堆栈段,其段地址由SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元。 • 作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容 • 语句格式: • 进栈:PUSH OPRD • 操作:(SP)(SP)-2;((SP)+1,(SP))(OPRD) • 出栈:POP OPRD • 操作:(OPRD)((SP)+1,(SP));(SP)(SP)+2 • 注意: • 以上两个指令只能对字操作 • 不能 POP CS
4.2.1 数据传输指令 • 例如:将16位通用寄存器CX的内容压入堆栈,然后,弹出栈顶至CX中 • 已知:(SS)=0200H,(SP)=0008H,(CX)=12FAH
4.2.1 数据传输指令 • 8086/8088系统的堆栈具有如下特点: • 堆栈是在内存的堆栈段中,具有“先进后出”的特点; • 堆栈只有一个出入口,即当前栈顶为空时,栈顶和栈底指向同一内存单元; • 堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反; • 堆栈操作只能作字操作; • SS:SP在任何时候都指向当前的栈顶。
4.2.1 数据传输指令 • 3.交换指令 • 交换指令XCHG可以实现字节交换,也可以实现字交换。 • 语句格式:XCHG OPRD1, OPRD2 • 功能:将源操作数与目的操作数的内容互换 • 注意: • 源操作数和目的操作数可以是寄存器或存储器,但不能同时为存储器; • 段寄存器和立即数不能作为操作数; • 两个操作数字长必须相同。 • 例如: • XCHG AL,BL ;AL和BL之间进行字节交换 • XCHG BX,CX ;BX和CX之间进行字交换 • XCHG [2530],CX ;CX中的内容和2530,2531两单元的内容交换
4.2.1 数据传输指令 • 4.查表指令 • XLAT是一条完成字节翻译功能的指令,它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。 • 语句格式:XLAT • 功能:将(BX)为首地址(AL)为位移量的字节存储单元中的数据送AL寄存器。即([BX+AL])→AL。 • 使用换码指令时,要求BX寄存器指向表的首地址,AL的内容为表中某一项与表格首地址之间的偏移量,指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中去。
4.2.1 数据传输指令 • 下图表示了换码指令的功能。XLAT指令就是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。
4.2.1 数据传输指令 • (二)地址传送指令 • 这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏移地址,共包含以下3条指令:LEA、LDS、LES • 1.取有效地址指令 • 语句格式:LEA OPRD1,OPRD2 • 功能:把源操作数OPRD2的地址偏移量传送至目的操作数OPRD1。 • 注意:LEA指令格式中,要求源操作数必须为内存单元地址,目的操作数必须为一个16位的通用寄存器。这条指令通常用来建立串操作指令所须的寄存器指针。 • 例如: • LEAAX,[2728] ;将2728单元的偏移量送AX,指令执行后,AX中为2728 • LEABX,[BP+SI] ;指令执行后,BX中的内容为BP+SI的值 • LEASP,[0482] ;使堆栈指针SP为482 • 问题: LEA指令与MOV指令有何区别?
4.2.1 数据传输指令 • LEA 指令与MOV 指令的区别: • LEA SI,BUFF;指令是将标号BUFF的偏移地址送入寄存器中; • MOV SI,BUFF;指令是将标号BUFF所指存储单元的内容送入SI。 0 段起始地址 LEA SI,BUFF; 执行后:(SI)=0002H 1 BUFF = 2 48 MOV SI,BUFF; 执行后:(SI)=0048H 3 00 4 FF 5 FF
4.2.1 数据传输指令 • 2.将地址指针装到DS和另一个寄存器的指令 • 语句格式:LDS OPRD1,OPRD2 • 功能:LDS指令的功能是把4个字节的地址指针(其中包括一个段地址和一个偏移量)传送到两个目的寄存器,其中,地址指针的后两个字节即段地址一定送到DS中。 • 例如:LDS SI,[2480] • 已知:(DS)=C000H,(C2480H)=1357H,(C2482H)=2468H DS:2480H 57H DS:2481H 13H DS:2482H 68H 13 57 SI DS:2483H 24H 24 68 DS
4.2.1 数据传输指令 • 3.将地址指针装到ES和另一个寄存器的指令 • 语句格式:LES OPRD1,OPRD2 • 功能:LES指令与LDS指令的操作基本相同,所不同仅在于将源操作数所指向地址指针中的段基址(后两个字节)传送到ES段寄存器,而不是DS段寄存器。 • 例如:LES BX,TABLE[SI]
4.2.1 数据传输指令 • (三)标志传送指令 • 1.读取标志指令 • 语句格式:LAHF • 功能:将标志寄存器的低8位送入AH寄存器。 • 2.设置标志指令SAHF • 语句格式:SAHF • 功能:将AH的内容送入标志寄存器的低8位,高8位不变。从该指令功能可看出,SAHF为LAHF的逆过程。 • 注意:该指令影响标志位S、Z、A、P、C
4.2.1 数据传输指令 • 3.对标志寄存器的压入堆栈指令和弹出堆栈指令 • PUSHF指令将标志寄存器的值压入堆栈顶部,同时,堆栈指针SP的值减2,此指令在执行时标志寄存器的值不变。 • POPF指令的功能正好相反,此指令在执行时从堆栈中弹出一个字送到标志寄存器中,同时堆栈指针SP的值加2。该指令影响标志位O、S、Z、A、P、C • PUSHF和POPF指令一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。
4.2.1 数据传输指令 • (四)输入/输出指令 • 1.输入指令IN • 语句格式: • IN AL,PORT ;AL←[PORT] • IN AX,PORT ;AX←[PORT+1][PORT] • IN AL,DX ;AL←[DX] • IN AX,DX ;AX←[DX+1][DX] • PORT指端口号,即端口寄存器地址。 • 功能:从I/O端口输入数据至AL或AX。 • 注意:输入指令允许把一个字节或一个字由一个输入端口传送到AL或AX中。若端口地址超过255时,则必须用DX保存端口地址,这样用DX作端口寻址最多可寻找64K个端口。
4.2.1 数据传输指令 • 2. 输出指令 • 语句格式: • OUT PORT,AL;AL→ [PORT] • OUT PORT,AX;AX→ [PORT+1][PORT] • OUT DX,AL;AL→ [DX] • OUT DX,AX;AX→ [DX+1][DX] • 功能:将AL或AX的内容输出至I/O端口。 • 注意:该指令将AL或AX中的内容传送到一个输出端口。端口寻址方式与IN指令相同。
4.2.1 数据传输指令 • 例如: • 直接IN指令(口地址只能 8 位) IN AL ,50H IN AX ,80H • 间接IN指令(口地址是16 位,也可8 位) MOV DX,0FFF2H IN AL ,DX • 直接OUT指令(口地址只能 8 位) OUT 44H , AL OUT 70H , AX • 间接OUT指令(口地址是16 位,也可8 位) MOV DX,87FEH MOV AL ,40H OUT DX ,AL
课堂习题及答案 比较下列两条指令,指出它们的区别 假设AX=0002H,DS=2000H,SI=1000H,(21000)=0036H MOV AX,[SI];将内存单元DS:[SI]中的内容读到寄存器AX中 执行后AX=(21000H)=0036H MOV [SI],AX;将寄存器AX中的内容写入内存单元DS:[SI] 执行后(21000H)=0002H MOV AX,[SI];将内存单元DS:[SI]中的内容读到寄存器AX中 执行后AX=(21000H)=0036H LEA AX,[SI];将内存单元DS:[SI]的偏移地址送到AX 执行后AX=1000H