770 likes | 1.01k Views
第 4 章 8086 的寻址方式与指令系统. 微机原理与汇编语言程序设计. 主讲人 李乃祥、王秀芬. 第 4 章 8086 的寻址方式与指令系统. 第 4 章: 8086 的寻址方式与指令系统 - 教学重点. 8086 的寻址方式 8086 的基本指令 数据传送 加减运算 逻辑运算、移位 控制转移、功能调用. 第 4 章: 4.1 8086 的数据寻址方式. 从 8086 的指令格式入手,论述: 立即数寻址方式 寄存器寻址方式 存储器寻址方式 进而熟悉 8086 汇编语言指令格式,尤其是其中操作数的表达方法
E N D
第4章 8086的寻址方式与指令系统 微机原理与汇编语言程序设计 主讲人李乃祥、王秀芬
第4章:8086的寻址方式与指令系统-教学重点 • 8086的寻址方式 • 8086的基本指令 • 数据传送 • 加减运算 • 逻辑运算、移位 • 控制转移、功能调用
第4章:4.1 8086的数据寻址方式 • 从8086的指令格式入手,论述: • 立即数寻址方式 • 寄存器寻址方式 • 存储器寻址方式 • 进而熟悉8086汇编语言指令格式,尤其是其中操作数的表达方法 • 为展开8086指令系统做好准备
操作码 操作数 第4章:指令的组成 • 操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 • 操作数是指令执行的参与者,即各种操作的对象 • 有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数 指令由操作码和操作数两部分组成
第4章:指令的助记符格式 • 操作数2,常被称为源操作数src,它表示参与指令操作的一个对象 • 操作数1,成被称为目的操作数dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果 • 分号后的内容是对指令的解释 操作码 操作数1,操作数2;注释 汇编语句格式
第4章:指令的操作码和操作数 • 每种指令的操作码: • 用一个助记符表示(指令功能的英文缩写) • 对应着机器指令的一个或多个二进制编码 • 指令中的操作数: • 可以是一个具体的数值 • 可以是存放数据的寄存器 • 或指明数据在主存位置的存储器地址
第4章:操作数的寻址方式 • 指令系统设计了多种操作数的来源 • 寻找操作数的过程就是操作数的寻址 • 把寻找操作数的方式叫做(操作数)寻址方式 • 理解操作数的寻址方式是理解指令功能的前提 • 操作数采取哪一种寻址方式 • 一方面,会影响处理器执行指令的速度和效率 • 另一方面,对程序设计也很重要 MOV指令
第4章:4.1.1 立即数寻址方式 • 指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中) • 这种操作数被称为立即数imm • 可以是8位数值i8(00H~FFH) • 也可以是16位数值i16(0000H~FFFFH) • 立即数寻址方式常用来给寄存器和存储单元赋值,多以常量形式出现 MOV AX, 0102H ;AX←0102H 演示
第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 演示
第4章: 4.1.3 存储器寻址方式 • 操作数在主存储器中,用主存地址表示 • 程序设计时,8086采用逻辑地址表示主存地址 • 段地址在默认的或用段超越前缀指定的段寄存器中 • 指令中只需给出操作数的偏移地址(有效地址EA) • 8086设计了多种存储器寻址方式 1、直接寻址方式 2、寄存器间接寻址方式 3、寄存器相对寻址方式 4、基址变址寻址方式 5、相对基址变址寻址方式
第4章:1. 直接寻址方式 • 直接寻址方式的有效地址在指令中直接给出 • 默认的段地址在DS段寄存器,可使用段超越前缀改变 • 用中括号包含有效地址,表达存储单元的内容 MOV AX, [2000H] ;AX←DS:[2000H] 演示 MOV AX, ES: [2000H] ;AX←ES:[2000H]
第4章:2. 寄存器间接寻址方式 • 有效地址存放在基址寄存器BX或变址寄存器SI、DI中 • 默认的段地址在DS段寄存器,可使用段超越前缀改变 MOV AX, [BX] ;AX←DS:[BX] 演示
第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]
第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]
第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]
第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]
第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]
第4章:操作数的表达符号(2) • 掌握操作数的寻址方式后,进入指令学习
第4章:4.2 数据传送类指令 • 数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令 • 传送指令把数据从一个位置传送到另一个位置 • 除标志寄存器传送指令外,均不影响标志位 • 重点掌握 MOV XCHG XLAT PUSH POP LEA
第4章: 4.2.1 通用数据传送指令 • 提供方便灵活的通用传送操作 • 有3条指令 MOV XCHG XLAT MOV XCHG XLAT
第4章:1. 传送指令MOV(move) • 把一个字节或字的操作数从源地址传送至目的地址 MOV reg/mem,imm ;立即数送寄存器或主存 MOV reg/mem/seg,reg ;寄存器送(段)寄存器或主存 MOV reg/seg,mem ;主存送(段)寄存器 MOV reg/mem,seg ;段寄存器送寄存器或主存 演示
以字母开头的常数要有前导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 • 明确指令是字节操作还是字操作
第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,字节传送 • 寄存器具有明确的字节和字类型
第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] • 不存在存储器向存储器的传送指令
第4章:MOV指令--段寄存器传送 mov [si],ds mov ax,ds ;ax←ds mov es,ax ;es←ax←ds • 对段寄存器的操作不灵活
立即数 通用寄存器 AX BX CX DX BP SP SI DI 存 储 器 段寄存器 CS DS ES SS 第4章:MOV指令传送功能图解 MOV指令也并非任意传送! 非法指令的主要现象: • 两个操作数的类型不一致 • 无法确定是字节量还是字量操作 • 两个操作数都是存储器 • 段寄存器的操作有一些限制
第4章:非法指令--两个操作数类型不一致 • 在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令 MOV AL, 050AH ;非法指令,修正: ;mov ax,050ah MOV SI, DL ;非法指令,修正: ;mov dh,0 ;mov si,dx
第4章:非法指令--无法确定是字节量还是字量操作第4章:非法指令--无法确定是字节量还是字量操作 • 当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明 MOV [BX+SI], 255 ;非法指令,修正: ;mov byte ptr [bx+si],255 ;byte ptr 说明是字节操作 ;mov word ptr [bx+si],255 ;word ptr 说明是字操作
第4章:非法指令--两个操作数都是存储器 • 8086指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数) MOV buf2, buf1 ;非法指令,修正: ;假设buf2和buf1是两个字变量 ;mov ax,buf1 ;mov buf2,ax ;假设buf2和buf1是两个字节变量 ;mov al,buf1 ;mov buf2,al
第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] ;非法指令 ;指令存在,但不能执行
第4章:2. 交换指令XCHG(exchange) • 把两个地方的数据进行互换 XCHG reg,reg/mem ;reg reg/mem • 寄存器与寄存器之间对换数据 • 寄存器与存储器之间对换数据 • 不能在存储器与存储器之间对换数据 演示
第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类型交换,否则数据类型不匹配
第4章:3. 换码指令XLAT(translate) • 将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL XLAT;al←ds:[bx+al] 演示 • 换码指令执行前: 在主存建立一个字节量表格,内含要转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量 • 换码指令执行后: 将AL寄存器的内容转换为目标代码
第4章:4.2.2 堆栈操作指令 • 堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址 • 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定 • 堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP 图示
第4章:进栈指令PUSH • 进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部 PUSH r16/m16/seg ;SP←SP-2 ;SS:[SP]←r16/m16/seg 演示 push ax push [2000h]
第4章:出栈指令POP • 出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2 POP r16/m16/seg ; r16/m16/seg←SS:[SP] ;SP←SP+2 演示 pop ax pop wvar
第4章:堆栈操作的特点 • 堆栈操作的单位是字,进栈和出栈只对字量 • 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节 • 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据 • 堆栈段是程序中不可或缺的一个内存区,常用来 • 临时存放数据 • 传递参数 • 保存和恢复寄存器
第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. 标志寄存器出入堆栈指令
第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 演示
第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
第4章:4.3 算术运算类指令 • 算术运算类指令用来执行二进制的算术运算:加减乘除。 • 这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志 • 重点掌握 加法指令:ADD、ADC、INC 减法指令:SUB 、SBB、DEC、CMP、NEG
第4章:4.34.1 加法和减法指令 • 加法指令:ADD, ADC和INC • 减法指令:SUB, SBB, DEC, NEG和CMP • 他们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位 • 操作数组合: 运算指令助记符 reg, imm/reg/mem 运算指令助记符 mem, imm/reg
第4章:1. 加和减指令 ADDdest,src ;加法:dest←dest+src ;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数 SUBdest,src ;减法:dest←dest-src ;SUB指令使目的操作数减去源操作数,差的结果送到目的操作数
第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
第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
第4章:2. 带进位加和减指令 ADCdest,src ;加法:dest←dest+src+CF ;ADC指令除完成ADD加法运算外,还要加上进位CF,结果送到目的操作数 SBBdest,src ;减法:dest←dest-src-CF ;SBB指令除完成SUB减法运算外,还要减去借位CF,结果送到目的操作数
第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
第4章:3. 比较指令CMP(compare) CMPdest,src ;做减法运算:dest-src ;CMP指令将目的操作数减去源操作数,但差值不回送目的操作数 • 比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系 cmp ax,bx cmp al,100