第3章 80x86的指令系统和寻址方式 § x86的寻址方式 § x86的指令系统

Slides:



Advertisements
Similar presentations
输入输出程序设计 输入输出的基本概念 无条件方式输入输出 查询方式输入输出 中断方式输入输出.
Advertisements

汇编语言程序设计 吴 向 军 中山大学计算机科学系
x86/Pentium指令系统 x86寻址方式 1.比例变址寻址方式 (Scaled Indexed Addressing)
微型计算机技术 教 学 指 导(七) 太原广播电视大学 郭建勇.
第10章 DOS功能调用与BIOS中断调用.
第7章 8086/8088汇编语言程序设计 7.1 引言 7.2 顺序程序设计 7.3 分支结构程序设计 7.4 循环结构程序设计
§1 指令的构成和操作数的类型 一、指令构成 一条指令由操怍码字段和操作数字段构成。 1、操作码字段 操作码字段表明指令执行何种性质的操作。
第四章 汇编语言 程序设计 任课教师:王晓甜
大连理工大学软件学院 软件工程系 赖晓晨 计算机组成与结构 大连理工大学软件学院 软件工程系 赖晓晨
输入/输出及接口 输入/输出的传送方式 中断技术 80x86/Pentium中断系统 8259A可编程中断控制器 中断程序设计
本周实验安排 实验内容:(P231)人名排序的例子。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月30日.
第3章 80x86汇编语言程序设计(下).
第3章 80x86汇编语言程序设计(中) 时间不够的情况下只讲16位汇编.
第三章 指令系统及其寻址方式 3.1 寻址方式 3.2 指令格式 3.3 指令系统.
4.1 汇编语言 4.2 顺序结构程序 4.3 分支程序设计 4.4 循环程序设计 4.5 子程序设计
第3章 80x86汇编语言程序设计(上) 16位汇编版本 时间不够的情况下只讲16位汇编.
9.1 可编程并行输入/输出接口芯片8255A 9.2 可编程计数器/定时器 可编程串行输入/输出接口芯片8251A
3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月26日.
微机原理与接口技术 第3章 8086/8088指令系统 黄强 深圳大学 信息工程学院.
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
汇编语言程序设计 Assembly Language Programming
第三章 寻址方式与指令系统 3.1 寻址方式 一条指令通常由两大部分构成: 操作码 操作数
微机原理与接口技术 第3章 8086指令系统 朱华贵 2015年09月25日.
第7章 并行接口 7.1 简单并行接口 7.2 可编程并行接口8255A 7.3 键盘接口 7.4 LED显示器接口.
微机原理与接口技术 第2章 8086系统结构 朱华贵 2015年09月17日.
第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第四节 Intel 8253在IBM PC机上的应用.
Assembly Language Programming
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月10日.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月05日.
输入输出与中断 主要内容 CPU与外设之间数据传送方式 中断技术 8086中断系统和中断处理.
第八章 输入输出程序设计 总线 CPU MEM I/O接口 I/O设备.
第3章 IA-32指令系统 3.1 基本数据类型 3.2 IA-32的指令格式 3.3 IA-32指令的操作数寻址方式
汇编语言程序设计 吴 向 军 中山大学计算机科学系
第8章 寻址方式与指令系统.
第二部分 PC 微机异步通信适配器的分析和使用 一、PC中的UART 1.INS PC16450/PC16550
第4章 汇编语言程序设计 4.1 程序设计语言概述 4.2 汇编语言的程序结构与语句格式 4.3 汇编语言的伪指令
微机原理及应用 主讲:郑海春.
第一章 8086程序设计 第二章 MCS-51程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
汇编语言程序设计课程设计 第二次实验 DEBUG基本命令与算术运算指令
第7章 微型机接口技术 可编程定时/计数器 可编程并行接口 串行接口与串行通信(概念) DMA控制器接口(不做要求) 模拟量输入/输出接口.
微型计算机原理及应用.
第3章 微型计算机输入输出接口 3.1 输入/输出接口 3.2 输入输出数据传输的控制方式 3.3 开关量输入输出接口 欢迎辞.
第六章 子程序结构 §6.1 子程序的设计方法 §6.2 嵌套与递归子程序 §6.3 子程序举例 §6.4 DOS系统功能调用.
1.3 微型计算机的结构和工作原理.
條件處理.
第九章 高级宏汇编语言 9.1 结构 结构就是将逻辑上有一定关系的一组数据,以某种方式组合在一起所形成的数据形式。
第5章 循环与分支程序设计 学习目标: 了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。掌握起泡排序算法这种多重循环程序设计中的常用方法。交换标志位的设置在此算法中更能提高效率。学会在数组排序算法中采用折半查找法来提高查找效率。学会使用跳跃表法实现CASE结构。
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
3.4.5 控制转移指令(Control transfer instructions) (一)、控制转移指令概述
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月19日.
第五章:输入输出基本技术 主讲教师:范新民.
第二章 8086微处理器. 第二章 8086微处理器 微处理器的基本结构 8086微处理器的主要特性和内部结构 8086CPU的工作模式和引脚信号 8086的存储器管理 8086的总线操作和时序.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程.
第10章 可编程外围接口芯片8255A及其应用 10.1 概述 A的工作原理 A的应用举例.
习题3 1、 分别说明下列指令的原操作数和目的操作数各采用什么寻址方式。 设定如下: ①立即寻址 ② ① ②寄存器寻址
3.4.2 算术运算指令(Arithmetic) 算术运算指令内容: 8086/8088提供加、减、乘、除等六种基本算术操作
第九章 BIOS和DOS中断 在存储器系统中,从地址0FE000H开始的8K ROM(只读存储器)中装有BIOS(Basic Iuput /output System)例行程序。驻留在ROM中的BIOS给PC系列的不同微处理器提供了兼容的系统加电自检,引导装入,主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大方便,程序员不必了解硬件操作的具体细节,直接用指令设置参数,然后中断调用BIOS中的子功能,所以利用BIOS功能编写的程序简洁,可读性好,
第2章 80x86计算机组织  计算机系统  存储器  中央处理机  外部设备.
《微型计算机原理与接口技术》 第4版 王良 宁德师范学院 吴宁 乔亚男 编著 清华大学出版社 出版
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月17日.
第八章 中断系统.
微机原理与接口技术 西安邮电大学计算机学院 宁晓菊.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月06日.
第6章 子程序结构 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。 2019/7/20 ch6.
第二章 8086系统结构 /8086的存储器组织 的系统配置及引脚功能 CPU时序
微机原理与接口技术 第5章 汇编语言程序设计 西安邮电大学计算机学院 王 钰.
第三章 8086的指令系统 8086指令特点 8086的寻址方式 8086的指令格式及数据类型 8086的指令集.
Presentation transcript:

第3章 80x86的指令系统和寻址方式 § 3.1 80x86的寻址方式 § 3.3 80x86的指令系统

基本概念—指令系统 每一种计算机都有一组指令集供用户使用,这 组指令集称为该计算机的指令系统。指令集中的每 条指令在汇编语言中都是用助记符来表示的。

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

基本概念—80x86指令的基本格式 [ ]内的内容可缺省 书写注意事项: 操作码 [目的操作数][,源操作数]] [;注释] SRC DST 操作码 [目的操作数][,源操作数]] [;注释] SRC DST [ ]内的内容可缺省 书写注意事项: 操作码与操作数至少有一个空格或制表符分隔 操作数之间必须用“,”相分隔, DST在前, SRC在后 每种指令的操作码: 用一个唯一的助记符表示(指令功能的英文缩写) 对应着机器指令的一个二进制编码 指令中的操作数: 可以是一个具体的数值 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址

基本概念—寻址方式 在指令中为了取得操作数地址所使用的方式 寻找操作数的过程就是操作数的寻址 不同的指令系统都规定一些寻址方式供编程时选用 指令的寻址方式主要由操作数的形式表示出来 操作数采取哪一种寻址方式,会影响机器运行的速 度和效率

§ 3.1 80x86的寻址方式 一、与数据有关的寻址方式 二、与转移地址有关的寻址方式 立即(数)寻址 寄存器寻址 直接寻址 寄存器间接寻址 寄存器相对寻址 基址变址寻址 相对基址变址寻址 比例因子寻址 串操作寻址 端口寻址 二、与转移地址有关的寻址方式

操作数类型 操作数 描述 r8 8位通用寄存器:AH、AL、BH、BL、CH、CL、DH、DL r16 16位通用寄存器:AX、BX、CX、DX、SI、DI、SP、BP r32 32位通用寄存器:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP reg 任意的通用寄存器 sreg 16位段寄存器:CS、DS、SS、ES、FS、GS imm 8、16或32位立即数 imm8 8位立即数(字节) imm16 16位立即数(字) imm32 32位立即数(双字) r/m8 8位操作数(可以是8位通用寄存器或内存字节) r/m16 16位操作数(可以是16位通用寄存器或内存字) r/m32 32位操作数(可以是32位通用寄存器或内存双字) mem 8、16或32位内存操作数

1. 立即(数)寻址 指令中的操作数直接存放在机器代码中,紧跟在操作码之后 (操作数作为指令的一部分存放在操作码之后的主存单元中) 这种操作数被称为立即数imm 它可以是8位数值imm8(00H~FFH) 也可以是16位数值imm16(0000H~FFFFH) 也可以是32位数值imm32(00000000H~FFFFFFFFH) 立即数寻址方式常用来给R/M赋值 立即数只能用于源操作数 MOV AL,05H ;AL←05H MOV AX,0102H ;AX←0102H MOV EAX,12345678H ;EAX←12345678H

立即数寻址的执行

2. 寄存器寻址 操作数存放在CPU的内部寄存器reg中,可以是: MOV AX,1234H ;AX←1234H 16位寄存器: AX、BX、CX、DX、SI、DI、BP、SP 8位寄存器: AH、AL、BH、BL、CH、CL、DH、DL 32位寄存器: EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP 段寄存器: CS、DS、SS、ES,FS,GS MOV AX,1234H ;AX←1234H MOV BX,AX ;BX←AX

寄存器寻址的执行

存储器操作数的寻址 当操作数存放在内存中时,寻找操作数归结为如何确定存储 单元的地址 逻辑地址 段基值:偏移量 EA=位移量+基址+变址 逻辑地址 段基值:偏移量 主要确定该部分的内容(EA) 由段寄存器经计算给出 位移量:指令中给出8/16/32位数(常数、符号) EA 基地址:有基址寄存器BX或基址指针BP给出 变址: 由变址寄存器(SI或DI)给出 EA=位移量+基址+变址 EA=位移量+基址+(变址*比例因子) 比例因子(1/2/4/8)

16/32位寻址时有效地址的组成 默认段选择规则 成分 16位寻址(位) 32位寻址(位) 位移量 0,8,16 0,8,16,32 基址寄存器 BX,BP 任何32位通用寄存器(包括ESP) 变址寄存器 SI,DI 除ESP以外的32位通用寄存器 比例因子 无 1,2,4,8 默认段选择规则 访问类型 所用段及段寄存器 缺省选择规则 指令 代码段 CS 用于取指 堆栈 堆栈段 SS 所有的进栈和出栈操作; 任何用于ESP、EBP、BP为基址寄存器的访问 局部数据 数据段 DS 除对于堆栈及目的串以外的所有数据访问 目的串 附加段 ES 串处理指令的目的串

3. 直接寻址 有效地址只包含位移量 用符号表示的位移量 用常数表示的位移量 操作数的16位偏移量直接包含在指令中,与操作码一起放在代码段 MOV BX,VAR ;表示将用符号VAR表示的字单元的内容→ AX ; 不声明段则默认为数据段,指明段寄存器则可实现段跨越 用常数表示的位移量 MOV AX,DS:[2000H] ;表示将数据段偏移2000H字节的字单元的内容→ AX

直接寻址的执行 MOV AX,DS:[2000H]

4. 寄存器间接寻址 有效地址仅包含基址/变址一种成分 所使用的寄存器相当于地址指针,当修改其内容后可指向不 同的存储单元 16位寻址可用寄存器:BX、BP、SI、DI 32位寻址可用寄存器:EAX、EBX、ECX、EDX、ESI、EDI、EBP、 ESP 所使用的寄存器相当于地址指针,当修改其内容后可指向不 同的存储单元 书写时用[]括住寄存器名,以区别于寄存器寻址 若以BP、EBP、ESP间址,操作数默认在堆栈段,其他在数据 段;使用段超越前缀改变访问段 MOV AX,[SI] MOV CL,[BX] MOV CX,[BP] MOV EBX,[EAX]

寄存器间接寻址的执行 (BX=2000H,DS=3000H)

5.寄存器相对寻址方式 直接基址寻址/直接变址寻址 有效地址是寄存器内容与有符号的位移量之和 EA = BX/BP 或 SI/DI +位移量 基址寻址 变址寻址 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变 该方式不仅可以修改指针,还可以修改位移量,对数组操作十分方便 MOV AX,10H[SI] MOV TABLE[DI],AL MOV TABZ[BP],BX MOV EAX,ARRAY[ESI]

寄存器相对寻址的执行

MOV AL,0024H[SI] EA=24H+(SI) (SI)=0 (AL)=12H (SI)=1 (AL)=34H 操作码 24H 00H 12H 34H 56H 78H 9AH 可看作数据起始单元的偏移量 MOV AL,0024H[SI] 代码段 EA=24H+(SI) (SI)=0 (AL)=12H (SI)=1 (AL)=34H DS (SI)=2 (AL)=56H (SI)=3 (AL)=78H 0024H (SI)=4 (AL)=9AH 数据段 (SI) 数组内某元素距数组 起始单元的偏移量 通过修改SI可遍历整个数组

6.基址变址寻址方式 有效地址由基址寄存器的内容加上变址寄存器的 内容构成 使用BP、EBP、ESP基址寄存器默认是SS,其他 为数据段;可用段超越前缀改变 MOV AX,[BX][SI] MOV AX,[BP][DI] MOV AX,DS:[BP][DI] MOV EDX,[EBX][ESI]

基址变址寻址的执行 请 注 意 图 中 的 错 误 !

7.相对基址变址寻址方式 有效地址是基址寄存器、变址寄存器与位移量之和 16位寻址时,BX/BP选一,SI/DI选一 段为缺省选择,可用段超越前缀改变 MOV AX, 06H[BX+SI] ← → MOV AX, DS:[BX+SI+06H] MOV AL,TAB[BX][DI] ← → MOV AL,DS:TABLE[BX][DI] MOV DWORD[BP][SI],DX ← → MOV SS:DWORD[BP][SI],DX MOV AX,ARRAY[BX][BP] × MOV AX,DA[SI][DI] × MOV EAX,ARRARY[EBX][ECX]

31A00 3000:1A00

⊕ MOV AL,ARRAY[BX][SI] DS 数据段 ARRAY SI BX EA [ ]之间表示相加的关系 二维数组起始单元 ⊕ EA BX、SI分别存放数组的脚标 [ ]之间表示相加的关系 [BX][SI] ← → [BX+SI]

8.比例变址寻址、基址比例比例变址寻址、相对基址比例变址寻址方式 比例变址寻址有效地址是:位移量加变址寄存器与比例因子 乘积之和 MOV EAX,COUNT[ESI*4] 基址比例比例变址寻址有效地址是:基址加变址寄存器与比 例因子乘积之和 MOV CX,[EAX][EDX*2] 相对基址比例变址寻址方式有效地址是:位移量加基址加变 址寄存器与比例因子乘积之和 MOV EAX, TABLE[EBP][EDI*4] 作用:方便字、双字等数组的操作

二、与转移地址有关的寻址方式 程序代码亦存放在存储器中,如何控制程序的走向(转移位置的地址CS:IP)是本部分所涉及的内容,由于它们与具体的指令相关,他们的介绍放在指令中讲解。

§ 3.3 80x86的指令系统 指令分类 数据传送指令 算术运算指令 功能 逻辑指令 串操作指令 程序转移指令 处理器控制指令 格式 双操作数指令(DEST,SRC) 单操作数指令(DEST) 无操作数指令(隐含,按约定寻找操作数)

一、数据传送指令 1.通用数据传送指令 提供方便灵活的通用传送操作 数据传送是计算机中最基本、最重要的一种操作 传送指令也是最常使用的一类指令 传送指令把数据从一个位置传送到另一个位置 除标志寄存器传送指令外,均不影响标志位 1.通用数据传送指令 提供方便灵活的通用传送操作 MOV XCHG PUSH POP MOVSX MOVZX PUSHA/PUSHAD POPA/POPAD

1) 传送指令MOV(move) 格式:MOV DST,SRC 功能:将源操作数的内容传送至目的操作数中即 (DST) ← (SRC) 说明: DST可以是8/16位的R(CS、IP除外)/M SRC可以是8/16位的R/M/立即数 DST可以是8/16/32位的R(CS、EIP除外)/M SRC可以是8/16/32位的R/M/立即数 只能出现在源操作数的位置

1) 传送指令MOV—立即数传送 MOV reg/mem,imm ;立即数送寄存器或主存 MOV AL,4 ;AL←4,字节传送 MOV AH,‘E’ ; AH←‘E’的ASCII码45H MOV CX,0FFH ;CX←00FFH,字传送 MOV SI,200H ;SI←0200H,字传送 MOV BYTE PTR [SI],0AH ; BYTE PTR说明是字节操作 MOV WORD PTR [SI+2],0BH ; WORD PTR 说明是字操作 注意立即数是字节量还是字量 明确指令是字节操作还是字操作

1) 传送指令MOV —寄存器之间数据传送 MOV AX,BX ;AX ← BX ,字传送 MOV AH,AL ;AH ← AL ,字节传送 MOV reg,reg MOV AX,BX ;AX ← BX ,字传送 MOV AH,AL ;AH ← AL ,字节传送 MOV DS,AX ;DS ← AX ,字传送 CS只能出现在SRC的位置

1) 传送指令MOV —寄存器与存储器之间数据传送 MOV AL,D_BYTE MOV DL,[SI] ;DL←DS:[SI] MOV DX,Y[BP][SI] ;DX←SS:Y[BP][SI] MOV EAX,[EBX][ECX*4]

1) 传送指令MOV —使用该指令应注意的问题 SRC与DST的长度必须一致 DST不能为CS、IP及立即数 SRC与DST不能同时为存储器操作数—不支持两个存储单元间数据的直接传送 SRC与DST不能同时为段寄存器 不能将立即数直接传送到段寄存器 例: DS ← ES 错误: MOV DS,ES 正确实现: MOV AX,ES MOV DS,AX 例: MOV AX,ES MOV DS,AX 错误示例: MOV VAR1,VAR2 正确实现: MOV AL,VAR2 MOV VAR1,AL 错误示例: MOV AX,BL MOV CL,3824H

1) 传送指令MOV—数据传送方向示意 立即数 通用寄存器 存 储 器 AX BX CX DX BP SP SI DI 段寄存器 CS DS ES SS 通用寄存器 AX BX CX DX BP SP SI DI 存 储 器

2) 零扩展传送指令MOVZX 格式:MOVXZ DST,SRC 功能:将零扩展至源操作数的高位形成双倍长度传送至目的 操作数中即 说明: DST可以是16/32位的R(CS、EIP除外) SRC可以是8/16位的R/M MOVZX DX,AL ;原AL=B0H,则DX=00B0H MOVZX EAX,DATA

3) 带符号扩展传送指令MOVSX 格式:MOVSX DST,SRC 功能:将源操作数的符号位扩展至高位形成双倍长度传送至 目的操作数中即 说明: DST可以是16/32位的R(CS、EIP除外) SRC可以是8/16位的R/M MOVSX DX,AL ;原AL=B0H,则DX=FFB0H MOVSX EAX,[EDI]

4) 交换指令XCHG(exchange) 指令格式: XCHG DST,SRC 指令功能: (DST) ← → (SRC) 寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据 注意:不能在存储器与存储器之间对换

4) 交换指令XCHG—寄存器间交换 MOV AX,1234H ;AX=1234H MOV BX,5678H ;BX=5678H XCHG AX,BX ;AX=5678H,BX=1234H XCHG AH,AL ;AX=7856H MOVZX CX,AL ;CX=0078H MOVSX DX,AH ;DX=0056H XCHG CX,DX ;CX=0056H,DX=0078H

4)交换指令XCHG —寄存器与存储器交换 XCHG AX,DS:[2000H] ;字交换 XCHG DS:[2000H],AX XCHG AL, DS:[2000H] ;字节交换 XCHG DS:[2000H],AL

4) 交换指令XCHG—例题分析 例: (BX)=6F30H, (BP)=0200H, (SI)=0046H, (SS)=2F00H,(2F246H)=4154H,在指令 XCHG BX,[BP+SI] 执行后,相关寄存器和存储器的内容是什么? 分析:源操作数的物理地址= (SS) × 16+(BP)+(SI)= 2F000H+0200H+0046H=2F246H 指令的功能:(BX) ← → (2F246H) 指令执行结果:(BX)=4154H,(2F246H)=6F30H

5) 堆栈操作指令—进栈指令PUSH 格式: PUSH SRC 功能: 386+ 例: PUSH AX PUSH DS:[2000H] SP←SP-2, SS:[SP]←(r/m16) 386+ ESP←ESP-2/4, SS:[ESP]←(r/m16)/ (r/m32)/imm32 例: PUSH AX PUSH DS:[2000H]

6) 堆栈操作指令—出栈指令POP 386+ 格式: POP DST 功能: SP ← SP+2 (r/m16) ← SS:[SP] SP ← SP+2 386+ (r/m16)/ (r/m32)← SS:[ESP] ESP ← ESP+2/4 例: POP DX POP DS:[2000H]

堆栈操作指令—应用举例 PUSH AX ;进入子程序后 PUSH BX PUSH DS ... POP DS ;返回主程序前 POP BX POP AX

7) 所有寄存器进栈指令 —PUSHA/PUSHAD xxH 00H 66H 7) 所有寄存器进栈指令 —PUSHA/PUSHAD SP 00H 55H 格式: PUSHA 功能:将所有16位寄存器压栈,顺序为: AX、CX、DX、BX、SP、BP、SI、DI ESP←ESP-16 00H 84H 00H 78H 如:AX=11H, BX=22H CX=33H, DX=44H SI =55H, DI =66H SP=80H, BP =84H 00H 22H 00H 44H PUSHA 执行后有: 33H 00H 格式: PUSHAD 功能:将所有32位寄存器压栈,顺序为: EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI ESP←ESP-32 11H 00H 20080H SP

8) 所有寄存器出栈指令 —POPA/POPAD 功能:将堆栈中的数据弹给16位寄存器,顺序与压栈指令相反 ESP←ESP+16 格式: POPAD 功能:将堆栈中的数据弹给32位寄存器,顺序与压栈指令相反 ESP←ESP+32

累加器专用传送指令 换码指令XLAT(translate) 指令格式: XLAT 指令功能: AL←DS:[BX+AL],将BX指定的缓冲区中、 AL指定的位移处的一个字节数据取出赋给AL 换码指令执行前: 在主存建立一个字节量表格,内含要转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量 换码指令执行后: 将AL寄存器的内容转换为目标代码

3) 换码指令XLAT—例题 MOV BX,100H MOV AL,03H XLAT 78H (BX) (AL) DS 数据段 12H 9AH MOV BX,100H MOV AL,03H XLAT 78H (AL)=78H

3. 地址传送指令 地址传送指令将存储器单元的逻辑地址送至指定的 寄存器 注意不是获取存储器单元的内容 有效地址传送指令 LEA 指针传送指令 LDS和LES 指针传送指令 LFS、LGS、LSS 注意不是获取存储器单元的内容

3. 地址传送指令 —有效地址传送指令LEA(load EA) 格式: LEA DST,SRC 存储器操作数 16/32位寄存器 功能:DST←SRC的有效地址EA 将存储器操作数的有效地址传送至指定的16/32位寄存器中

3. 地址传送指令 —有效地址传送指令LEA(例) 获得主存单元的有效地址;不是物理地址,也不是该单元的内容 可以实现计算功能 23H 093A0H BUFR 78H 9AH 093AH DS 093C3H LEA BX,BUFR (BX)=0023H 9A78H (BX)=9A78H 错误!

3. 地址传送指令 —地址指针 存储单元的逻辑地址: 段基值(16位) 段内偏移量(16位) 地址指针(32位) AD_POINT 偏移量 3. 地址传送指令 —地址指针 段基值 AD_POINT XX 偏移量 存储单元的逻辑地址: 段基值(16位) 段内偏移量(16位) 地址指针(32位) M的逻辑地址在M中需4个连 续的存储单元

3. 地址传送指令 —指针传送指令 格式: LDS DST,SRC 功能: (DST)←(SRC)段内偏移量 DS← (SRC+2 )段基值 3. 地址传送指令 —指针传送指令 格式: LDS DST,SRC 功能: (DST)←(SRC)段内偏移量 DS← (SRC+2 )段基值 LDS指令将主存中SRC 指定的字送至16位寄存器DST,并 将SRC的下一字送DS寄存器 格式: LES DST,SRC 功能:(DST)←(SRC)段内偏移量 ES← (SRC+2 )段基值 LDS指令将主存中SRC 指定的字送至16位寄存器DST,并将SRC的下一字送ES寄存器

(DS)=4000H (DI)=05AEH (AX)=9634H BX=080AH B0000H 0B080AH 40000H 34H 96H AEH 05H 00H 40H 405AEH 05AEH 0B080CH 例: (DS)=B000H, (BX)=080AH, (0B080AH)=05AEH, (0B080CH)=4000H, (405AEH)=9634H, 在执行指令 LDS DI,[BX] MOV AX,[DI] 后,(AX)=? (DI)=05AEH 结果: (DS)=4000H (DI)=05AEH (AX)=9634H (DS)=4000H

3. 地址传送指令 —地址指针(32) 存储单元的逻辑地址段选择 器(16位) 段内偏移量(32位) 地址指针(48位) AD_POINT 3. 地址传送指令 —地址指针(32) 存储单元的逻辑地址段选择 器(16位) 段内偏移量(32位) AD_POINT XX XX 偏移量 XX 地址指针(48位) M的逻辑地址在M中需6个连续的存储单元 XX XX 段选择 XX

3. 地址传送指令—指针传送指令(32) 格式: LDS/LES/LFS/LGS/LSS DST,SRC 功能: (DST)←(SRC)段内偏移量32bit DS/ES/FS/GS/SS← (SRC+4 ) 16bit LDS指令将主存中SRC 指定的双字送至32位寄存器DST, 并将SRC的下一字送DS寄存器 LSS ESP,MEM

4. 标志寄存器传送指令 标志寄存器传送指令用来传送标志寄存器FLAGS的 内容,方便进行对各个标志位的直接操作 指令 4. 标志寄存器传送指令 标志寄存器传送指令用来传送标志寄存器FLAGS的 内容,方便进行对各个标志位的直接操作 指令 低8位传送:LAHF和SAHF 16位传送:PUSHF和POPF 32位传送:PUSHFD和POPFD

4. 标志寄存器传送指令 —标志低字节进出AH指令 格式: LAHF 功能:(AH)←FLAGS的低字节 LAHF指令将标志寄存器的低字节送寄存器AH SF/ZF/AF/PF/CF状态标志位分别送入AH的第 7/6/4/2/0位,而AH的第5/3/1位任意 格式: SAHF 功能: FLAGS的低字节←(AH) SAHF将AH寄存器内容送FLAGS的低字节 用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志

4.标志寄存器传送指令 —标志寄存器进出堆栈指令 4.标志寄存器传送指令 —标志寄存器进出堆栈指令 格式: PUSHF 功能:SP←SP-2 SS:[SP]←FLAGS PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指 针SP减2 格式: POPF 功能:FLAGS←SS:[SP] SP←SP+2 POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2

4. 标志寄存器传送指令 —标志寄存器进出堆栈指令(置位单步标志) 4. 标志寄存器传送指令 —标志寄存器进出堆栈指令(置位单步标志) PUSHF ;保存全部标志到堆栈 POP AX ;从堆栈中取出全部标志 OR AX,0100H ;设置D8=TF=1,AX其它位不变 PUSH AX ;将AX压入堆栈 POPF ;FLAGS←AX ;将堆栈内容取到标志寄存器

4. 标志寄存器传送指令 —标志寄存器进出堆栈指令(32) 4. 标志寄存器传送指令 —标志寄存器进出堆栈指令(32) 格式:PUSHFD 功能:SP←SP-4 SS:[ESP]←EFLAGS PUSHFD指令将标志寄存器的内容压入堆栈,同时栈顶 指针ESP减4 格式: POPFD 功能:EFLAGS←SS:[ESP] ESP←ESP+4 POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针ESP加4

二、算术运算指令(部分) 四则运算是计算机经常进行的一种操作。算术运算 指令实现二进制(和十进制)数据的四则运算 请注意算术运算类指令对标志的影响

1. 加/减法指令 格式: ADD DST,SRC SUB DST,SRC 功能: (DST) ←(DST)+/-(SRC) 受影响标志:CF,PF,AF,ZF,SF,OF 说明: 操作数可以是字节或字 SRC可以是通用R、M、imm DST可以是通用R、M DST和 SRC不能同时为M

1. 加法指令—举例 若(AL)=0E5H,执行 ADD AL,0A4H AL及各标志位的情况? 若认为是无符号数,则为229+164=393=256+137 若认为是有符号数,则为(-27)+(-92)=-119 ADD AX,BX ADD AL,BL SUB CX,20H ADD DL,DA_BYTE SUB DA_WORD,DX ADD EAX,EBX 1 1110 0101 1010 0100 1000 1001 + CF=1,AF=0,PF=0, ZF=0,SF=1,OF=0

2. 减法指令—举例 1011 0111 例:执行指令 MOV AL,-73 SUB AL,-87 后,AL及个标志位的情况 -73的补码表示 — 1010 1001 -87的补码表示 0000 1110 14 AL=0EH CF=0,AF=1,PF=0,ZF=0,SF=0,OF=0

2. 带进/借位的加/减法指令 格式: ADC DST,SRC SBB DST,SRC 功能: (DST) ←(DST)+/-(SRC)+/-CF 受影响标志:CF,PF,AF,ZF,SF,OF 说明: 操作数可以是字节或字 SRC可以是通用R、M、imm DST可以是通用R、M DST和 SRC不能同时为M

2. 带进/借位的加/减法指令—举例 2 F365 5 E024 8 D389 + 2 F365 5 E024 8 D389 + 例:实现2F365H和 5E024H的加法运算 1 F365 E024 D389 + 2 F365 5 E024 8 D389 + 2 F365 5 E024 8 D389 + 手工计算 AX MOV DX,2 MOV AX,0F365H ADD AX,0E024H ADC DX,5 CF=1,AF=0,PF=0,ZF=0,SF=1,OF=0 0002 0005 0008 + 0001 DX CF=0,AF=0,PF=0,ZF=0,SF=0,OF=0

3.加/减1指令 格式: INC DST DEC DST 功能: (DST) ←(DST)+/-1 受影响标志:PF,AF,ZF,SF,OF 说明: DST可以是R/M 功能与ADD/SUB相似,但占用字节少,且不影响标 志位CF 。常用于修改地址指针及循环计数器。

4. 求补指令(求负数) 格式: NEG DST 功能: (DST) ←0-(DST) 受影响标志: CF ,PF,AF,ZF,SF,OF 说明: DST可以是R/M 操作对象是有符号的数 当操作数取最小值(-128或-32768)时,执行该指令后,操作 数无变化, OF=1 当操作数为0时,结果为0,但CF=0,其他情况CF=1

4. 求补指令(举例) 1 0000 0000 0001 0011 1110 1101 — 例:AL=13H,执行指令 NEG AL 负数求补 AL=-13H

5. 比较指令CMP(compare) 格式: CMP DST,SRC 功能: (DST) -(SRC) 受影响标志: CF ,PF,AF,ZF,SF,OF 说明: DST ,SRC可以是R/M,长度必须一致 SRC还可以是imm DST和 SRC不能同时为M 该指令主要用于比较两数的关系

5. 比较指令CMP—应用 ZF=1 ;两数相等 两个无符号数比较 CMP AX,BX ; CF= 两个带符号的数的比较不能用单一的符号判断两个数的关系 指令执行后 SF与OF相同,(DST)>SRC SF与OF不同,(DST)<SRC

5. 比较指令CMP—(CMP AL,BL) 1111 1110 0111 1111 - AL=-2 BL=127 SF=0 OF=1 相异,AL<BL 1 1111 1110 1111 1111 - AL=-2 BL=-1 SF=1 OF=0 相异,AL<BL

5. 比较指令CMP—(CMP AL,BL) 1111 1111 1111 1110 0000 0001 - AL=-1 BL=-2 SF=0 OF=0 相同,AL>BL 1 0111 1111 1111 1110 1000 0001 - AL=127 BL=-2 SF=1 OF=1 相同,AL>BL

6. 乘法指令 MUL r8/m8 ;无符号字节乘法 ;AX←AL×r8/m8 MUL r16/m16 ;无符号字乘法 ;DX.AX←AX×r16/m16 IMUL r8/m8 ;有符号字节乘法 ;AX←AL×r8/m8 IMUL r16/m16 ;有符号字乘法 ;DX.AX←AX×r16/m16

6. 乘法指令—功能 乘法指令分无符号和有符号乘法指令 乘法指令的源操作数显式给出,隐含使用另一个操 作数AX和DX 字节相乘:AL与r8/m8相乘,得到16位的结果,存入AX 字相乘:AX与r16/m16相乘,得到32位的结果,其高字 存入DX,低字存入AX 乘法指令利用OF和CF判断乘积的高一半是否具有 有效数值

6. 乘法指令—对标志的影响 MUL指令——若乘积的高一半(AH或DX)为0,则 OF=CF=0;否则OF=CF=1 IMUL指令——若乘积的高一半是低一半的符号扩展,则 OF=CF=0;否则均为1

6. 乘法指令—(例) MOV AL,0B4H ;AL=B4H=180 MOV BL,11H ;BL=11H=17 MUL BL ;AX=OBF4H=3060,OF=CF=1,AX高8位不为0 MOV AL,0B4H ;AL=B4H=-76 MOV BL,11H ;BL=11H=17 IMUL BL ;AX=FAF4H=-1292,OF=CF=1,AX高8位有效

6. 除法指令—功能 除法指令分无符号和有符号除法指令 除法指令的除数显式给出,隐含使用另一个操作数AX和 DX作为被除数 字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH 字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数 存入DX 除法指令对标志没有影响 除法指令会产生结果溢出

6. 除法指令 DIV r8/m8 ;无符号字节除法 DIV r16/m16 ;无符号字除法 IDIV r8/m8 ;有符号字节除法 ;AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数 DIV r16/m16 ;无符号字除法 ;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数 IDIV r8/m8 ;有符号字节除法 ;AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数 IDIV r16/m16 ;有符号字除法: ;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数

6. 除法指令—除法错中断 当被除数远大于除数时,所得的商就有可能超出它所能表 达的范围。如果存放商的寄存器AL/AX不能表达,便产生 溢出,80x86CPU中就产生编号为0的内部中断——除法 错中断 对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除 时商超过16位,则发生除法溢出 对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内, 或者在字除时商不在-32768~32767范围内,则发生除法溢

6. 除法指令—(例) MOV AX,0400H ;AX=400H=1024 MOV BL,0B4H ;BL=B4H=180 DIV BL ;商AL=05H=5,余数AH=7CH=124 MOV AX,0400H ;AX=400H=1024 MOV BL,0B4H ;BL=B4H=-76 IDIV BL ;商AL=F3H=-13,余数AH=24H=36

7. 符号扩展指令—符号扩展的概念 符号扩展是指用一个操作数的符号位(即最高位)形成另 一个操作数,后一个操作数的各位是全0(正数)或全1 (负数)。符号扩展不改变数据大小。 对于数据64H(表示数据100),其最高位D7为0,符号扩展后高 8位都是0,成为0064H(仍表示数据100) 对于数据ff00H(表示有符号数-256),其最高位D15为1,符号 扩展后高16位都是1,成为ffffff00H(仍表示有符号数-256)

7. 符号扩展指令 符号扩展指令常用于获得双倍长的数据 CBW ;AL的符号扩展至AH ;如AL的最高有效位是0,则AH=00 ;AL的最高有效位为1,则AH=FFH。AL不变 CWD ;AX的符号扩展至DX ;如AX的最高有效位是0,则DX=00 ;AX的最高有效位为1,则DX=FFFFH。AX不变

7. 符号扩展指令—(例:AX/BX) CWD ;DX.AX←AX IDIV BX ;AX←DX.AX÷BX 利用符号扩展指令得到除法指令所需要的倍长于除数的被除数 对无符号数除法应该采用直接使高8位或高16位清0的方法,获得倍长的被除数

8. 十进制调整指令 十进制数调整指令对二进制运算的结果进行十进制调整, 以得到十进制的运算结果 分成压缩BCD码和非压缩BCD码调整

8. 十进制调整指令 —压缩BCD码加、减调整指令 (ADD AL,i8/r8/m8) (ADC AL,i8/r8/m8) DAA ;AL←将AL的加和调整为压缩BCD码 (SUB AL,i8/r8/m8) (SBB AL,i8/r8/m8) DAS ;AL←将AL的减差调整为压缩BCD码 使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令 DAA和DAS指令对OF标志无影响,按结果影响其他标志

8.十进制调整指令 — 压缩BCD码加、减调整指令(例) MOV AL,68H ;AL=68H,压缩BCD码表示真值68 MOV BL,28H ;BL=28H,压缩BCD码表示真值28 ADD AL,BL ;二进制加法:AL=68H+28H=90H DAA ;十进制调整:AL=96H ;实现压缩BCD码加法:68+28=96 MOV AL,68H ;AL=68H,压缩BCD码表示真值68 MOV BL,28H ;BL=28H,压缩BCD码表示真值28 SUB AL,BL ;二进制减法:AL=68H-28H=40H DAS ;十进制调整:AL=40H ;实现压缩BCD码加法:68-28=40

8.十进制调整指令 —非压缩BCD码加、减调整指令 (ADD AL,i8/r8/m8) (ADC AL,i8/r8/m8) AAA ;AL←将AL的加和调整为非压 缩BCD码 ;AH←AH+调整的进位 (SUB AL,i8/r8/m8) (SBB AL,i8/r8/m8) AAS ;AL←将AL的减差调整为非压缩 BCD码 ;AH←AH-调整的借位 使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令 AAA和AAS指令在调整中产生了进位或借位,则AH要加上进位或减去借位,同时CF=AF=1,否则CF=AF=0;它们对其他标志无影响

8. 十进制调整指令 —非压缩BCD码加、减调整指令(例) MOV AX,0608H ;AX=0608H,非压缩BCD码表示真值68 MOV BL,09H ;BL=09H,非压缩BCD码表示真值9 ADD AL,BL ;二进制加法:AL=08H+09H=11H AAA ;十进制调整:AX=0707H ;实现非压缩BCD码加法:68+9=77 MOV AX,0608H ;AX=0608H,非压缩BCD码表示真值68 MOV BL,09H ;BL=09H,非压缩BCD码表示真值9 SUB AL,BL ;二进制减法:AL=08H-09H=FFH AAS ;十进制调整:AX=0509H ;实现非压缩BCD码减法:68-9=59

例:用乘法指令实现32位二进制数的相乘 × + a b c d c d a b ax dx b×d a×d b×c a×c NUM1 DSEG SEGMENT PARA 'DATA‘ NUM1 DW 1220H,48A2H NUM2 DW 2398H,0AE41H PRODU DW 4 DUP(0) DSEG ENDS c d a b ax dx × + b×d a×d b×c a×c NUM2 NUM2+2 c d produ produ+2 produ+4 produ+6

三、逻辑指令 (逻辑)位操作类指令以二进制位为基本单位进行数据的 操作;这是一类常用的指令,都应该特别掌握 逻辑运算指令 测试指令 移位指令

1. 逻辑运算指令 格式: AND DST,SRC OR DST,SRC XOR DST,SRC NOT DST ∧ 功能: (DST) ← (EST) (SRC) ∧ ∨ (DST) ← (EST) 受影响标志: CF=0, OF=0, PF, ZF,SF,NOT对标志无影响

1. 逻辑运算指令—应用 MOV AL,45H ;逻辑与 AL=01H AND AL,31H ;CF=OF=0,SF=0、ZF=0、PF=0 OR AL,31H ;CF=OF=0,SF=0、ZF=0、PF=0 MOV AL,45H ;逻辑异或 AL=74H XOR AL,31H ;CF=OF=0,SF=0、ZF=0、PF=1 MOV AL,45H ;逻辑非 AL=0BAH NOT AL ;标志不变

1.逻辑运算指令—应用 AND指令可用于复位某些位(同0相与),不影响其他位:将BL中 D3和D0位清0,其他位不变 AND BL,11110110B OR指令可用于置位某些位(同1相或),不影响其他位:将BL中D3 和D0位置1,其他位不变 OR BL, 00001001B XOR指令可用于求反某些位(同1相异或),不影响其他位:将BL中 D3和D0位求反,其他不变 XOR BL,00001001B XOR AX,AX ;AX=0,CF=OF=0,ZF=1 XOR AL,43H ;ZF=0则AL≠ 43H;ZF=1AL=43H则

2. 测试指令TEST 格式: TEST DST,SRC 功能: 将两个操作数进行逻辑“与”运算,结果只 反映在标志位上,对操作数无影响 功能: 将两个操作数进行逻辑“与”运算,结果只 反映在标志位上,对操作数无影响 受影响标志: CF=0 , OF=0 , PF, ZF,SF 说明:该指令用于测试操作数的某位是否为 1,被测试 的位与1相“与” TEST AL,01H ;测试D0的值 ZF=0,D0=1 ZF=1,D0=0

3. 移位指令 逻辑移位指令 算术移位指令 循环移位指令

1)逻辑移位指令 格式: SHL DST,CNT SHR DST,CNT 功能:将DST按 CNT 指定的次数左/右移位,移出的位→ CF,空出 的位补0,结果→ DST 受影响标志: OF ( CNT=1时), CF ,PF,ZF,SF 说明: DST 可以是R/M CNT为1或CL (imm8) 只在CNT=1时。CF与SF相同, OF=0; CF与SF不同, OF=1。 该指令可用于无符号数÷或× 2的操作

2) 算术移位指令 格式: SAL DST,CNT SAR DST,CNT 功能: SAL与SHL完全相同 SAR每右移1位,最低位→ CF,最高位保持不变(用于带符号 数的除法),结果→ DST 受影响标志: OF ( CNT=1时), CF ,PF,ZF,SF 说明: DST 可以是R/M CNT为1或CL (imm8)

逻辑移位指令的功能

移位指令应用举例 SAR AL,CL ;AL=07H MOV CL,4 MOV AL,0FFH ;AL=FFH SHL AL,1 ;AL=FEH ;CF=1,SF=1、ZF=0、PF=0,OF=0 SAR AL,1 ;AL=FFH ;CF=0,SF=1、ZF=0、PF=1、OF=0 SHR AL,1 ;AL=7FH ;CF=1,SF=0、ZF=0、PF=0、OF=0 SAR AL,CL ;AL=07H ;CF=1,SF=0、ZF=0、PF=1

移位指令应用举例 MOV SI,AX SHL SI,1 ;SI←2×AX ADD SI,AX ;SI←3×AX MOV DX,BX MOV CL,03H SHL DX,CL ;DX←8×BX SUB DX,BX ;DX←7×BX ADD DX,SI ;DX←7×BX+3×AX

功能:小循环:将DST按 CNT 指定的次数左/右移位,移出的位同时送 CF和空出的位 3)循环移位指令 格式: ROL DST,CNT ROR DST,CNT RCL DST,CNT RCR DST,CNT 小循环 大循环 功能:小循环:将DST按 CNT 指定的次数左/右移位,移出的位同时送 CF和空出的位 大循环:将DST按 CNT 指定的次数左/右移位, CF →空出的位,移出的位→ CF 受影响标志: OF ( CNT=1时), CF 说明:用大循环可完成多字节的移位操作

不带进位循环移位指令(小循环)

带进位循环移位指令(大循环)

循环移位指令 —将DX.AX中32位数值左移一位 SHL AX,1 RCL DX,1 DX AX CF

循环移位指令—位传送 ;把AL最低位送BL最低位,保持AL不变 ROR AL,1 RCL BL,1 ROL AL,1 AL之D0 AL CF

循环移位指令—BCD码合并 ;AH.AL分别存放着非压缩BCD码的两位 ;将它们合并成为一个压缩BCD码存AL AND AX,0F0FH ;保证高4位为0 MOV CL,4 ROL AH,CL ;也可以用SHL AH,CL ADD AL,AH ;也可以用OR AL,AH

四、串操作指令 串操作指令是80x86指令系统中比较独特的一类指令,采 用比较特殊的数据串寻址方式,在操作主存连续区域的数 据时,特别好用 串操作指令的操作数是主存中连续存放的数据串 (String)——即在连续的主存区域中,字节或字(或双 字)的序列 串操作指令的操作对象是以字(W)为单位的字串,或是 以字节(B)为单位的字节串(D).

四、串操作指令—串寻址方式 源操作数用寄存器SI寻址,默认在数据段DS中,但允许 段超越:DS:[SI] 目的操作数用寄存器DI寻址,默认在附加段ES中,不允 许段超越:ES:[DI] 每执行一次串操作指令,SI和DI将自动修改: ±1(对于字节串)或±2(对于字串)或±4 执行指令CLD指令后,DF = 0,地址指针增1或2(4) 执行指令STD指令后,DF = 1,地址指针减1或2(4)

1. 串传送MOVS(move string) 把字节或字(双字)操作数从主存的源地址传送至目的 地址 MOVSB ;字节串传送:ES:[DI]←DS:[SI] ;SI←SI±1,DI←DI±1 MOVSW ;字串传送:ES:[DI]←DS:[SI] ;SI←SI±2,DI←DI±2 MOVSD ;双字串传送:ES:[DI]←DS:[SI] ;SI←SI±4,DI←DI±4

串传送 MOVSB (正向 DF=0 )

串传送 MOVSW(反向 DF=1)

1. 串传送MOVS—字节串传送(例) mov si,offset source mov di,offset destination mov cx,100 ;cx←传送次数 cld ;置DF=0,地址增加 again: movsb ;传送一个字节 dec cx ;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束

2. 串存储STOS(store string) 把AL或AX数据传送至目的地址 STOSB ;字节串存储:ES:[DI]←AL ;DI←DI±1 STOSW ;字串存储:ES:[DI]←AX ;DI←DI±2

2. 串存储—串存储(例) mov ax,0 mov di,0 mov cx,8000h ;cx←传送次数 cld ;DF=0,地址增加 again: stosw ;传送一个字 dec cx ;传送次数减1 jnz again ;传送次数cx是否为0

3. 串读取LODS(load string) 把指定主存单元的数据传送给AL或AX LODSB ;字节串读取:AL←DS:[SI] ;SI←SI±1 LODSW ;字串读取:AX←DS:[SI] ;SI←SI±2

mov si,offset block mov di,offset dplus mov bx,offset dminus mov ax,ds mov es,ax ;数据都在一个段中,所以设置es=ds mov cx,count ;cx←字节数 cld go_on:lodsb ;从block取出一个数据 test al,80h ;检测符号位,判断是正是负 jnz minus ;符号位为1,是负数,转向minus stosb ;符号位为0,是正数,存入dplus jmp again ;程序转移到again处继续执行 minus:xchg bx,di stosb ;把负数存入dminus xchg bx,di again:loop go_on ;字节数减1

4.串比较CMPS(compare string) 将主存中的源操作数减去至目的操作数,以便设置标志 (ZF),进而比较两操作数之间的关系 CMPSB ;字节串比较:DS:[SI]-ES:[DI] ;SI←SI±1,DI←DI±1 CMPSW ;字串比较:DS:[SI]-ES:[DI] ;SI←SI±2,DI←DI±2

4.串比较CMPS(例) mov si,offset string1 mov di,offset string2 mov cx,count cld mov al,0ffh ;标记初始为不同 again:cmpsb ;比较两个字符 jnz output ;有不同字符,转移 dec cx jnz again ;进行下一个字符比较 mov al,0 ;字符串相等,设置00h output:mov result,al ;输出结果标记

5.串扫描SCAS(scan string) 将AL/AX减去至目的操作数,以便设置标志(ZF),进而比 较AL/AX与操作数之间的关系 SCASB ;字节串扫描:AL-ES:[DI] ;DI←DI±1 SCASW ;字串扫描:AX-ES:[DI] ;DI←DI±2

5.串扫描SCAS—(例) mov di,offset string mov al,20h mov cx,count cld again:scasb ;搜索 jz found ;为0(ZF=1),发现空格 dec cx ;不是空格 jnz again ;搜索下一个字符 ... ;不含空格,则继续执行 found: ...

重复前缀指令(repeat) 串操作指令执行一次,仅对数据串中的一个字节或字量进行 操作。但是串操作指令前,都可以加一个重复前缀,实现串 操作的重复执行。重复次数隐含在CX寄存器中 重复前缀分2类,3条指令: 配合不影响标志的MOVS、STOS(和LODS)指令的REP前缀 配合影响标志的CMPS和SCAS指令的REPZ和REPNZ前缀

REP重复前缀指令 REP ;每执行一次串指令,CX减1 ;直到CX=0,重复执行结束 例2中,程序段的最后3条指令,可以分别替换为: REP MOVSB 和 REP STOSW

REP重复前缀指令 —字节串传送(例) mov si,offset source mov di,offset destination mov cx,100 ;cx←传送次数 cld ;置DF=0,地址增加 again: movsb ;传送一个字节 dec cx ;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束 rep movsb

REPZ/REPNZ重复前缀指令 REPZ ;每执行一次串指令,CX减1 ;并判断ZF是否为0, ;只要CX=0或ZF=0,重复执行结束 REPNZ ;每执行一次串指令,CX减1 ;并判断ZF是否为1, ;只要CX=0或ZF=1,重复执行结束 当数据串没有结束(CX≠0),并且串不相等(ZF=0),则继续串操作

REPZ/REPNZ重复前缀指令 —串比较CMPS(例) mov si,offset string1 mov di,offset string2 mov cx,count cld mov al,0ffh ;标记初始为不同 again:cmpsb ;比较两个字符 jnz output ;有不同字符,转移 dec cx jnz again ;进行下一个字符比较 mov al,0 ;字符串相等,设置00h output:mov result,al ;输出结果标记 repz cmpsb jnz output

REPZ/REPNZ重复前缀指令 —串扫描(例) mov di,offset string mov al,20h mov cx,count cld again:scasb ;搜索 jz found ;为0(ZF=1),发现空格 dec cx ;不是空格 jnz again ;搜索下一个字符 ... ;不含空格,则继续执行 found: ... repnz scasb jz found

例:在STRBUF字符串中寻找STRING中指定的二字符出现的个数 DSEG SEGMENT PARA 'Data' STRBUF DB 'ASASAASASSASSAASASAS' COUNT EQU $-STRBUF STRING DB 'AS' MESSG DB "THE NUMBER OF 'AS' IS : " NUM DB ? DB 0AH,0DH,'$‘ DSEG ENDS

例:在STRBUF字符串中寻找STRING中指定的二字符出现的个数 采用逐个比较的方法 因目的串为2个字符,故使用CMPSW 应注意的问题: 若某次比较不同时,SISI+2,但有可能出现‘AAS’的情况,应做SISI-1的处理 执行CMPSW亦做DI DI+2,而目的串应始终指向STR,故DI DI-2 比较相同时,循环计数器-2

ZF=1 CX=0 SI 源串首地址STRBUF DI 目的串首地址STRING CX 源串长度-1 方向标志DF 0 计数器BL 0 CMPSW ZF=1 BL BL+1 CX CX-1 DI  DI-2 CX=0 (NUM) BL SISI-1 Y N LOP NEXT1 NEXT

LEA SI,STRBUF LEA DI,STRING MOV CX,COUNT-1 CLD MOV BL,0 LOP: CMPSW JNZ NEXT1 INC BL DEC CX JMP NEXT NEXT1: DEC SI NEXT: DEC DI DEC DI CMP CX,0 ;防止CX已为0,仍使其继续进行-1操作的情况 JZ OUTPUT LOOP LOP OUTPUT: ADD BL,30H MOV NUM,BL MOV AH,9 LEA DX,MESSG INT 21H

五、控制转移指令

六、处理器控制指令 标志位操作指令 其他处理器控制指令

1. 标志位操作指令 不影响其他标志位 CLC ; CF ← 0 STC ; CF ← 1 CMC ; CF ← CF CF DF CLD ; DF ← 0 STD ; DF ← 1 IF CLI ; IF ← 0 STI ; IF ← 1 不影响其他标志位

其他处理器控制指令 —空操作 格式: NOP 功能:完成一次空操作,除使IP ← IP+1外不做任 何操作。占用CPU3个时钟周期,在程序中可做少 量延时调整。

其他处理器控制指令 —停机指令 格式: HLT 功能:使CPU暂停工作,处于等待状态,等待外部中断到来 以结束停机状态,继续下面指令的执行。 其他处理器控制指令 —停机指令 格式: HLT 功能:使CPU暂停工作,处于等待状态,等待外部中断到来 以结束停机状态,继续下面指令的执行。 该指令对标志位无影响

其他处理器控制指令 —等待指令 格式: WAIT 功能:使CPU处于等待状态,等待协处理器完成当前的工作。

其他处理器控制指令 —换码(处理器交权)指令 其他处理器控制指令 —换码(处理器交权)指令 格式: ESC 6位imm,R/M 功能:浮点协处理器8087指令是与8086的整数指令组合在 一起的,当8086发现是一条浮点指令时,就利用ESC指令 将浮点指令交给8087执行 实际编写程序时,一般采用易于理解的浮点指令助记符格式 ESC 6,[SI] ;实数除法指令:FDIV dword ptr [SI] ESC 20H,AL ;整数加法指令:FADD ST(0),ST

其他处理器控制指令 —总线封锁前缀LOCK 功能:与其他指令联合以维持总线的封锁信号直到 与其联合的控制指令执行完成。 用于保证指令的完整执行。

§ 3.4 80x86的机器语言指令概况 介绍指令编码是为了说明CPU指令系统的机器码是 如何构成的 双操作数指令编码格式 2-6字节组成 双操作数指令编码格式 2-6字节组成 单操作数指令编码格式 与AX、AL有关的指令编码格式 其它指令编码格式

一、双操作数指令编码格式 MOV ADD SUB AND data_low data_high D_high D_low d w op code 7 0 d w MOD REG R/M 210 543 76 7 2 1 0 操作特征 寻址特征 位移量 立即数

1、操作特征部分 操作码字段:说明指令规定的操作种类和操作数 的来源(是否使用AX\AL或imm) 方向字段:表示操作数由寻址特征的哪部分表示 1 DEST 由REG字段确定,SRC由MOD和R/M确定 0 DEST 由MOD和R/M 字段确定,SRC由REG确定 d= R或M w字段: 1 字操作 0 字节操作 w=

2、寻址特征部分 表示两个操作数所使用的寻址方式 REG D5D4D3 共3位,8种组合具体确定哪个R REG w=1 w=0 000 AX AL 001 CX CL 010 DX DL 011 BX BL 100 SP AH 101 BP CH 110 SI DH 111 DI BH

2、寻址特征部分 MOD(寻址方式)字段: D7D6共2位 R/M字段: D2D1D0共3位 直接 R间址 基址、变址 基址加变址

MOD R/M EA的计算公式 11 00 01 10 w=0 W=1 000 ( BX+SI) DS ( BX+SI) +D8 ( BX+SI ) +D16 AL AX 001 ( BX+DI) ( BX+DI)+D8 ( BX+DI)+D16 CL CX 010 ( BP+SI ) SS ( BP+SI ) +D8 ( BP+SI )+D16 DL DX 011 ( BP+DI ) ( BP+DI ) +D8 ( BP+DI ) +D16 BL BX 100 ( SI ) (SI) +D8 (SI) +D16 AH SP 101 (DI) (DI) +D8 (DI) +D16 CH BP 110 (BP) (BP) +D8 (BP) + D16 DH SI 111 (BX) (BX) +D8 (BX) + D16 BH DI

3、位移量部分 由寻址特征决定了是否包含该部分 MOD=11/00, 不包含该部分 MOD=01, 第3字节 MOD=10, 第3、4字节

4、立即数部分 如有立即数则位于指令的最后两字节 如有段超越时,在指令编码前加1字节

二、指令的执行时间 取指 取操作数 执行指令 传送结果 各阶段所需时间的总和

指令 寻址方式 时钟周期 加法ADD R-R 3 传送MOV 2 整数乘法IMUL R16 128-154 整数除法IDIV 165-184 移位 R ,1 转移JMP 直接 15 条件转移 不转移 4 转移 16 不仅不同指令的执行时间差别很大,而且同一种指令使用不同的寻址方式执行时间的差别也很大。