1.71k likes | 1.98k Vues
汇编语言与接口技术. 教师:范新民. 第三章: 8086 微处理器的指令系统. 第三章. 8086 微处理器的指令系统. 第三章: 8086 微处理器的指令系统. 教学要求 :. 本章重点介绍 8088/8086 指令系统中 7 种寻址方式和常用指令系统,此内容是 8088/8086 汇编语言编程的重点内容,它们对编程起着至关重要的作用。. 第三章: 8086 微处理器的指令系统. 本章主要内容:. 3.1 8086 的指令系统 3.2 汇编语言的基本语法 3.3 汇编语言程序设计基础. 第三章: 8086 微处理器的指令系统.
E N D
汇编语言与接口技术 教师:范新民
第三章:8086微处理器的指令系统 第三章 8086微处理器的指令系统
第三章:8086微处理器的指令系统 教学要求: 本章重点介绍8088/8086指令系统中7种寻址方式和常用指令系统,此内容是8088/8086汇编语言编程的重点内容,它们对编程起着至关重要的作用。
第三章:8086微处理器的指令系统 本章主要内容: 3.1 8086 的指令系统 3.2 汇编语言的基本语法 3.3 汇编语言程序设计基础
第三章:8086微处理器的指令系统 3.1 8086的指令系统 3.1.1 8086 指令的寻址方式 3.1.2 8086 指令简析
第三章:8086微处理器的指令系统 3.1.0 概述 指令:控制计算机操作的基本命令形式 指令组成:有操作码 (OP)和操作数(OPRD )两部分 操作码 ——指示计算机要执行的操作; 操作数 ——指出在指令执行操作过程中所需要的 数据。 指令的一般格式:
第三章:8086微处理器的指令系统 8086指令中的操作数可以分为3种类型: 立即数操作数、寄存器操作数和存储器操作数。 • 1、立即数操作数 • 立即数是作为指令代码的一部分出现在指令中。 • 通常作为源操作数使用。 • 书写形式可以为二进制、八进制、十进制和十六进制数,也可以是一个可求出确定值的表达式。
操作数类型 • 2、寄存器操作数 • 操作数存放在寄存器中,用来参加运算或存放结果 • 在双操作数指令中,它可以作为源操作数和目的操作数。其书写形式就是寄存器的名称。 目的操作数(OPD):为指令提供操作数据及操作结果的存放位置,它的值是随执行结果而变化的; 源操作数(OPS):只为指令提供操作数据,其值在指令执行过程中是不变的。 例 ADD AX,BX
操作数类型 • 3.存储器操作数 • 存储器操作数存放在存储器中,其存放的地址出现在指令中; • 其存放的地址应该是物理地址,但在指令中给出的是逻辑地址,段地址是隐含的,一般采用偏移地址EA(或称有效地址)来表示; • 书写形式:假如偏移地址是X,该地址中的内容为Y,则(X)=Y
8086的指令系统 3.1.1 8086 指令的寻址方式 • 寻址:指令执行时寻找操作数地址的过程; • 寻址方式:寻找操作数存放地址的各种方式; • 一般情况下,指令中并不直接给出操作数的数值,而是给出操作数存放的地址——寄存器的地址或存储单元的地址。 • 在许多情况下,操作数的地址也不直接给出,而是给出计算操作数地址的方法。计算机执行程序时,根据指令给出的寻址方式,计算出操作数的地址,然后从该地址中取出操作数进行指令操作码指定的操作,把操作结果送入指定的目的操作数中。
8086 指令的寻址方式: 8086 指令的寻址方式 立即寻址、寄存器寻址、存储器寻址、串操作寻址、外设I/O 端口寻址以及程序转移操作寻址。 存储器寻址: 直接寻址、寄存器寻址、间接寻址、基址寻址、变址寻址、基址变址寻址。 注意:根据寻址方式计算而得的地址只是有效地址EA (段内偏移地址),这一地址还需与所在段的段 基值组合后才能形成20位的物理地址。
操作数据的寻址方式 • 立即寻址 操作数直接放在指令中,即操作数的存放地址就是指令操作码的下一单元的地址,其内容为操作数n。 • 操作数n称为立即操作数可以是8位或16位二进制补码表示的常数,若是16位,则高位字节存放在高地址单元中,低位字节存放在低地址单元中。
操作数据的寻址方式 例:MOV AX,1234H • 该方式不能用在单操作数指令中,不能用于目的操作数字段,只能用于源操作数字段。
操作数据的寻址方式 • 立即数可用二进制、十进制、十六进制表示,也可以使用单引号括起来的ASCII码表达的字符和字符串。 例: MOV AX,‘AB’ 目的操作数地址是AX; 源操作数‘AB’紧跟着指令操作符存放在代码段中。 该指令的功能是将高地址单元中的字母A的ASCII码送 入AH中、低地址单元中的字母B的ASCII码送入AL中。 • 由于立即数是直接从指令中取得的,所以取数速度较快,这种寻址方式常用来给寄存器或存储器赋初值。
操作数据的寻址方式 • 寄存器寻址 • 指令所需操作数存放在指令指定的寄存器中。 • 16位操作数时,寄存器可以是:AX、BX、CX、DX、SI、 DI、SP、CS、DS、ES、SS和BP ; • 8位操作数时,寄存器可以是:AL、AH、BL、BH、CL、CH、DL和DH。 • 特点:寻址方式速度较快。适用于需要经常存取的操作数 例:MOV AX,BX 把BX的内容传送到AX
操作数据的寻址方式 • 注意: • 当指令中的源操作数和目的操作数都是寄存器时,必须采用同样字长的寄存器,否则汇编时会出错; • 两个操作数不能同时为段寄存器; • 目的操作数不能使代码段寄存器。 例:MOV CS,AX 汇编时没有出错,可得机器码为8EC8H,但执行时会发生问题。
存储器寻址 操作数据的寻址方式 操作数在存储器中,CPU要访问存储器操作数,需先计算出操作数的物理地址PA。 • 物理地址(PA)= 段基址X10H + 有效地址(EA) • 段基址由段寄存器的值左移4位所表示 • 有效地址EA由基址寄存器(BX、BP)、变址寄存器(SI、DI)以及指令给出的8位或16位的偏移量中的1个、2个或3个组合而成。 • 根据有效地址给出的方式不同,组成各种不同的寻址方式。
存储器寻址 • 直接寻址 指令操作数字段中存放的是操作数的16位偏移地址EA,即操作数的偏移地址EA与操作码一起存放在代码段中,存放于指令操作码下一字单元中。 • 操作数的物理地址由其所在段的寄存器内容左移4位与指令中给出的偏移地址EA相加形成。如图所示。
42000H 存储器寻址 • EA可以用符号或数值表示,如果EA为数值,则必须用方括号括起来,如果EA用符号表示,则方括号可用可不用。 • 例:MOV AL, [2000H] • 若DS=4000H,则此指令将数据段中物理地址为42000H 单元的内容传送AL寄存器。
存储器寻址 • 操作数可以存放在数据段,也可以存放在其它段,如果放在其它段里,方括号前应给出段寄存器名。 • 例: (1) MOV AX,ES:[2005H] • (2) MOV DH,ES:[2005H] • 执行前:AX=1,ES=3000H ,(32005H)=10H • (32006H)=20H。 • 执行后:ES、(32005H)字节单元内容未变。 • (1)源操作数为16位的字数据,AX=2010H。 • (2)源操作数为8位的字节数据,DH=10H。
存储器寻址 例:MOV AX,BUFA 若BUFA在数据段定义,其偏移地址是1000H,即 BUFA =1000H。 执行前:DS=2000H,AX=222H ,(21000H)=1234H 源操作数采用直接寻址方式, 变量BUFA的偏移地址EA存放于指令操作码下一单元中。 指令的功能是将字类型变量BUFA中的内容送入AX之中。 执行后:AX=1234H。
存储器寻址 • 寄存器间接寻址 • ◆ 操作数的偏移地址EA在指令指定的寄存器中,即寄存器R的内容为操作数的偏移地址EA,而操作数存放在存储器中。 ◆ 操作数物理地址PA的形成: PA= 段寄存器×16+ EA = 段寄存器×10H+ R ◆ 可作间接寻址的寄存器只能 是:SI、DI、BP、BX;
存储器寻址 ◆段寄存器的选择 若指令中指定的寄存器是BX、DI或 SI,则操作数在当前数据段中,操作数的物理地址为: BX PA=DS ×10H +SI DI 若指令中指定的寄存器是BP,则操作数在当前堆栈段中,操作数的物理地址为: PA= SS×10H +BP ◆ 寄存器的间接寻址方式可以用于表格处理,执行完一条指令后,只需修改寄存器内容就可取出表格中的下一项,所以,通常将它们称作地址指示器,用于存取存储器数据。
存储器寻址 例:MOV AX,[BX] 指令执行后: AX=3425H
存储器寻址 例:MOV AX,[BP] 执行前:AX=0,BP=50H,SS=2000H,20050H=1A34H 目的操作数地址是AX ; 源操作数[BP]表示使用寄存器间接寻址,BP的内容为源操作数的偏移地址EA; 源操作数的物理地址: PA=SS ×10H +BP 执行后: AX=1A34H,BP、SS、(20050H)内容未变。
基址寻址(Based Addressing) 存储器寻址 操作数的有效地址(EA)是一个基址寄存器(BX/BP)的内容和指令中指定的8位或16位偏移地址之和。 可表示为: [BX/BP+D]或 D[BX/BP] 其中:D为变量或常量 例:MOV AX,COUNT[BX] 或 MOV AX,[BX+COUNT] INC BYTE PTR[BP+4] • BP作基址寻址时,默认为SS段内寻址;BX作基址时,默认为DS段内寻址。 • 若D为常量,则以有符号的二进制数表示,可为8位或16位值。 • 当D为8位值时,有效地址计算中,位移量必须进行符号扩展
变址寻址(IndexedAddressing) 存储器寻址 指令中给出一个位移量D 作为基准地址,再同变址寄存器SI(或DI)的内容相加作为存储器操作数的有效地址。 可表示为: [SI/DI+D]或 D[SI/DI] 其中:D为变量或常量 例:MOV AX,COUNT[SI] 或 MOV AX,[SI+COUNT] 以变址寄存器SI/DI寻址,默认为DS段内寻址 基址寻址和变址寻址又称为寄存器相对寻址。
D 存储器寻址 PA= 段寄存器×16+R+D 其中: D为8位或16位的位移量,R为基址寄存器或变址寄存器
寄存器相对寻址 例:MOV AL,[BX+5]
BP SS 第二章:微处理器的指令系统 例:MOV AX,NAME[BP] 执行前:AX=0,BP=1000H,SS=2000H ( 21100H)=1234H,NAME=100H 源操作数的物理地址: PA=SS ×16 +BP+ NAME = 21100H 执行后: AX=1234H,BP、SS、 (20010H)内容未变。
存储器寻址 • 基址变址寻址 • 操作数在存储器中,操作数的偏移地址EA是一个基址寄存器和一个变址寄存器之和。 基址寄存器为BX和BP,变址寄存器有 SI 、DI。 操作数的偏移地址EA BX + SI /DI EA= BP + SI/DI PA= 段寄存器×16+ BR+ IR
存储器寻址 例:MOVAX,[BX][SI] 或 MOVAX,[BX+SI] 设:(DS)=5000H (BX)=2000H (SI)=0006H 有效地址EA=2000H+0006H =2006H 物理地址=5000H×10H+ 2006H=52006H 执行结果:AX=0AB78H
4、程序转移寻址 程序转移寻址 • 当程序在本段内发生转移时,需要给出即将转移去执行的那条指令的偏移地址,并用它去取代IP中的原有内容。 • 如果即将转移去执行的指令与原来执行的指令不在同一段中,则还需用新的代码段的段基值去取代CS中的原有内容,此时,操作数作为转移地址使用,分别送到IP和CS。 • 程序转移寻址方式用于:条件转移指令、无条件转移指令、循环指令和转子指令(调用指令)。
相对寻址 程序转移寻址 • 以IP 的内容为基准地址,加上紧跟指令操作码后的相对位移量D ,得到转移地址的偏移地址; • 转移地址的偏移地址为IP+D,D是带符号的二进制数。当D为8位数时,转移范围:-128~+127; 当D为16位数时,转移范围:-32768~+32767。 • 这种寻址方式又称为段内直接转移。 例: JMP ADDR ADDR为转移地址的标号。
段内寄存器寻址 程序转移寻址 以寄存器的内容为转移地址的偏移地址。 例: JMP BX ;BX中的内容即偏移地址。 • 段内间接转移寻址 • 包括存储器操作数中的寄存器间接寻址、变址寻址、基址寻址以及基址变址寻址等几种寻址方式,这些寻址方式求得的操作数即为转移地址的偏移地址。 JMP WORD PTR [BX] , JMP VAR [BX][SI] , JMP WORD PTR [EA](EA 为有效地址)。
JMP 偏移地址 IP 段基址 CS . . . . ∑ 程序块 段间直接转移寻址 程序转移寻址 • 程序从一个代码段转移到另一个代码段称为段间转移,实现段间转移不仅要求改变IP中的指令偏移地址,还要改变CS中的段基值。 • 转移指令中带有两个16位地址: 第一个为转移偏移地址 第二个为转移的段基值
要实现段间转移需要两个16位地址,可以用任何数据存储器的间接寻址方式求得。要实现段间转移需要两个16位地址,可以用任何数据存储器的间接寻址方式求得。 段间间接转移寻址 程序转移寻址 • 汇编指令形式为: • JMP DWORD PTR [EA]
操作数据的寻址方式 5、跨段的有关问题 指令中若不标明段寄存器,就表示操作数在默认存储段中。 • 直接寻址方式的操作数默认在数据段(DS); • 寄存器BP作间址寄存器、或基址寄存器时,操作数默认在堆栈段(SS); • 寄存器BX、SI、DI作间址寄存器、变址寄存器或基址寄存器时,操作数默认在数据段(DS); • 否定默认状态,必须采用跨段前缀指明操作数所在段的段寄存器名。
操作数据的寻址方式 • 跨段前缀的说明: • ;DS左移4位+BP • ;ES左移4位+ BX • ;SS左移4位+ SI • ;SS左移4位+ DI • 例 : • MOV AX,DS:[BP] • MOV BX,ES:[BX] • MOV CX,SS:[SI] • MOV DX,SS:[DI]
8086微处理器的指令系统 3.2 指令简析 8086指令系统有92种基本指令。按功能可分为6大类: • 数据传送类指令 • 算术运算类指令 • 逻辑运算和移位类指令 • 串操作类指令 • 控制转移类指令 • 处理器控制类指令
一、数据传送指令 (共14条) 8086微处理器的指令系统
数据传送指令 • 通用数据传送指令 MOV 格式:MOV dest,src (B/W) • 功能:将源操作数送至目的地址中,即dest→src。 MOV指令可以在CPU内或CPU和存储器之间传送字或字节。 传送的信息可以有如下7种形式: (1) 寄存器到寄存器: MOV AX,BX ;将BX的内容送到AX中。 (2) 立即数到寄存器 MOV AX,03H ;将立即数03H送到AX中。
数据传送指令 (3) 立即数到存储单元:必须用PTR确定操作数类型 MOV BYTE PTR [2000H],12H 功能:将立即数12H送到 (2000H)中。 (4) 存储单元到寄存器 MOV AX,Y[BP][SI] 功能:将地址为(SS) ×16+(BP)+(SI)+位移量Y的存 储单元的内容送到AX中。 (5) 寄存器到存储单元 MOV TABLE,AX 功能:将寄存器AX中的内容送到TABLE存储单元中。
数据传送指令 (6) 寄存器或存储单元到除CS外的段寄存器 MOV DS,DATA 功能:将DATA的内容送到DS中。 (7) 段寄存器到寄存器或存储单元 MOV AX,DS 功能:将段寄存器的内容送到AX中。
数据传送指令 • 使用MOV指令时要注意以下一些问题: • 不允许在两个存储单元之间直接传送数据。 • 不允许在两个段寄存器之间直接传送数据。 • 不允许用立即数直接为段寄存器赋值。 • 不影响标志位。 • 段寄存器CS及立即数不能作为目标操作数; • 传送数据的类型必须匹配;
数据传送指令 • 堆栈操作指令 • 堆栈是内存中的一个特殊存储区(RAM区),用于数据的保存; • 堆栈中的数据只能通过堆栈的一端进行存取,这一端称为“栈顶”; • 堆栈数据总是通过栈顶进行存取,栈顶指针用SP寄存器表示; • 堆栈操作的原则为“先进后出”或“后进先出”; • 堆栈操作必须以“字”为单位进行; • 堆栈中的数据在堆栈段中从地址高端向低端存放,称为向下生长型。
数据传送指令 • 入栈指令 PUSH (W) • 格式:PUSH SRC • 执行的操作:(SRC)→(SP-1)(SP-2),SP-2→SP • 功能:将寄存器、段寄存器或存储器中的一个字数据压入 • 堆栈中。
SS→ AX SS→ ┆ 04 F8 ┆ 0FFEH 0FFFH 1000H F8 ┆ 04 0FFEH 0FFFH 1000H ┆ XX XX 数据传送指令 例:PUSH AX 执行前: AX = 04F8H,SP =1000H 执行后: ( 0FFEH)=04F8H,AX的 内容不变,SP=0FFEH SP→ SP→
SS→ SS→ AX ┆ ┆ 04 F8 SP→ SP→ F8 F8 0FFEH 0FFFH 1000H 0FFEH 0FFFH 1000H 04 04 XX XX 数据传送指令 • 出栈指令 POP (W) • 格式:POP dest • 执行的操作: dest ← (SP+1 , SP ), SP ← SP +2 • 功能:将堆栈栈顶内容弹入寄存器、段寄存器或存储器中 例:POP AX 执行前:AX=1111H 执行后:AX=04F8H SP→
数据传送指令 • 几点说明: • PUSH指令的操作数不能是“立即数”,POP指令的操作数不能是段寄存器CS。 • PUSH和POP指令都不影响标志位。 • 堆栈操作中,当多个数据暂存时,PUSH进入数据的顺序与POP弹出的顺序应相反。 例:依次用堆栈保存AX、BX、CX、DX寄存器的内容,然后再 将它们复原。 • PUSH AX • PUSH BX • PUSH CX • PUSH DX • : • POP DX • POP CX • POP BX • POP AX