1 / 171

汇编语言与接口技术

汇编语言与接口技术. 教师:范新民. 第三章: 8086 微处理器的指令系统. 第三章. 8086 微处理器的指令系统. 第三章: 8086 微处理器的指令系统. 教学要求 :. 本章重点介绍 8088/8086 指令系统中 7 种寻址方式和常用指令系统,此内容是 8088/8086 汇编语言编程的重点内容,它们对编程起着至关重要的作用。. 第三章: 8086 微处理器的指令系统. 本章主要内容:. 3.1 8086 的指令系统 3.2 汇编语言的基本语法 3.3 汇编语言程序设计基础. 第三章: 8086 微处理器的指令系统.

ethel
Download Presentation

汇编语言与接口技术

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 汇编语言与接口技术 教师:范新民

  2. 第三章:8086微处理器的指令系统 第三章 8086微处理器的指令系统

  3. 第三章:8086微处理器的指令系统 教学要求: 本章重点介绍8088/8086指令系统中7种寻址方式和常用指令系统,此内容是8088/8086汇编语言编程的重点内容,它们对编程起着至关重要的作用。

  4. 第三章:8086微处理器的指令系统 本章主要内容: 3.1 8086 的指令系统 3.2 汇编语言的基本语法 3.3 汇编语言程序设计基础

  5. 第三章:8086微处理器的指令系统 3.1 8086的指令系统 3.1.1 8086 指令的寻址方式 3.1.2 8086 指令简析

  6. 第三章:8086微处理器的指令系统 3.1.0 概述 指令:控制计算机操作的基本命令形式 指令组成:有操作码 (OP)和操作数(OPRD )两部分 操作码 ——指示计算机要执行的操作; 操作数 ——指出在指令执行操作过程中所需要的 数据。 指令的一般格式:

  7. 第三章:8086微处理器的指令系统 8086指令中的操作数可以分为3种类型: 立即数操作数、寄存器操作数和存储器操作数。 • 1、立即数操作数 • 立即数是作为指令代码的一部分出现在指令中。 • 通常作为源操作数使用。 • 书写形式可以为二进制、八进制、十进制和十六进制数,也可以是一个可求出确定值的表达式。

  8. 操作数类型 • 2、寄存器操作数 • 操作数存放在寄存器中,用来参加运算或存放结果 • 在双操作数指令中,它可以作为源操作数和目的操作数。其书写形式就是寄存器的名称。 目的操作数(OPD):为指令提供操作数据及操作结果的存放位置,它的值是随执行结果而变化的; 源操作数(OPS):只为指令提供操作数据,其值在指令执行过程中是不变的。 例 ADD AX,BX

  9. 操作数类型 • 3.存储器操作数 • 存储器操作数存放在存储器中,其存放的地址出现在指令中; • 其存放的地址应该是物理地址,但在指令中给出的是逻辑地址,段地址是隐含的,一般采用偏移地址EA(或称有效地址)来表示; • 书写形式:假如偏移地址是X,该地址中的内容为Y,则(X)=Y

  10. 8086的指令系统 3.1.1 8086 指令的寻址方式 • 寻址:指令执行时寻找操作数地址的过程; • 寻址方式:寻找操作数存放地址的各种方式; • 一般情况下,指令中并不直接给出操作数的数值,而是给出操作数存放的地址——寄存器的地址或存储单元的地址。 • 在许多情况下,操作数的地址也不直接给出,而是给出计算操作数地址的方法。计算机执行程序时,根据指令给出的寻址方式,计算出操作数的地址,然后从该地址中取出操作数进行指令操作码指定的操作,把操作结果送入指定的目的操作数中。

  11. 8086 指令的寻址方式: 8086 指令的寻址方式 立即寻址、寄存器寻址、存储器寻址、串操作寻址、外设I/O 端口寻址以及程序转移操作寻址。 存储器寻址: 直接寻址、寄存器寻址、间接寻址、基址寻址、变址寻址、基址变址寻址。 注意:根据寻址方式计算而得的地址只是有效地址EA (段内偏移地址),这一地址还需与所在段的段 基值组合后才能形成20位的物理地址。

  12. 操作数据的寻址方式 • 立即寻址 操作数直接放在指令中,即操作数的存放地址就是指令操作码的下一单元的地址,其内容为操作数n。 • 操作数n称为立即操作数可以是8位或16位二进制补码表示的常数,若是16位,则高位字节存放在高地址单元中,低位字节存放在低地址单元中。

  13. 操作数据的寻址方式 例:MOV AX,1234H • 该方式不能用在单操作数指令中,不能用于目的操作数字段,只能用于源操作数字段。

  14. 操作数据的寻址方式 • 立即数可用二进制、十进制、十六进制表示,也可以使用单引号括起来的ASCII码表达的字符和字符串。 例: MOV AX,‘AB’ 目的操作数地址是AX; 源操作数‘AB’紧跟着指令操作符存放在代码段中。 该指令的功能是将高地址单元中的字母A的ASCII码送 入AH中、低地址单元中的字母B的ASCII码送入AL中。 • 由于立即数是直接从指令中取得的,所以取数速度较快,这种寻址方式常用来给寄存器或存储器赋初值。

  15. 操作数据的寻址方式 • 寄存器寻址 • 指令所需操作数存放在指令指定的寄存器中。 • 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

  16. 操作数据的寻址方式 • 注意: • 当指令中的源操作数和目的操作数都是寄存器时,必须采用同样字长的寄存器,否则汇编时会出错; • 两个操作数不能同时为段寄存器; • 目的操作数不能使代码段寄存器。 例:MOV CS,AX 汇编时没有出错,可得机器码为8EC8H,但执行时会发生问题。

  17. 存储器寻址 操作数据的寻址方式 操作数在存储器中,CPU要访问存储器操作数,需先计算出操作数的物理地址PA。 • 物理地址(PA)= 段基址X10H + 有效地址(EA) • 段基址由段寄存器的值左移4位所表示 • 有效地址EA由基址寄存器(BX、BP)、变址寄存器(SI、DI)以及指令给出的8位或16位的偏移量中的1个、2个或3个组合而成。 • 根据有效地址给出的方式不同,组成各种不同的寻址方式。

  18. 存储器寻址 • 直接寻址 指令操作数字段中存放的是操作数的16位偏移地址EA,即操作数的偏移地址EA与操作码一起存放在代码段中,存放于指令操作码下一字单元中。 • 操作数的物理地址由其所在段的寄存器内容左移4位与指令中给出的偏移地址EA相加形成。如图所示。

  19. 42000H 存储器寻址 • EA可以用符号或数值表示,如果EA为数值,则必须用方括号括起来,如果EA用符号表示,则方括号可用可不用。 • 例:MOV AL, [2000H] • 若DS=4000H,则此指令将数据段中物理地址为42000H 单元的内容传送AL寄存器。

  20. 存储器寻址 • 操作数可以存放在数据段,也可以存放在其它段,如果放在其它段里,方括号前应给出段寄存器名。 • 例: (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。

  21. 存储器寻址 例:MOV AX,BUFA 若BUFA在数据段定义,其偏移地址是1000H,即 BUFA =1000H。 执行前:DS=2000H,AX=222H ,(21000H)=1234H 源操作数采用直接寻址方式, 变量BUFA的偏移地址EA存放于指令操作码下一单元中。 指令的功能是将字类型变量BUFA中的内容送入AX之中。 执行后:AX=1234H。

  22. 存储器寻址 • 寄存器间接寻址 • ◆ 操作数的偏移地址EA在指令指定的寄存器中,即寄存器R的内容为操作数的偏移地址EA,而操作数存放在存储器中。 ◆ 操作数物理地址PA的形成: PA= 段寄存器×16+ EA = 段寄存器×10H+ R ◆ 可作间接寻址的寄存器只能 是:SI、DI、BP、BX;

  23. 存储器寻址 ◆段寄存器的选择 若指令中指定的寄存器是BX、DI或 SI,则操作数在当前数据段中,操作数的物理地址为: BX PA=DS ×10H +SI DI 若指令中指定的寄存器是BP,则操作数在当前堆栈段中,操作数的物理地址为: PA= SS×10H +BP ◆ 寄存器的间接寻址方式可以用于表格处理,执行完一条指令后,只需修改寄存器内容就可取出表格中的下一项,所以,通常将它们称作地址指示器,用于存取存储器数据。

  24. 存储器寻址 例:MOV  AX,[BX] 指令执行后: AX=3425H

  25. 存储器寻址 例:MOV AX,[BP] 执行前:AX=0,BP=50H,SS=2000H,20050H=1A34H 目的操作数地址是AX ; 源操作数[BP]表示使用寄存器间接寻址,BP的内容为源操作数的偏移地址EA; 源操作数的物理地址: PA=SS ×10H +BP 执行后: AX=1A34H,BP、SS、(20050H)内容未变。

  26. 基址寻址(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位值时,有效地址计算中,位移量必须进行符号扩展

  27. 变址寻址(IndexedAddressing) 存储器寻址 指令中给出一个位移量D 作为基准地址,再同变址寄存器SI(或DI)的内容相加作为存储器操作数的有效地址。 可表示为: [SI/DI+D]或 D[SI/DI] 其中:D为变量或常量 例:MOV AX,COUNT[SI] 或 MOV AX,[SI+COUNT] 以变址寄存器SI/DI寻址,默认为DS段内寻址 基址寻址和变址寻址又称为寄存器相对寻址。

  28. D 存储器寻址 PA= 段寄存器×16+R+D 其中: D为8位或16位的位移量,R为基址寄存器或变址寄存器

  29. 寄存器相对寻址 例:MOV   AL,[BX+5]

  30. 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)内容未变。

  31. 存储器寻址 • 基址变址寻址 • 操作数在存储器中,操作数的偏移地址EA是一个基址寄存器和一个变址寄存器之和。 基址寄存器为BX和BP,变址寄存器有 SI 、DI。 操作数的偏移地址EA BX + SI /DI EA= BP + SI/DI PA= 段寄存器×16+ BR+ IR

  32. 存储器寻址 例:MOVAX,[BX][SI] 或 MOVAX,[BX+SI] 设:(DS)=5000H (BX)=2000H (SI)=0006H 有效地址EA=2000H+0006H =2006H 物理地址=5000H×10H+ 2006H=52006H 执行结果:AX=0AB78H

  33. 4、程序转移寻址 程序转移寻址 • 当程序在本段内发生转移时,需要给出即将转移去执行的那条指令的偏移地址,并用它去取代IP中的原有内容。 • 如果即将转移去执行的指令与原来执行的指令不在同一段中,则还需用新的代码段的段基值去取代CS中的原有内容,此时,操作数作为转移地址使用,分别送到IP和CS。 • 程序转移寻址方式用于:条件转移指令、无条件转移指令、循环指令和转子指令(调用指令)。

  34. 相对寻址 程序转移寻址 • 以IP 的内容为基准地址,加上紧跟指令操作码后的相对位移量D ,得到转移地址的偏移地址; • 转移地址的偏移地址为IP+D,D是带符号的二进制数。当D为8位数时,转移范围:-128~+127; 当D为16位数时,转移范围:-32768~+32767。 • 这种寻址方式又称为段内直接转移。 例: JMP ADDR ADDR为转移地址的标号。

  35. 段内寄存器寻址 程序转移寻址 以寄存器的内容为转移地址的偏移地址。 例: JMP BX ;BX中的内容即偏移地址。 • 段内间接转移寻址 • 包括存储器操作数中的寄存器间接寻址、变址寻址、基址寻址以及基址变址寻址等几种寻址方式,这些寻址方式求得的操作数即为转移地址的偏移地址。 JMP WORD PTR [BX] , JMP VAR [BX][SI] , JMP WORD PTR [EA](EA 为有效地址)。

  36. JMP 偏移地址 IP 段基址 CS . . . . ∑ 程序块 段间直接转移寻址 程序转移寻址 • 程序从一个代码段转移到另一个代码段称为段间转移,实现段间转移不仅要求改变IP中的指令偏移地址,还要改变CS中的段基值。 • 转移指令中带有两个16位地址: 第一个为转移偏移地址 第二个为转移的段基值

  37. 要实现段间转移需要两个16位地址,可以用任何数据存储器的间接寻址方式求得。要实现段间转移需要两个16位地址,可以用任何数据存储器的间接寻址方式求得。 段间间接转移寻址 程序转移寻址 • 汇编指令形式为: • JMP DWORD PTR [EA]

  38. 操作数据的寻址方式 5、跨段的有关问题 指令中若不标明段寄存器,就表示操作数在默认存储段中。 • 直接寻址方式的操作数默认在数据段(DS); • 寄存器BP作间址寄存器、或基址寄存器时,操作数默认在堆栈段(SS); • 寄存器BX、SI、DI作间址寄存器、变址寄存器或基址寄存器时,操作数默认在数据段(DS); • 否定默认状态,必须采用跨段前缀指明操作数所在段的段寄存器名。

  39. 操作数据的寻址方式 • 跨段前缀的说明: • ;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]

  40. 8086微处理器的指令系统 3.2 指令简析 8086指令系统有92种基本指令。按功能可分为6大类: • 数据传送类指令 • 算术运算类指令 • 逻辑运算和移位类指令 • 串操作类指令 • 控制转移类指令 • 处理器控制类指令

  41. 一、数据传送指令 (共14条) 8086微处理器的指令系统

  42. 数据传送指令 • 通用数据传送指令 MOV 格式:MOV dest,src (B/W) • 功能:将源操作数送至目的地址中,即dest→src。 MOV指令可以在CPU内或CPU和存储器之间传送字或字节。 传送的信息可以有如下7种形式: (1) 寄存器到寄存器: MOV AX,BX ;将BX的内容送到AX中。 (2) 立即数到寄存器 MOV AX,03H ;将立即数03H送到AX中。

  43. 数据传送指令 (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存储单元中。

  44. 数据传送指令 (6) 寄存器或存储单元到除CS外的段寄存器 MOV DS,DATA 功能:将DATA的内容送到DS中。 (7) 段寄存器到寄存器或存储单元 MOV AX,DS 功能:将段寄存器的内容送到AX中。

  45. 数据传送指令 • 使用MOV指令时要注意以下一些问题: • 不允许在两个存储单元之间直接传送数据。 • 不允许在两个段寄存器之间直接传送数据。 • 不允许用立即数直接为段寄存器赋值。 • 不影响标志位。 • 段寄存器CS及立即数不能作为目标操作数; • 传送数据的类型必须匹配;

  46. 数据传送指令 • 堆栈操作指令 • 堆栈是内存中的一个特殊存储区(RAM区),用于数据的保存; • 堆栈中的数据只能通过堆栈的一端进行存取,这一端称为“栈顶”; • 堆栈数据总是通过栈顶进行存取,栈顶指针用SP寄存器表示; • 堆栈操作的原则为“先进后出”或“后进先出”; • 堆栈操作必须以“字”为单位进行; • 堆栈中的数据在堆栈段中从地址高端向低端存放,称为向下生长型。

  47. 数据传送指令 • 入栈指令 PUSH (W) • 格式:PUSH SRC • 执行的操作:(SRC)→(SP-1)(SP-2),SP-2→SP • 功能:将寄存器、段寄存器或存储器中的一个字数据压入 • 堆栈中。

  48. 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→

  49. 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→

  50. 数据传送指令 • 几点说明: • 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

More Related