1.53k likes | 1.77k Views
第 3 章. 教学重点. 8088/8086 的寻址方式 8088/8086 的基本指令 传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 控制转移指令. 操作码. 操作数. 指令的基本组成. 操作码 说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 操作数 指明参与操作的数是谁或存放在何处 寻找操作数的方法叫寻址方式 在转移调用指令中寻找新的转移地址也是寻址方式。. 指令由操作码和操作数两部分组成. §1 操作数的寻址方式. 指令系统设计了多种操作数的来源 寻找操作数的过程就是操作数的寻址
E N D
教学重点 • 8088/8086的寻址方式 • 8088/8086的基本指令 • 传送指令 • 算术运算指令 • 逻辑运算和移位指令 • 串操作指令 • 控制转移指令
操作码 操作数 指令的基本组成 • 操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 • 操作数 指明参与操作的数是谁或存放在何处 • 寻找操作数的方法叫寻址方式 • 在转移调用指令中寻找新的转移地址也是寻址方式。 指令由操作码和操作数两部分组成
§1 操作数的寻址方式 • 指令系统设计了多种操作数的来源 • 寻找操作数的过程就是操作数的寻址 • 理解操作数的寻址方式是理解指令功能的前提 • 操作数采取哪一种寻址方式 • 一方面,会影响处理器执行指令的速度和效率 • 另一方面,对程序设计也很重要
一、 立即数寻址方式 • 指令中直接给出一个常数作为操作数,其紧跟在操作码之后存放在代码段中。立即数直接从指令队列中取得,不用总线周期,执行数度快。 • 这种操作数被称为立即数 • 可以是8位数值(00H~FFH) • 也可以是16位数值(0000H~FFFFH) • 立即数寻址方式常用来给寄存器和存储单元赋值,多以常量形式出现 • 注意:立即数只能是整数而且是常数。 MOV AX, 0102H ;AX←0102H 演示
二、 寄存器寻址方式 • 指令中指明某个寄存器其内容即为操作数,寄存器在CPU内,不用总线周期,执行速度快。 • 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 演示
三、直接寻址方式 • 指令中直接给出操作数所在内存单元的有效地址 (EA即偏移地址) • 默认的段地址在DS段寄存器,若在其它段可使用段超越前缀改变。 • 用方括号包含有效地址,表达存储单元的内容 • 直接地址也可用标号代表,方括号可省略。 MOV AX, [2000H] ;AX←DS:[2000H] 演示 MOV AX, ES: [2000H] ;AX←ES:[2000H]
四、寄存器间接寻址方式 • 指令中给出的寄存器的内容包含操作数的有效地址。 • 间接寻址中使用的寄存器名要用方括号括起来 1、基址寻址 用BX或BP作间接寻址寄存器 如:MOV AX,[BX] ;隐含在DS段 MOV AX,[BP] ;隐含在SS段 MOV AX, [BX] ;AX←DS:[BX] 演示
2、变址寻址 用SI或DI作间接寻址寄存器 如:MOV CL, [SI] MOV AX, [DI] 单独使用SI或DI时,隐含在DS段中 在串操作时,SI隐含在DS段中,DI隐含在ES段中。 3、相对基址寻址 指令中给出基址寄存器及位移量,二者之和为操作数的有效地址。 位移量可以是8位或16位。 有效地址=BX/BP+8/16位位移量
4、相对变址寻址 指令中给出变址寄存器及位移量,二者之和为操作数的有效地址。 有效地址=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]
5、 基址变址寻址方式 • 有效地址由基址寄存器(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]
6、 相对基址变址寻址方式 • 有效地址是基址寄存器(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]
各种寻址方式综合举例 • 设BX=1200H DI=10A0H 位移量=2BC0H DS=2400H 求各种寻址方式下的有效地址和物理地址。 ① 直接寻址 指令形式: MOV AX, [2BC0H] EA= 2BC0H 物理地址=24000H+2BC0H=26BC0H ② 基址寻址 指令形式: MOV AX, [BX] EA= 1200H 物理地址=24000H+1200H=25200H
③ 变址寻址 指令形式: MOV AX, [DI] EA= 10A0H 物理地址=24000H+10A0H=250A0H ④ 相对基址寻址 MOV AX, [BX+2BC0H] EA= 1200H+2BC0H=3DC0H 物理地址=24000H+3DC0H=27DC0H ⑤ 相对基址寻址 MOV AX, [DI+2BC0H] EA= 10A0H+2BC0H=3C60H 物理地址=24000H+3C60H=27C60H
⑥相对基址变址寻址 MOV AX, [BX+DI+2BC0H] EA= 1200H+10A0H+2BC0H=4E60H 物理地址=24000H+4E60H=28E60H
11 MOD REG REG R/M R/M 操作码 操作码 §2 8086的指令格式 一、指令格式 REG--寄存器 MOD--模式 R/M--寄存器或内存 单字节指令(隐含操作数) 操作码 单字节指令(寄存器模式) 操作码(R) 双字节指令(寄存器到寄存器模式) 不带位移量的寄存器和内存之间的传送
MOD 11 MOD REG 操作码 操作码 R/M R/M R/M 操作码 位移低位 位移高位 操作码 数据低位 数据高位 操作码 位移低位 位移高位 数据低位 数据高位 REG--寄存器 MOD--模式 R/M--寄存器或内存 四字节指令 带位移量的寄存器和内存之间的传送(设位移量为16位) 立即数送寄存器(设立即数为16位) 六字节指令 立即数送内存(设位移量为16位)
在操作码中一般有3位 W、 D、 S • W=0 表示字节操作 W=1表示字操作 • D=0 REG是源操作数 D=1是目的操作数 • S是扩展位 (用于加、减和比较和W组合使用) • S=0 W=0 8位操作数 • S=0 W=1 16位操作数 • S=1 W=1 由8位扩展为16位操作数
MOD REG R/M 寻址方式 计算存储器地址方法 寄存器名 • 单字节指令中可隐含指出寄存器名,此类指令少,但执行速度较快。 • 8086规定:双操作数指令中(除立即数和串操作指令),其中一个操作数必须在寄存器中,可缩短指令长度,另一个操作数可以在寄存器中也可以在内存单元中。 • 8086指令中第二个字节,给出两个操作数在什么地方,以及计算存储器地址的方法。
MOD=11,表明第二个操作数也在寄存器中,则R/M指明其名称,与REG编码相同。MOD=11,表明第二个操作数也在寄存器中,则R/M指明其名称,与REG编码相同。
MOD R/M
二、段寄存器的隐含访问 • 一般指令中不出现段寄存器名称,而用隐含关系指明。 • 如与隐含关系不同,运用前缀改变。 • ① [BX] 隐含于DS段 • ②[BP] 隐含于SS段 • ③ [SI]、[DI]单独使用隐含于DS段 • ④ 基址寄存器和变址寄存器同时出现,以基址寄存器隐含关系为准。
[SP]隐含于SS段 • [SI]、[DI]用于串操作时,[SI]隐含于DS段, [DI]隐含于ES段。 • 使用前缀的形式 ADD AX, ES:[SI] 或 ES:ADD AX, [SI]
三、指令执行时间 • 一般用所需的时钟周期数表明 • 指令执行时间=基本执行时间+计算有效地址时间 • +为取操作数和存放结果而访问内存的时间
§3 8086指令系统 • 8086指令系统很丰富,包含133条基本指令,功能强。 • 一般分为五类来介绍 • 传送指令 • 算术运算指令 • 逻辑运算和移位指令 • 串操作指令 • 控制转移指令
一、数据传送类指令 • 数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令 • 传送指令把数据从一个位置传送到另一个位置 • 除标志寄存器传送指令外,均不影响标志位 • 重点掌握 MOV XCHG PUSH POP XLAT LEA
1、通用数据传送指令 • 提供方便灵活的通用传送操作 • 有3条指令 MOV XCHG PUSH POP MOV XCHG PUSH
① 基本传送指令MOV(move) • 把一个字节或字的操作数从源地址传送至目的地址 MOV reg/mem,imm ;立即数送寄存器或主存 MOV reg/mem/seg,reg ;寄存器送(段)寄存器或主存 MOV reg/seg,mem ;主存送(段)寄存器 MOV reg/mem,seg ;段寄存器送寄存器或主存 演示
以字母开头的常数要有前导0 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 • 明确指令是字节操作还是字操作
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,字节传送 • 寄存器具有明确的字节和字类型
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] • 不存在存储器向存储器的传送指令
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 MOV指令传送功能图解 MOV指令也并非任意传送! • 非法指令的主要现象: • 两个操作数的类型不一致 • 无法确定是字节量还是字量操作 • 两个操作数都是存储器 • 段寄存器的操作有一些限制
非法指令--两个操作数类型不一致 • 在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令 MOV AL, 050AH ;非法指令,修正: ;mov ax,050ah MOV SI, DL ;非法指令,修正: ;mov dh,0 ;mov si,dx
非法指令--无法确定是字节量还是字量操作 • 当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明 MOV [BX+SI], 255 ;非法指令,修正: ;mov byte ptr [bx+si],255 ;byte ptr 说明是字节操作 ;mov word ptr [bx+si],255 ;word ptr 说明是字操作
非法指令--两个操作数都是存储器 • 8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数) MOV buf2, buf1 ;非法指令,修正: ;假设buf2和buf1是两个字变量 ;mov ax,buf1 ;mov buf2,ax ;假设buf2和buf1是两个字节变量 ;mov al,buf1 ;mov buf2,al
非法指令--段寄存器的操作有一些限制 • 8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活 MOV DS, ES ;非法指令,修正: ;mov ax,es ;mov ds,ax MOV DS, 100H ;非法指令,修正: ;mov ax,100h ;mov ds,ax MOV CS, [SI] ;非法指令 ;指令存在,但不能执行
② 交换指令XCHG(exchange) • 把两个地方的数据进行互换 XCHG reg,reg/mem ;reg reg/mem • 寄存器与寄存器之间对换数据 • 寄存器与存储器之间对换数据 • 不能在存储器与存储器之间对换数据 演示
数据交换指令举例 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 [BX],[SI] 错误! 段寄存器中CS、IP不能做操作数
③ 堆栈操作指令 • 堆栈是一个“后进先出LIFO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址 • 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定 • 堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP • 堆栈由栈底向低地址方向生成 图示
进栈指令PUSH • 进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部 PUSH r16/m16/seg ;SP←SP-2 ;SS:[SP]←r16/m16/seg 演示 push ax push [2000h]
出栈指令POP • 出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2 POP r16/m16/seg ; r16/m16/seg←SS:[SP] ;SP←SP+2 演示 pop ax pop wvar
堆栈操作的特点 • 堆栈操作的单位是字,进栈和出栈只对字进行 • 数据从栈顶压入和弹出时,都是低地址送低字节,高地址送高字节 • 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据 • 堆栈段是程序中不可或缺的一个内存区,常用来 • 临时存放数据 • 传递参数 • 保存和恢复寄存器
6FH SP 11FFEH A2H 11FFFH 栈底 SP 12000H • 应用举例: 设 SS=1000H SP=2000H AX=A26FH 执行 PUSH AX 指令的过程和结果 SP-2= 1FFEH 则AX内容压入内存 11FFEH和11FFFH 执行后SP=1FFEH (11FFEH)=6FH (11FFFH)=A2H
练习1:已知SS=1200H 执行 MOV AX, 3765H MOV BX, 4288H MOV SP, 1020H PUSH AX PUSH BX POP CX 执行后 AX=( ) BX=( ) CX=( ) SP=( ) 3765H,4288H,4288H,101EH
2、累加器专用传送指令 ① 输入输出指令(IN/OUT指令) 格式:IN AL,port;port为直接端口地址 IN AL,DX ;DX的内容为端口地址(间接方式) IN AX,port; IN AX, DX OUT port, AL OUT DX, AL OUT port, AX OUT DX, AX
注意:①只能用累加寄存器不能用其它寄存器 ②当端口地址在00H—FFH之间可以用直接地址 当端口地址大于FFH时必须用DX间址形式 例:IN AL,40H; (40H) AL IN AX,80H; (80H)、(81H) AX MOV DX, 0382H IN AL,DX ; (0382H) AL OUT 62H, AL MOV DX, 0380H OUT DX,AX
②换码指令XLAT(查表指令) • 将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL XLAT;al←ds:[bx+al] 演示 • 换码指令执行前: • 在主存建立一个字节量表格,内含要转换成的目的代码 • 表格首地址存放于BX,AL存放相对表格首地址的位移量 • 换码指令执行后: • 将AL寄存器的内容转换为目标代码
③址传送指令 三条LEA 、LDS、LES • 将存储器操作数的有效地址送至指定的16位通用寄存器 LEA r16, mem ;r16←mem的有效地址EA 例1: 有效地址的获取 LEA AX, [2375H] ; AX=2375H LEA SP, [BX+SI] ; SP=(BX)+(SI) 区别: LEA SI, BUFF; SI=BUFF MOV SI,BUFF; SI=(BUFF)