1 / 77

微机原理与汇编语言程序设计

第 4 章 8086 的寻址方式与指令系统. 微机原理与汇编语言程序设计. 主讲人 李乃祥、王秀芬. 第 4 章 8086 的寻址方式与指令系统. 第 4 章: 8086 的寻址方式与指令系统 - 教学重点. 8086 的寻址方式 8086 的基本指令 数据传送 加减运算 逻辑运算、移位 控制转移、功能调用. 第 4 章: 4.1 8086 的数据寻址方式. 从 8086 的指令格式入手,论述: 立即数寻址方式 寄存器寻址方式 存储器寻址方式 进而熟悉 8086 汇编语言指令格式,尤其是其中操作数的表达方法

minda
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. 第4章 8086的寻址方式与指令系统 微机原理与汇编语言程序设计 主讲人李乃祥、王秀芬

  2. 第4章 8086的寻址方式与指令系统

  3. 第4章:8086的寻址方式与指令系统-教学重点 • 8086的寻址方式 • 8086的基本指令 • 数据传送 • 加减运算 • 逻辑运算、移位 • 控制转移、功能调用

  4. 第4章:4.1 8086的数据寻址方式 • 从8086的指令格式入手,论述: • 立即数寻址方式 • 寄存器寻址方式 • 存储器寻址方式 • 进而熟悉8086汇编语言指令格式,尤其是其中操作数的表达方法 • 为展开8086指令系统做好准备

  5. 操作码 操作数 第4章:指令的组成 • 操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 • 操作数是指令执行的参与者,即各种操作的对象 • 有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数 指令由操作码和操作数两部分组成

  6. 第4章:指令的助记符格式 • 操作数2,常被称为源操作数src,它表示参与指令操作的一个对象 • 操作数1,成被称为目的操作数dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果 • 分号后的内容是对指令的解释 操作码 操作数1,操作数2;注释 汇编语句格式

  7. 第4章:指令的操作码和操作数 • 每种指令的操作码: • 用一个助记符表示(指令功能的英文缩写) • 对应着机器指令的一个或多个二进制编码 • 指令中的操作数: • 可以是一个具体的数值 • 可以是存放数据的寄存器 • 或指明数据在主存位置的存储器地址

  8. 第4章:操作数的寻址方式 • 指令系统设计了多种操作数的来源 • 寻找操作数的过程就是操作数的寻址 • 把寻找操作数的方式叫做(操作数)寻址方式 • 理解操作数的寻址方式是理解指令功能的前提 • 操作数采取哪一种寻址方式 • 一方面,会影响处理器执行指令的速度和效率 • 另一方面,对程序设计也很重要 MOV指令

  9. 第4章:4.1.1 立即数寻址方式 • 指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中) • 这种操作数被称为立即数imm • 可以是8位数值i8(00H~FFH) • 也可以是16位数值i16(0000H~FFFFH) • 立即数寻址方式常用来给寄存器和存储单元赋值,多以常量形式出现 MOV AX, 0102H ;AX←0102H 演示

  10. 第4章:4.1.2 寄存器寻址方式 • 操作数存放在CPU的内部寄存器reg中: • 8位寄存器r8: AH、AL、BH、BL、CH、CL、DH、DL • 16位寄存器r16: AX、BX、CX、DX、SI、DI、BP、SP • 4个段寄存器seg: CS、DS、SS、ES • 寄存器名表示其内容(操作数) MOV AX, BX ;AX←BX 演示

  11. 第4章: 4.1.3 存储器寻址方式 • 操作数在主存储器中,用主存地址表示 • 程序设计时,8086采用逻辑地址表示主存地址 • 段地址在默认的或用段超越前缀指定的段寄存器中 • 指令中只需给出操作数的偏移地址(有效地址EA) • 8086设计了多种存储器寻址方式 1、直接寻址方式 2、寄存器间接寻址方式 3、寄存器相对寻址方式 4、基址变址寻址方式 5、相对基址变址寻址方式

  12. 第4章:1. 直接寻址方式 • 直接寻址方式的有效地址在指令中直接给出 • 默认的段地址在DS段寄存器,可使用段超越前缀改变 • 用中括号包含有效地址,表达存储单元的内容 MOV AX, [2000H] ;AX←DS:[2000H] 演示 MOV AX, ES: [2000H] ;AX←ES:[2000H]

  13. 第4章:2. 寄存器间接寻址方式 • 有效地址存放在基址寄存器BX或变址寄存器SI、DI中 • 默认的段地址在DS段寄存器,可使用段超越前缀改变 MOV AX, [BX] ;AX←DS:[BX] 演示

  14. 第4章:3. 寄存器相对寻址方式 • 有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI 有效地址=BX/BP/SI/DI+8/16位位移量 • 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变 MOV AX, [SI+06H] ;AX←DS:[SI+06H] 演示 MOV AX, 06H[SI] ;AX←DS:[SI+06H]

  15. 第4章:4. 基址变址寻址方式 • 有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成: 有效地址=BX/BP+SI/DI • 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变 MOV AX, [BX+SI] ;AX←DS:[BX+SI] 演示 MOV AX, [BX][SI] ;AX←DS:[BX+SI]

  16. 第4章:5. 相对基址变址寻址方式 • 有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和: 有效地址=BX/BP+SI/DI+8/16位位移量 • 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变 MOV AX, [BX+DI+6] ;AX←DS:[BX+DI+6] 演示 MOV AX, 6[BX+DI] MOV AX, 6[BX][DI]

  17. 第4章:存储器寻址方式中的变量 • 变量指示内存中的数据,变量名具有地址属性。存储器寻找方式中经常采用变量形式 • 变量的定义 WVAR DW 1234H ;定义16位变量WVAR,具有初值1234H ;假设其偏移地址为10H • 单独引用变量名是直接寻址方式 MOV AX,WVAR ;指令功能:AX=1234H ;等同于 MOV AX,[0010H] • 相对寻址方式中,变量名表示其偏移地址,相当于位移量 MOV AX, [DI+WVAR] ;= MOV AX,WVAR[DI] ;等同于 MOV AX,[DI+0010H]

  18. 第4章:相对寻址方式中的位移量 • 在寄存器相对和相对基址变址寻址方式中,其位移量不仅可用常量表示,也可用符号表示 • 这个符号可以是变量名,例如WVAR变量,而且支持多种表达形式 MOV AX, [DI+WVAR] ; ;等同于 MOV AX, WVAR[DI] MOV AX,[BX+SI+WVAR] ;等同于 MOV AX, [SI+WVAR] ;等同于 MOV AX, WVAR[BX+SI] ;等同于 MOV AX, WVAR[BX][SI]

  19. 第4章:操作数的表达符号(1)

  20. 第4章:操作数的表达符号(2) • 掌握操作数的寻址方式后,进入指令学习

  21. 第4章:4.2 数据传送类指令 • 数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令 • 传送指令把数据从一个位置传送到另一个位置 • 除标志寄存器传送指令外,均不影响标志位 • 重点掌握 MOV XCHG XLAT PUSH POP LEA

  22. 第4章: 4.2.1 通用数据传送指令 • 提供方便灵活的通用传送操作 • 有3条指令 MOV XCHG XLAT MOV XCHG XLAT

  23. 第4章:1. 传送指令MOV(move) • 把一个字节或字的操作数从源地址传送至目的地址 MOV reg/mem,imm ;立即数送寄存器或主存 MOV reg/mem/seg,reg ;寄存器送(段)寄存器或主存 MOV reg/seg,mem ;主存送(段)寄存器 MOV reg/mem,seg ;段寄存器送寄存器或主存 演示

  24. 以字母开头的常数要有前导0 第4章:MOV指令--立即数传送 mov cl,4 ;cl←4,字节传送 mov dx,0ffh;dx←00ffh,字传送 mov si,200h;si←0200h,字传送 mov bvar,0ah;字节传送 ;假设bvar是一个字节变量,定义如下:bvar db 0 mov wvar,0bh;字传送 ;假设wvar是一个字变量,定义如下:wvar dw 0 • 明确指令是字节操作还是字操作

  25. 第4章:MOV指令--寄存器传送 mov ah,al ;ah←al,字节传送 mov bvar,ch ;bvar←ch ,字节传送 mov ax,bx ;ax←bx,字传送 mov ds,ax ;ds←ax,字传送 mov [bx],al ;[bx]←al,字节传送 • 寄存器具有明确的字节和字类型

  26. 第4章:MOV指令--存储器传送 mov al,[bx] ;al←ds:[bx] mov dx,[bp] ;dx←ss:[bp+0] mov dx,[bp+4] ;dx←ss:[bp+4] mov es,[si] ;es←ds:[si] • 不存在存储器向存储器的传送指令

  27. 第4章:MOV指令--段寄存器传送 mov [si],ds mov ax,ds ;ax←ds mov es,ax ;es←ax←ds • 对段寄存器的操作不灵活

  28. 立即数 通用寄存器 AX BX CX DX BP SP SI DI 存 储 器 段寄存器 CS DS ES SS 第4章:MOV指令传送功能图解 MOV指令也并非任意传送! 非法指令的主要现象: • 两个操作数的类型不一致 • 无法确定是字节量还是字量操作 • 两个操作数都是存储器 • 段寄存器的操作有一些限制

  29. 第4章:非法指令--两个操作数类型不一致 • 在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令 MOV AL, 050AH ;非法指令,修正: ;mov ax,050ah MOV SI, DL ;非法指令,修正: ;mov dh,0 ;mov si,dx

  30. 第4章:非法指令--无法确定是字节量还是字量操作第4章:非法指令--无法确定是字节量还是字量操作 • 当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明 MOV [BX+SI], 255 ;非法指令,修正: ;mov byte ptr [bx+si],255 ;byte ptr 说明是字节操作 ;mov word ptr [bx+si],255 ;word ptr 说明是字操作

  31. 第4章:非法指令--两个操作数都是存储器 • 8086指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数) MOV buf2, buf1 ;非法指令,修正: ;假设buf2和buf1是两个字变量 ;mov ax,buf1 ;mov buf2,ax ;假设buf2和buf1是两个字节变量 ;mov al,buf1 ;mov buf2,al

  32. 第4章:非法指令--段寄存器的操作有一些限制第4章:非法指令--段寄存器的操作有一些限制 • 8086指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活 MOV DS, ES ;非法指令,修正: ;mov ax,es ;mov ds,ax MOV DS, 100H ;非法指令,修正: ;mov ax,100h ;mov ds,ax MOV CS, [SI] ;非法指令 ;指令存在,但不能执行

  33. 第4章:2. 交换指令XCHG(exchange) • 把两个地方的数据进行互换 XCHG reg,reg/mem ;reg  reg/mem • 寄存器与寄存器之间对换数据 • 寄存器与存储器之间对换数据 • 不能在存储器与存储器之间对换数据 演示

  34. 第4章:例4.2 数据交换 mov ax,1199h ;ax=1199h xchg ah,al;ax=9911h ;等同于 xchg al,ah mov wvar,5566h ;wvar是一个字量变量 xchg ax,wvar;ax=5566h,wvar=9911h ;等同于 xchg wvar,ax xchg al,byte ptr wvar+1 ;ax=5599h,wvar=6611h ;“byte ptr wvar+1”强制为字节量,只取高字节与AL类型交换,否则数据类型不匹配

  35. 第4章:3. 换码指令XLAT(translate) • 将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL XLAT;al←ds:[bx+al] 演示 • 换码指令执行前: 在主存建立一个字节量表格,内含要转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量 • 换码指令执行后: 将AL寄存器的内容转换为目标代码

  36. 第4章:4.2.2 堆栈操作指令 • 堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址 • 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定 • 堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP 图示

  37. 第4章:进栈指令PUSH • 进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部 PUSH r16/m16/seg ;SP←SP-2 ;SS:[SP]←r16/m16/seg 演示 push ax push [2000h]

  38. 第4章:出栈指令POP • 出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2 POP r16/m16/seg ; r16/m16/seg←SS:[SP] ;SP←SP+2 演示 pop ax pop wvar

  39. 第4章:堆栈操作的特点 • 堆栈操作的单位是字,进栈和出栈只对字量 • 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节 • 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据 • 堆栈段是程序中不可或缺的一个内存区,常用来 • 临时存放数据 • 传递参数 • 保存和恢复寄存器

  40. 第4章:4.2.3 标志操作指令 1. 标志位操作指令 CLC ;复位进位标志:CF←0 STC ;置位进位标志:CF←1 CMC ;求反进位标志:CF←~CF CLD ;复位方向标志:DF←0 STD ;置位方向标志:DF←1 CLI ;复位中断标志:IF←0 STI ;置位中断标志:IF←1 2. 标志寄存器低字节与AH的传送指令 3. 标志寄存器出入堆栈指令

  41. 第4章:有效地址传送指令LEA(load effective address) • 将存储器操作数的有效地址送至指定的16位通用寄存器 LEA r16, mem ;r16←mem的有效地址EA 例题4.5有效地址的获取 mov bx,400h mov si,3ch lea bx,[bx+si+0f62h] ;BX←400H+3CH+0F62H=139EH 演示

  42. 第4章:例4.6 地址传送与内容传送 wvar dw 4142h ;假设偏移地址为04H … mov ax,wvar;内容传送:AX=4142H lea si,wvar;地址传送:SI=0004H ;等同于 lea si, [0004h] mov cx,[si] ;内容传送:CX=4142H mov di,offset wvar;=mov di,0004h ;利用操作符OFFSET获取变量的有效地址 mov dx,[di] ;内容传送:DX=4142H

  43. 第4章:4.3 算术运算类指令 • 算术运算类指令用来执行二进制的算术运算:加减乘除。 • 这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志 • 重点掌握 加法指令:ADD、ADC、INC 减法指令:SUB 、SBB、DEC、CMP、NEG

  44. 第4章:4.34.1 加法和减法指令 • 加法指令:ADD, ADC和INC • 减法指令:SUB, SBB, DEC, NEG和CMP • 他们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位 • 操作数组合: 运算指令助记符 reg, imm/reg/mem 运算指令助记符 mem, imm/reg

  45. 第4章:1. 加和减指令 ADDdest,src ;加法:dest←dest+src ;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数 SUBdest,src ;减法:dest←dest-src ;SUB指令使目的操作数减去源操作数,差的结果送到目的操作数

  46. 第4章:例题4.7 加法 mov ax,7348h ;AX=7348H add al,27h ;AL=48H+27H=6FH,AX=736FH ;OF=0,SF=0,ZF=0,PF=1,CF=0 add ax,3fffh ;AX=736FH+3FFFH=B36EH ;OF=1,SF=1,ZF=0,PF=0,CF=0

  47. 第4章:例题4.7 减法 sub ah,0f0h ;AH=B3H-F0H=C3H,AX=C36EH ;OF=0,SF=1,ZF=0,PF=1,CF=1 mov word ptr[200h],0ef00h ;[200H]=EF00H,标志不变 sub [200h],ax ;[200H]=EF00H-C36EH=2B92H ;OF=0,SF=0,ZF=0,PF=0,CF=0 sub si,si ;SI=0 ;OF=0,SF=0,ZF=1,PF=1,CF=0

  48. 第4章:2. 带进位加和减指令 ADCdest,src ;加法:dest←dest+src+CF ;ADC指令除完成ADD加法运算外,还要加上进位CF,结果送到目的操作数 SBBdest,src ;减法:dest←dest-src-CF ;SBB指令除完成SUB减法运算外,还要减去借位CF,结果送到目的操作数

  49. 第4章:例4.8 无符号双字加法和减法 mov ax,7856h ;AX=7856H mov dx,8234h ;DX=8234H add ax,8998h ;AX=01EEH,CF=1 adc dx,1234h ;DX=9469H,CF=0 sub ax,4491h ;AX=BD5DH,CF=1 sbb dx,8000h ;DX=1468H,CF=0 DX.AX=8234 7856H+1234 8998H-8000 4491H =1468 BD5DH

  50. 第4章:3. 比较指令CMP(compare) CMPdest,src ;做减法运算:dest-src ;CMP指令将目的操作数减去源操作数,但差值不回送目的操作数 • 比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系 cmp ax,bx cmp al,100

More Related