480 likes | 669 Views
内容简介. 习题解答. 重点 / 难点. 4. 指令系统. 4.1 指令格式与寻址方式. 4.2 8086/8088CPU 的指令系统. Home. 4. 指令系统. 内容简介. 本章以 8086 微处理器为例介绍微型计算机的指令系统,包括指令格式、寻址方式和各类指令功能。. Home. 4. 指令系统. 重点与难点. 操作码、操作数的基本概念 8086 的 6 种基本寻址方式及有效地址的计算 各类指令的汇编格式、功能、对标志位的影响和注意事项. Home. 1. 4.1 指令格式与寻址方式. 1. 指令格式.
E N D
内容简介 习题解答 重点/难点 4.指令系统 4.1 指令格式与寻址方式 4.2 8086/8088CPU的指令系统 Home
4.指令系统 内容简介 本章以8086微处理器为例介绍微型计算机的指令系统,包括指令格式、寻址方式和各类指令功能。 Home
4.指令系统 重点与难点 • 操作码、操作数的基本概念 • 8086的6种基本寻址方式及有效地址的计算 • 各类指令的汇编格式、功能、对标志位的影响和注意事项 Home
1 4.1 指令格式与寻址方式 1.指令格式 指令格式是指令的编码格式,其体现了指令系统的概貌,说明指令系统的机器目标代码是如何构成的。 指令的构成: Next Home
2 4.1 指令格式与寻址方式 2.寻址方式 • 段内直接寻址 • 段内间接寻址 • 段间直接寻址 • 段间间接寻址 转移地址寻址方式 数 据 寻 址 方 式 • 立即数寻址 • 寄存器寻址 • 存储器寻址 • I/O端口寻址 Back Next Home
3 1.数据寻址方式 1.立即数寻址 例如,MOV AX,2000H ;将2000H送入AX 点击演示! Back Next Home
4 1.数据寻址方式 2.寄存器寻址 例如:MOV SI,CX 点击演示! Back Next Home
5 1.数据寻址方式 3.存储器寻址——直接寻址 例如:MOV AX,[2000H] ;设(DS)=3000H。 点击演示! Back Next Home
6 1.数据寻址方式 3.存储器寻址——寄存器间接寻址 例如:MOV AX,[BX] ;PA=(DS)×16+(BX) 点击演示! Back Next Home
7 1.数据寻址方式 3.存储器寻址——寄存器相对寻址 例如,MOV AX,COUNT[DI] ;操作数PA=(DS)×16+(DI)+COUNT,COUNT代表一个位移量常数 点击演示! Back Next Home
8 1.数据寻址方式 3.存储器寻址——基址变址寻址 例如,MOVAX,MASK[BX][SI] 点击演示! Back Next Home
9 1.数据寻址方式 • (4)I/O端口寻址 • 直接端口寻址 • 可寻址的端口号的范围为0 ~255。 • 例如:IN AL , n • 间接端口寻址 • 可寻址的端口号的范围为0 ~ 65535。先将16位I/O端口地址(0000H ~ FFFFH)存放在规定的DX寄存器中,即通过DX对端口间接寻址。 • 例如:MOV DX , 350 • OUT DX , AL Back Next Home
10 2 转移地址寻址方式 1.段内直接转移寻址 转移地址是一个8位或16位的相对地址偏移量disp,在指令中直接给出,用标号(为存放指令的存储单元地址所起的名字,即符号地址)表示。 例如:JMP LT0 ; LT0是标号 2.段内间接转移寻址 转移地址是16位的寄存器的内容或存储器中两个连续单元的内容 。 例如:JMP BX JMPWORD PTR [BX] Back Next Home
11 2 转移地址寻址方式 3.段间直接转移寻址 指令码中直接给出目标地址的16位段基址和16位段内偏移地址 。 例如:JMP FAR PTR P1 4.段间间接转移寻址 目标地址存放在4个连续存储单元。 例如:JMP DWORD PTR [BX + 020AH] Back Next Home
1 4.2 8086/8088指令系统 8086/8088CPU的指令可分为六大类 l数据传送类指令(Data transfer instructions) l算术运算类指令(Arithmetic instructions) l位操作类指令(Bit manipulation instructions) l串操作类指令(String instructions) l控制转移类指令(Program transfer instructions) l处理器控制类指令(Processor control instructions) Next Home
2 数据传送指令 • 可实现 存储器 寄存器 I/O • 数据传送指令又可分为如下四种: • 通用传送 • 目标地址传送 • 标志传送 • 输入输出 Back Next Home
1.通用传送指令 (1)MOV dest,src; dest←src 传送的是字节还是字取决于指令中涉及的寄 存器是8位还是16位。 具体来说可实现: ① MOV mem/reg1,mem/reg2 指令中两操作数中至少有一个为寄存器 例: MOV CL,DL MOV AX,BX MOV [SI],CX MOV CL,[BX+5]
② MOV reg,data ;立即数送寄存器 ③ MOV mem,data ;立即数送存储单元 ④ MOV acc,mem ;存储单元送累加器 ⑤ MOV mem,acc ;累加器送存储单元 ⑥ MOV segreg,mem/reg ;存储单元/寄存器送 段寄存器 ⑦ MOV mem/reg,segreg ;段寄存器送存储单 元/寄存器
MOV指令使用规则: 1) IP不能作目的寄存器 2) 不允许mem←mem 3) 不允许segreg←segreg 4) 立即数不允许作为目的操作数 5) 不允许segreg←立即数 6) 源操作数与目的操作数类型要一致
几个不能传送的解决办法:用AX作桥梁 • 存储器←存储器: MOV AX,MEM1 MOV MEM2,AX • 段寄存器←段寄存器: MOV AX,DS MOV ES,AX • 段寄存器←立即数: MOV AX,DATA MOV DS,AX
应用举例:将1000H开始的100个存储单元 • 全部填充为ASCII码2AH(*)。 • 程序段如下: • MOV DI,1000H • MOV CX,64H • MOV AL,2AH • AGAIN:MOV [DI],AL • INC DI • DEC CX • JNZ AGAIN • HLT
上程序段存放在代码段中,設(CS)=109EH,则各条指令存放地址如下:上程序段存放在代码段中,設(CS)=109EH,则各条指令存放地址如下: CS : IP 指令 109E : 0100 MOV DI,1000H 109E : 0103 MOV CX,64H 109E : 0106 MOV AL,2AH 109E : 0108 MOV [DI],AL 109E : 010A INC DI 109E : 010B DEC CX 109E : 010C JNZ 0108 109E : 010E HLT 109E : 0110
写入2AH(*)后,数据段中相应存储单元的内容改变如下:写入2AH(*)后,数据段中相应存储单元的内容改变如下: DS:1000 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1010 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1020 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1030 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1040 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1050 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A DS:1060 2A 2A 2A 2A
(2) 堆栈操作指令 什么是堆栈? 按“后进先出(LIFO)”方式工作的存储区域。堆栈以字为单位进行压入弹出操作。 为什么要设置堆栈? 为什么要按 “后进先出”方式工作? 参见下图
主程序 主程序 执行子 程序1 转子程序1 转子程序 执行子程序 2 执行子程序 转子程序2 压栈 压栈 IP’ IP IP IP’(下) IP(下) IP(下) 弹出 返回子程序1 弹出 继续执行 主程序 继续执行 主程序 继续执行 子程序1 返回主程序 返回主程序 (a) (b) 子程序调用示意图 (a) 主程序调子程序; (b) 子程序嵌套示意图
规定由SS指示堆栈段的段基址,堆栈指针SP始终指向堆栈的顶部,SP的初值规定了所用堆栈区的大小。堆栈的最高地址叫栈底。 SS 进栈方向 堆栈段 栈顶 SP 退栈方向 栈底
① 压栈指令 PUSH src ; src为16位操作数 例:PUSH AX ;将AX内容压栈 执行操作:(SP)-1←高字节AH (SP)-2←低字节AL (SP)←(SP)- 2
设(AX)=1020H,执行示意图如图 2-8 存储区 (SS段) 存储区 (SS段) 低地址 低地址 (SP)-2 20 (AL) (SP) (SP)-1 10 (AH) (SP) 进栈方向 执行前 (AX)=1020 执行后 高地址 高地址 PUSH AX指令执行示意图
压栈指令的格式为: PUSH reg PUSH mem/reg PUSH segreg 例如: PUSH AX PUSH [BX] PUSH DS 注意进栈方向是高地址向低地址发展。
② 弹出指令 POP dest 例:POP BX ;将栈顶内容弹至BX 执行操作:(BL)←(SP) (BH)←(SP)+1 (SP)←(SP)+2
POP BX 的执行示意图如下图所示 存储区 (SS段) 存储区 (SS段) 低地址 低地址 20 (SP) 10 (SP)+1 (SP) (SP)+2 出栈方向 20 10 执行后 (BX)=1020 BX 执行前 高地址 高地址 POP BX指令执行示意图
堆栈指令使用时应注意几点: ①堆栈操作总是按字进行 ②不能从栈顶弹出一个字给CS ③堆栈指针为SS:SP,SP永远指向栈顶 ④SP自动进行增减量(-2,+2)
格式:XCHG reg,mem/reg 功能:交换两操作数的内容。 要求:两操作数中必须有一个在寄存器中; 操作数不能为段寄存器和立即数; 源和目地操作数类型要一致。 举例: XCHG AX,BX XCHG [2000],CL (3)交换指令XCHG
(4)查表指令XLAT 执行的操作:AL←[(BX)+(AL)] 又叫查表转换指令,它可根据表项序号查出表中对应代码的内容。执行时先将表的首地址(偏移地址)送到BX中,表项序号存于AL中。 例如:内存数据段有一张16进制数的ASCII码表,设首地址为2000H,如欲查出表中第11个代码(代码序号从0开始)即十六进制数B的ASCII码。ASCII表在DS段中,并假设(DS)=4000H。见下页图。 ‘ ’
存储器 42000H+0 30 ‘0’ 31 ‘1’ 32 ‘2’ ... 39 ‘9’ 41 ‘A’ 42000H+0BH 42 ‘B’ ... 45 ‘E’ 46 ‘F’ ... 十六进制数ASCII码表
则可用如下几条指令实现: MOV BX,2000H;(BX)←表首地址 MOV AL,0BH;(AL)←序号 XALT; 查表转换 执行后得到:(AL)= 42H = ’ B’ 注意:转换表长度最大为256个表项(字节)。
(5)字节-字转换指令 格式:CBW ;把AL的符号位复制到AH CWD ;把AX的符号位复制到DX 用途:用于有符号数的除法。 例如:(AL) = A7H,则执行CBW后,AH的内 容为FFH。
2. 输入输出(I/O)指令 只限于用累加器AL或AX来传送信息。 功能: (累加器)←→I/O端口 (1)输入指令IN 格式: IN acc,PORT ;PORT端口号0~255 IN acc,DX ;DX表示的端口范围达64K 例:IN AL,80H ;(AL)←(80H端口) IN AL,DX ;(AL)←((DX))
例:OUT 68H,AX ;(69H,68H)←(AX) OUT DX,AL ;((DX))←(AL) 在使用间接寻址的IN/OUT指令时,要事先用传送指令把I/O端口号设置到DX寄存器,如: MOV DX,220H IN AL,DX ;将220H端口内容读入AL (2) 输出指令OUT格式:OUT port,acc OUT DX,acc
3. 地址传送指令 共有三条: 格式:LEA reg,mem ; 将指定存储器的16位偏移 地址送指定寄存器 LDS reg, mem32; DS:reg←(mem开始的四 个内存单元) LES reg, mem32; 同上,但DS改为ES 要求源操作数必须是一个内存操作数,目的操作数必须是一个16位的通用寄存器。
设:(SI)=1000H 则执行该指令后,(BX)=1010H 注意以下两条指令差别: LEA BX,BUFFER MOV BX,BUFFER 前者表示将符号地址为BUFFER的存储单元的偏侈地址取到BX中;后者表示将BUFFER存储单元中的内容取到BX中. 例:LEA BX,[SI+10H]
下面两条指令等效: LEA BX,BUFFER MOV BX, OFFSET BUFFER 其中OFFSET BUFFER表示存储器单元BUFFER的偏移地址。 二者都可用于取存储器单元的偏移地址,但LEA指令可以取动态的地址,OFFSET只能取静态的地址。
4.标志传送指令 共有四条: (1)读标志指令LAHF LAHF把标志寄存器低8位中的5个标志位传送到AH中的指定位,如下图所示: AH CF PF SF FLAG ZF AF TF IF DF OF LAHF指令的功能
(2)设置标志指令SAHF SAHF的功能与LAHF的功能正好相反,用图来示意,只要将上图中5个箭头方向反一下即可。 AH FLAG SF DF AF OF TF PF CF ZF IF SAHF指令的功能
执行的操作:(SP)-1←标志寄存器高8位 (SP)-2←标志寄存器低8位 (SP)←(SP)-2 (4)从栈顶弹出标志寄存器指令POPF 执行的操作:标志寄存器低8位←(SP) 标志寄存器高8位←(SP)+1 (SP)←(SP)+2 PUSHF和POPF指令用于保护和恢复标志寄存器内容。 (3)把标志寄存器推入栈顶指令PUSHF
例如: PUSH AX PUSH CX PUSHF ;保护标志寄存器内容 ;这段程序要用到AX,CX以及标志位 POPF ;恢复标志寄存器内容 POP CX POP AX . . .
数据传送指令中,除SAHF和POPF这两条指令外,其余所有指令均不影响标志位。数据传送指令中,除SAHF和POPF这两条指令外,其余所有指令均不影响标志位。
4.指令系统 • 小 结 • 通过本章的学习: • 明确各种寻址方式的区别和特点; • 掌握有效地址和物理地址的计算方法; • 掌握各类指令的功能、对标志位的影响和使用上的一些特殊限制 ; • 能够编写小汇编程序,初步掌握汇编程序的编写和调试方法。 Back Home