 指令系统  寻址方式 第3章 80x86的指令系统和寻址方式 一组指令的集合 指令 与数据有关的寻址方式 与转移地址有关的寻址方式

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、操作码字段 操作码字段表明指令执行何种性质的操作。
大连理工大学软件学院 软件工程系 赖晓晨 计算机组成与结构 大连理工大学软件学院 软件工程系 赖晓晨
本周实验安排 实验内容:(P231)人名排序的例子。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月30日.
第3章 80x86汇编语言程序设计(下).
第3章 80x86汇编语言程序设计(中) 时间不够的情况下只讲16位汇编.
第三章 80 x86的指令系统和寻址方式 3.1 指令概述 x86的寻址方式 ( ※ ) 3.3 程序占有的空间和执行的时间
第三章 指令系统及其寻址方式 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指令系统 黄强 深圳大学 信息工程学院.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月09日.
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
汇编语言程序设计 Assembly Language Programming
第三章 寻址方式与指令系统 3.1 寻址方式 一条指令通常由两大部分构成: 操作码 操作数
/8088指令系统 为便于理解指令的形式和功能, 对指令中操作数符号的约定如下: 大小写字母无区别
第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第四节 Intel 8253在IBM PC机上的应用.
Assembly Language Programming
第2章 汇编语言与汇编程序 ——8086/8088指令系统 mov ax,12h call display Jmp 1234h.
微机原理与接口技术 微机原理与接口技术 朱华贵 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章 寻址方式与指令系统.
微机原理与接口技术 ——80x86微处理器 西安邮电大学 计算机学院 范琳.
第一章 8086程序设计 第二章 MCS-51程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
汇编语言程序设计课程设计 第二次实验 DEBUG基本命令与算术运算指令
微型计算机原理及应用.
第3章 微型计算机输入输出接口 3.1 输入/输出接口 3.2 输入输出数据传输的控制方式 3.3 开关量输入输出接口 欢迎辞.
第六章 子程序结构 §6.1 子程序的设计方法 §6.2 嵌套与递归子程序 §6.3 子程序举例 §6.4 DOS系统功能调用.
第六章 算术运算 6.1 十进制数加减运算 在计算机中采用BCD码来表示十进制数。BCD码就是使用四位二进制数表示一位十进制数。
條件處理.
第5章 循环与分支程序设计 学习目标: 了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。掌握起泡排序算法这种多重循环程序设计中的常用方法。交换标志位的设置在此算法中更能提高效率。学会在数组排序算法中采用折半查找法来提高查找效率。学会使用跳跃表法实现CASE结构。
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
3.4.5 控制转移指令(Control transfer instructions) (一)、控制转移指令概述
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月19日.
第五章:输入输出基本技术 主讲教师:范新民.
第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计算机组织  计算机系统  存储器  中央处理机  外部设备.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月13日.
《微型计算机原理与接口技术》 第4版 王良 宁德师范学院 吴宁 乔亚男 编著 清华大学出版社 出版
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月17日.
第八章 中断系统.
本节内容 内存复制指令 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
微机原理与接口技术 西安邮电大学计算机学院 宁晓菊.
微机原理与接口技术 ——8086微处理器 西安邮电大学 计算机学院 范琳.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月06日.
3. 逻辑运算指令 A、简单逻辑操作指令 CLR A. (不影响CY、AC、 OV标志) CPL A
微机原理与接口技术 西安邮电大学计算机学院 宁晓菊.
第3章 80x86的指令系统和寻址方式 § x86的寻址方式 § x86的指令系统
第6章 子程序结构 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。 2019/7/20 ch6.
微机原理与接口技术 第5章 汇编语言程序设计 西安邮电大学计算机学院 王 钰.
大数据搜索挖掘实验室 第五章 子程序设计 张华平 副教授 博士 Website: 大数据搜索挖掘实验室
第三章 8086的指令系统 8086指令特点 8086的寻址方式 8086的指令格式及数据类型 8086的指令集.
Presentation transcript:

 指令系统  寻址方式 第3章 80x86的指令系统和寻址方式 一组指令的集合 指令 与数据有关的寻址方式 与转移地址有关的寻址方式  指令系统 一组指令的集合 指令 操作码 操作数 ... 操作数  寻址方式 与数据有关的寻址方式 与转移地址有关的寻址方式

1. 8086的寻址方式 与数据有关的寻址方式:以 MOV 指令为例 立即寻址 MOV AX , 3069H 1. 8086的寻址方式 与数据有关的寻址方式:以 MOV 指令为例 立即寻址 MOV AX , 3069H 寄存器寻址 MOV AL , BH 直接寻址 MOV AX , [ 2000H ] 寄存器间接寻址 MOV AX , [ BX ] 寄存器相对寻址 MOV AX , COUNT [ SI ] 基址变址寻址 MOV AX , [ BP ] [ DI ] 相对基址变址寻址 MOV AX , MASK [ BX ] [ SI ] 存储器寻址

* 只能用于 SRC 字段 MOV 40H, AL  * SRC 和 DST 的字长一致 (1) 立即寻址方式* —— 操作数在指令中给出 (1) 立即寻址方式* —— 操作数在指令中给出 指令格式: MOV AL, 5 MOV AX, 3064H MOV AL, ‘A’ * 只能用于 SRC 字段 MOV 40H, AL  * SRC 和 DST 的字长一致 MOV AH, 3064H 

* 字节寄存器只有 AH AL BH BL CH CL DH DL * SRC 和 DST 的字长一致 MOV AH, BX  (2) 寄存器寻址方式* — 操作数在指定的寄存器中 MOV AX, BX MOV AL, BH MOV AX, 3064H * 字节寄存器只有 AH AL BH BL CH CL DH DL * SRC 和 DST 的字长一致 MOV AH, BX  * CS 不能用 MOV 指令改变 MOV CS, AX 

(3) 直接寻址方式* — 有效地址EA由指令直接给出 例:MOV AX, [ 2000H ] EA=2000H, 假设(DS)=3000H, 那么PA=32000H AH AL 30 50 32000 50 30 (AX) = 3050H * 隐含的段为数据段 DS * 可使用段跨越前缀 MOV AX, ES: [2000H] * 操作数地址可由变量(符号地址)表示, 但要注意 VALUE DB 10 变量的属性 MOV AH, VALUE MOV AX, VALUE  MOV AX, WORD PTR VALUE 

寄存器间接寻址* — EA 在基址寄存器(BX/BP) 或变址寄存器(SI/DI) 中 MOV AX, [BX] PA = 16d  (DS) + (BX) MOV AX, ES:[BX] PA = 16d  (ES) + (BX) MOV AX, [BP] PA = 16d  (SS) + (BP) * 不允许使用AX、CX、DX 存放 EA MOV AX, [CX]  * SRC 和 DST 的字长一致 MOV DL, [ BX ] ; [BX]指示一个字节单元 MOV DX, [ BX ] ; [BX]指示一个字单元 * 适于数组、字符串、表格的处理

(5) 寄存器相对寻址方式* * 适于数组、字符串、表格的处理 有效地址 = + 指令格式: MOV AX, COUNT[SI] 或 (5) 寄存器相对寻址方式* 指令格式: MOV AX, COUNT[SI] 或 MOV AX, [COUNT+SI] 假设 (DS)=3000H, (SI)=2000H, COUNT=3000H, 则: PA = 35000H 假设(35000H)=1234H, 那么 (AX)=1234H * 适于数组、字符串、表格的处理 有效地址 = (BX) (BP) 8位 (SI) 16位 (DI) + 位移量

(6) 基址变址寻址方式* (BX) (SI) 指令格式: MOV AX, [BX] [DI] + (BP) (DI) (6) 基址变址寻址方式* 指令格式: MOV AX, [BX] [DI] MOV AX, [BX+DI] MOV AX, ES:[BX] [SI] * 适于数组、字符串、表格的处理 * 必须是一个基址寄存器和一个变址寄存器的组合 MOV AX, [BX] [BP]  MOV AX, [SI] [DI]  (BX) (SI) (BP) (DI) 有效地址 = +

( 7 ) 相对基址变址寻址方式 或 MOV AX, MASK [BX+SI] 或 MOV AX, [MASK+BX+SI] ( 7 ) 相对基址变址寻址方式 MOV AX, MASK [BX] [SI] 或 MOV AX, MASK [BX+SI] 或 MOV AX, [MASK+BX+SI] (BX) (SI) 8位 (BP) (DI) 16位 有效地址 = + + 位移量

段 寄 存 器 的 使 用 规 定 默认的 段寄存器 可跨越的 段寄存器 访问存储器的方式 偏移地址 取指令 CS 无 IP 堆栈操作 SS 无 SP 一般数据访问 DS CS ES SS 有效地址EA BP作为基址的寻址 SS CS DS ES BP 串操作的源操作数 DS CS ES SS SI 串操作的目的操作数 ES 无 DI

( 1 ) 直接寻址 例:编写一段显示字符串STRING的程序 DATA SEGMENT mov dl, string mov ah, 2 STRING DB ‘ HAPPY NEW YEAR! ’, 0DH , 0AH , ‘ $ ’ COUNT DW 17 DATA ENDS ( 1 ) 直接寻址 mov dl, string mov ah, 2 int 21h ; 显示字符‘H’ mov dl, string+1 int 21h ; 显示字符‘A’ :

( 2 ) 寄存器间接寻址 ( 3 ) 寄存器相对寻址 mov cx, count ; mov cx, 17 ( 2 ) 寄存器间接寻址 mov cx, count ; mov cx, 17 mov bx, offset string ; string的偏址  bx Next : mov dl, [bx] mov ah, 2 int 21h ; 显示一个字符 inc bx loop next ; 循环指令 ( 3 ) 寄存器相对寻址 mov cx, count ; mov cx, 17 mov si, 0 Next : mov dl, string[si] ; mov dl, [string+si] mov ah, 2 int 21h ; 显示一个字符 inc si loop next ; 循环指令

( 4 ) 基址变址寻址 ( 5 ) DOS 显示字符串功能 mov cx, count ; mov cx, 17 ( 4 ) 基址变址寻址 mov cx, count ; mov cx, 17 mov bx, offset string ; string的偏址  bx mov si, 0 Next : mov dl, [bx] [si] ; mov dl, [bx+si] mov ah, 2 int 21h ; 显示一个字符 inc si loop next ; 循环指令 ( 5 ) DOS 显示字符串功能 mov dx, offset string ; string的偏址  dx ; lea dx, string mov ah, 9 int 21h ; 显示一串字符

80x86 新增的寻址方式 ( 1 ) 比例变址寻址方式 EA= (基址寄存器) + (变址寄存器)  比例因子 + 位移量 例:MOV EAX, COUNT [ ESI  4 ]

(2) 基址比例变址寻址方式 (3) 相对基址比例变址寻址方式 例:MOV ECX, [ EAX ][ EDI  4 ] 例:MOV EAX, TABLE [ EBP ][ EDI  4 ] ▲ 16位和32位寻址的差异 地址成分 16位寻址 32位寻址 基址寄存器 BX、BP 任何32位通用寄存器 变址寄存器 SI、DI 除ESP外的任何32位通用寄存器 比例因子 1 1、2、4、8

与转移地址有关的寻址方式: 用来确定转移指令及转子指令的转向地址。 段内寻址 段间寻址 段内直接寻址 JMP NEAR PTR NEXT 段内间接寻址 JMP TABLE [ BX ] 段间寻址 段间直接寻址 JMP FAR PTR NEXT 段间间接寻址 JMP DWORD PTR [ BX ]

(1) 段内直接寻址 转向的有效地址 = 当前(IP) + 位移量(8bit/16bit)

例: JMP NEAR PTR NEXT 近转移 -32768 ~ +32767 JMP SHORT NEXT 短转移 -128 ~ +127

(2) 段内间接寻址 转向的有效地址是一个寄存器或存储单元的内容。 (2) 段内间接寻址 转向的有效地址是一个寄存器或存储单元的内容。 (可用除立即数以外的任何一种数据寻址方式得到) 例: TABLE = 20A2H (BX) = 1256H (SI) = 528EH (DS) = 2000H (232F8H) = 3280H (264E4H) = 2450H JMP BX ; (IP)=1256H JMP TABLE[BX] JMP WORD PTR TABLE[BX] ; (IP)=3280H JMP [BX][SI] JMP WORD PTR [BX][SI] ; (IP)=2450H

(3) 段间直接寻址 用指令中提供的转向段地址和偏移地址取代CS 和 IP 例: code2 segment …… next: …... (3) 段间直接寻址 用指令中提供的转向段地址和偏移地址取代CS 和 IP 例: code2 segment …… next: …... code2 ends code1 segment …… jmp far ptr next code1 ends

PA=(DS)×24 + (BX) + INTERS (PA+1, PA)→IP (PA+3, PA+2) →CS (4) 段间间接寻址 用存储器中的两个相继字的内容取代CS 和 IP (存储单元的地址可用存储器寻址方式得到) 例: JMP DWORD PTR [INTERS+BX] PA=(DS)×24 + (BX) + INTERS (PA+1, PA)→IP (PA+3, PA+2) →CS

第3章 练习 Page 107 3.1 3.3 3.5 3.7 3.11 3.13

2. 8086的指令系统  数据传送指令  算术指令  逻辑指令  串处理指令  控制转移指令  处理机控制与杂项操作指令

重点关注: 指令的汇编格式 指令的基本功能 指令支持的寻址方式 指令的执行对标志位的影响 指令的特殊要求 

数据传送指令: MOV、PUSH、POP、XCHG  累加器专用传送指令 IN、OUT、XLAT  地址传送指令 LEA、LDS、LES  通用数据传送指令 MOV、PUSH、POP、XCHG  累加器专用传送指令 IN、OUT、XLAT  地址传送指令 LEA、LDS、LES  标志寄存器传送指令 LAHF、SAHF、PUSHF、POPF  类型转换指令 CBW、CWD

 通用数据传送指令 传送指令: MOV DST, SRC 执行操作: (DST)  (SRC) 注意:  通用数据传送指令 传送指令: MOV DST, SRC 执行操作: (DST)  (SRC) 注意: * DST、SRC 不能同时为段寄存器 MOV DS, ES  * 立即数不能直接送段寄存器 MOV DS, 2000H  * DST 不能是立即数和CS * DST、SRC 不能同时为存储器寻址 * 不影响标志位 MOV AX, DSEG MOV DS, AX

执行操作: (DST)  ( (SP)+1, (SP) ) 进栈指令: PUSH SRC 执行操作: (SP)  (SP) – 2 ( (SP)+1, (SP) )  (SRC) 出栈指令: POP DST 执行操作: (DST)  ( (SP)+1, (SP) ) (SP)  (SP) + 2 堆栈:‘先进后出’的存储区,段地址存放在SS中, SP在任何时候都指向栈顶,进出栈后自动修改SP。 注意: * 堆栈操作必须以字为单位。 * 不影响标志位 * 不能用立即寻址方式 PUSH 1234H  * DST不能是CS POP CS 

* * * * 例:假设 (AX) = 2107 H , 执行 PUSH AX 低地址 高地址 (SP) 进栈方向 (SP) * * * * PUSH AX 执行前 PUSH AX 执行后

* * * * 例: POP BX (BX) = 2107H 低地址 高地址 (SP) 出栈方向 (SP) POP BX 执行前 * * * * POP BX 执行前 POP BX 执行后 (BX) = 2107H

例: PUSH DS SUB AX, AX PUSH AX …… RET 例: PUSH AX PUSH BX PUSH CX …… ;其间用到AX、BX、CX POP CX ; 后进先出 POP BX POP AX

交换指令: XCHG OPR1, OPR2 执行操作: (OPR1)  (OPR2) 注意: * 不影响标志位 * 不允许使用段寄存器 例:XCHG BX, [ BP+SI ] XCHG AL, BH

 累加器专用传送指令(只限使用AX或AL) 输入指令 IN (I/O  CPU) 长格式: IN AL, PORT (字节) IN AX, PORT (字) 执行操作:(AL)  ( PORT ) (字节) (AX)  ( PORT+1, PORT )(字) 短格式: IN AL, DX (字节) IN AX, DX (字) 执行操作:(AL)  ( (DX) ) (字节) (AX)  ( (DX)+1, (DX) )(字)

输出指令 OUT (CPU  I/O) 长格式: OUT PORT, AL (字节) OUT PORT, AX (字) 执行操作:( PORT )  (AL) (字节) ( PORT+1, PORT )  (AX)(字) 短格式: OUT DX, AL (字节) OUT DX, AX (字) 执行操作:( (DX) )  (AL) (字节) ( (DX)+1, (DX) )  (AX)(字)

* 前256个端口号00H~FFH可直接在指令中指定(长格式) * 如果端口号 256,端口号  DX(短格式) 注意: * 不影响标志位 * 前256个端口号00H~FFH可直接在指令中指定(长格式) * 如果端口号 256,端口号  DX(短格式) 例: IN AX, 28H MOV DATA_WORD, AX 例: MOV DX, 3FCH IN AX, DX 例: OUT 5, AL 例:测试某状态寄存器(端口号27H)的第2位是否为1 IN AL, 27H TEST AL, 00000100B JNZ ERROR ;若第2位为1,转ERROR处理

例:Sound程序 设备控制寄存器 mov dx, 100 in al, 61h and al,11111100b 1 0 端口61H 1 / 0 0 2号定时器门控 控制其它外部设备 与门 放大器 mov dx, 100 in al, 61h and al,11111100b sound: xor al, 2 ; 1 0 1 out 61h, al ;ON OFF ON mov cx, 140h ;脉宽 Wait1: loop wait1 dec dx jne sound

执行操作:(AL)  ( (BX) + (AL) ) 换码指令:XLAT 或 XLAT OPR 执行操作:(AL)  ( (BX) + (AL) ) 例:MOV BX, OFFSET TABLE ; (BX)=0040H MOV AL, 3 XLAT TABLE 指令执行后 (AL)=33H 注意: * 不影响标志位 * 字节表格(长度不超过256) 首地址  (BX) * 需转换的代码位移量  (AL) (DS)=F000H TABLE (BX)  30 H F0040 31 H F0041 (AL) = 3 32 H F0042 33 H F0043

 地址传送指令 有效地址送寄存器指令: LEA REG, SRC 执行操作:   (REG)  SRC 指针送寄存器和DS指令: LDS REG, SRC 执行操作: (REG)  (SRC) (DS)  (SRC+2) 相继二字  寄存器、DS 指针送寄存器和ES指令: LES REG, SRC 执行操作: (REG)  (SRC) (ES)  (SRC+2) 相继二字  寄存器、ES

例:LEA BX, [BX+SI+0F62H] 注意: * 不影响标志位 LDS SI, [10H] LES DI, [BX] MOV BX, TABLE ; (BX)=0040H MOV BX, OFFSET TABLE ; (BX)=1000H LEA BX, TABLE ; (BX)=1000H LDS BX, TABLE ; (BX)=0040H ; (DS)=3000H LES BX, TABLE ; (BX)=0040H ; (ES)=3000H TABLE (DS):1000H 40 H 00 H 30 H 注意: * 不影响标志位 * REG 不能是段寄存器   * SRC 必须为存储器寻址方式

执行操作: (AH)  (FLAGS的低字节) AH送标志寄存器指令: SAHF 执行操作: (FLAGS的低字节)  (AH)  标志寄存器传送指令 标志送AH指令: LAHF 执行操作: (AH)  (FLAGS的低字节) AH送标志寄存器指令: SAHF 执行操作: (FLAGS的低字节)  (AH) 标志进栈指令: PUSHF 执行操作: (SP)  (SP) - 2 ( (SP)+1, (SP) )  (FLAGS) 标志出栈指令: POPF 执行操作: (FLAGS)  ( (SP)+1, (SP) ) (SP)  (SP) + 2 * 影响标志位

执行操作: 若(AL)的最高有效位为0,则(AH)= 00H  类型转换指令 CBW AL  AX 执行操作: 若(AL)的最高有效位为0,则(AH)= 00H 若(AL)的最高有效位为1,则(AH)= FFH CWD AX  (DX,AX) 执行操作:若(AX)的最高有效位为0,则(DX)= 0000H 若(AX)的最高有效位为1,则(DX)= FFFFH 例:(AX) = 0BA45H CBW ; (AX)=0045H CWD ; (DX)=0FFFFH (AX)=0BA45H 注意: * 无操作数指令 * 隐含对AL 或AX 进行符号扩展 * 不影响条件标志位

算术指令: AAA、AAS、AAM、AAD ADD、ADC、INC SUB、SBB、DEC、NEG、CMP MUL、IMUL  加法指令 ADD、ADC、INC  减法指令 SUB、SBB、DEC、NEG、CMP  乘法指令 MUL、IMUL  除法指令 DIV、IDIV  十进制调整指令 DAA、DAS、 AAA、AAS、AAM、AAD

执行操作: (DST)  (SRC) + (DST) 带进位加法指令: ADC DST, SRC  加法指令 加法指令: ADD DST, SRC 执行操作: (DST)  (SRC) + (DST) 带进位加法指令: ADC DST, SRC 执行操作: (DST)  (SRC) + (DST) + CF 加1指令: INC OPR 执行操作: (OPR)  (OPR) + 1 注意: * 除INC指令不影响CF标志外,均对条件标志位有影响。

加法指令对条件标志位的影响 SF= ZF= CF= OF= CF 位表示 无符号数 相加的溢出。 OF 位表示 带符号数 相加的溢出。 1 结果为负 0 否则 1 结果为0 0 否则 SF= ZF= 1 和的最高有效位 有 向高位的进位 0 否则 CF= 1 两个操作数符号相同,而结果符号与之相反 0 否则 OF= CF 位表示 无符号数 相加的溢出。 OF 位表示 带符号数 相加的溢出。

举例: n=8 bit 带符号数(-128~127) , 无符号数(0~255) 0 0 0 0 0 1 0 0 + 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 带:(+4)+(+11)=+15 OF=0 无:4+11=15 CF=0 1 0 0 0 0 1 1 1 + 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 带:(-121)+(-11)=+124 OF=1 无:135+245=124 CF=1 带符号数和无符号数都不溢出 带符号数和无符号数都溢出 0 0 0 0 1 0 0 1 + 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 带: (+9)+(+124)=-123 OF=1 无: 9+124=133 CF=0 0 0 0 0 0 1 1 1 + 1 1 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 带:(+7)+(-5)=+2 OF=0 无:7+251=2 CF=1 无符号数溢出 带符号数溢出

例:双精度数的加法 (DX) = 0002H (AX) = 0F365H (BX) = 0005H (CX) = 8100H 指令序列 ADD AX, CX ; (1) ADC DX, BX ; (2) (1) 执行后,(AX) = 7465H CF=1 OF=1 SF=0 ZF=0 (2) 执行后,(DX) = 0008H CF=0 OF=0 SF=0 ZF=0

 减法指令 减法指令: SUB DST, SRC 执行操作: (DST)  (DST) - (SRC)  减法指令 减法指令: SUB DST, SRC 执行操作: (DST)  (DST) - (SRC) 带借位减法指令: SBB DST, SRC 执行操作: (DST)  (DST) - (SRC) - CF 减1指令: DEC OPR 执行操作: (OPR)  (OPR) - 1 求补指令: NEG OPR 执行操作: (OPR)  - (OPR) 比较指令: CMP OPR1, OPR2 执行操作: (OPR1) - (OPR2) 注意: * 除DEC指令不影响 CF标志外,均对条 件标志位有影响。

减法指令对条件标志位(CF/OF/ZF/SF)的影响: 1 被减数的最高有效位 有 向高位的借位 0 否则 CF= 或 1 减法转换为加法运算时 无 进位 0 否则 CF= 1 两个操作数符号相反,而结果的符号与减数相同 0 否则 OF= CF 位表示 无符号数 减法的溢出。 OF 位表示 带符号数 减法的溢出。

NEG 指令对CF/OF的影响 CF = OF = 0 操作数为0 1 否则 1 操作数为 -128 (字节运算)或 0 0 0 1 1 1 1 0 + 0 0 0 1 1 1 1 1 0 操作数为0 1 否则 CF = 1 操作数为 -128 (字节运算)或 操作数为 -32768 (字运算) 0 否则 OF =

NEG 指令对CF/OF的影响 CF = OF = 0 操作数为0 1 否则 1 操作数为 -128 (字节运算)或 0 0 0 0 1 1 1 1 + 0 0 0 1 1 0 0 0 0 0 操作数为0 1 否则 CF = 1 操作数为 -128 (字节运算)或 操作数为 -32768 (字运算) 0 否则 OF = 1 0 0 0 0 1 1 1 + 0 0 0 1

例:x、y、z 均为双精度数,分别存放在地址为X, X+2; Y, Y+2;Z, Z+2的存储单元中,用指令序列实现 w  x + y + 24 - z ,并用W, W+2单元存放w MOV AX, X MOV DX, X+2 ADD AX, Y ADC DX, Y+2 ; x+y ADD AX, 24 ADC DX, 0 ; x+y+24 SUB AX, Z SBB DX, Z+2 ; x+y+24-z MOV W, AX MOV W+2, DX ; 结果存入W, W+2单元

字节操作数 (AX)  (AL) * (SRC) 字操作数 (DX, AX)  (AX) * (SRC)  乘法指令 无符号数乘法指令: MUL SRC 带符号数乘法指令: IMUL SRC 执行操作: 字节操作数 (AX)  (AL) * (SRC) 字操作数 (DX, AX)  (AX) * (SRC) 注意: * AL (AX) 为隐含的乘数寄存器。 * AX (DX,AX) 为隐含的乘积寄存器。 * SRC不能为立即数。 * 除CF和OF外,对条件标志位无定义。

乘法指令对 CF/OF 的影响: IMUL指令: CF,OF = 1010 0101 0101 1011 00 乘积的高一半为零 11 否则 MUL指令: CF,OF = 00 乘积的高一半是低一半的符号扩展 11 否则 IMUL指令: CF,OF = 1010 0101 0101 1011 例:(AX) = 16A5H,(BX) = 0611H (1) IMUL BL ; (AX)  (AL) * (BL) ; A5*11  5B*11=060B  F9F5 ; (AX) = 0F9F5H CF=OF=1 (2) MUL BX ; (DX, AX)  (AX) * (BX) ; 16A5*0611=0089 5EF5 ; (DX)=0089H (AX)=5EF5H CF=OF=1

字节操作 (AL)  (AX) / (SRC) 的商 (AH)  (AX) / (SRC) 的余数  除法指令 无符号数除法指令: DIV SRC 带符号数除法指令: IDIV SRC 执行操作: 字节操作 (AL)  (AX) / (SRC) 的商 (AH)  (AX) / (SRC) 的余数 字操作 (AX)  (DX, AX) / (SRC) 的商 (DX)  (DX, AX) / (SRC) 的余数 注意: * AX (DX,AX) 为隐含的被除数寄存器。 * AL (AX) 为隐含的商寄存器。 * AH (DX) 为隐含的余数寄存器。 * SRC不能为立即数。 * 对所有条件标志位均无定义。如何判别结果有效?

例:x , y , z , v 均为16位带符号数,计算 ( v - ( x*y + z – 540 ) ) / x MOV AX, X IMUL Y ; x*y →(DX,AX) MOV CX, AX MOV BX, DX MOV AX, Z CWD ;Z →(DX,AX) ADD CX, AX ADC BX, DX ; x*y+z →(BX,CX) SUB CX, 540 SBB BX, 0 ; x*y+z-540 MOV AX, V CWD ;V →(DX,AX) SUB AX, CX SBB DX, BX ; v-(x*y+z-540) IDIV X ; (v-(x*y+z-540))/x→(AX) 余数→(DX)

 十进制调整指令 例:( 59 )10 =( 0101 1001 )BCD BCD码:用二进制编码的十进制数,又称二--十进制数  十进制调整指令 BCD码:用二进制编码的十进制数,又称二--十进制数 压缩的BCD码:用 4 位二进制数表示 1 位十进制数 例:( 59 )10 =( 0101 1001 )BCD 非压缩的BCD码:用 8 位二进制数表示 1 位十进制数 例:( 59 )10 =( 0000 0101 0000 1001 )BCD 数字的 ASCII 码是一种 非压缩的 BCD 码 DIGIT ASCII BCD 0 30H 0011 0000 1 31H 0011 0001 2 32H 0011 0010 … … … 9 39H 0011 1001

例:写出( 3590 )10的压缩 BCD 码和非压缩BCD码,并分 别 把它们存入数据区 PAKED 和 UNPAK PAKED 90H 35H UNPAK 00H 09H 05H 03H

十进制调整指令 问题的提出: 19 压缩BCD: 0001 1001 + 08 + 0000 1000 27 0010 0001 + 110 + 08 + 0000 1000 27 0010 0001 + 110 (0010 0111)BCD AF=1

(1)压缩的BCD码调整指令 (2)非压缩的BCD码调整指令 ● DAA 加法的十进制调整指令 ● DAS 减法的十进制调整指令 ● AAA 加法的ASCII码调整指令 ● AAS 减法的ASCII码调整指令 ● AAM 乘法的ASCII码调整指令 ● AAD 除法的ASCII码调整指令

压缩BCD运算举例: (1) MOV AL, BCD1 ; BCD1=34H ADD AL, BCD2 ; BCD2=59H, (AL)=8DH DAA ; 8DH+06H=93H MOV BCD3, AL ; BCD3=93H (2) MOV AL, BCD1 ; BCD1=34H SUB AL, BCD2 ; BCD2=59H , (AL)=0DBH DAS ; 0DBH-60H-06H=75H MOV BCD3, AL ; BCD3= 75 = - 25 (10n’补码)

(1) MUL BL ; (AX)=(AL)×(BL)=08 × 09 非压缩BCD运算举例: (1) MUL BL ; (AX)=(AL)×(BL)=08 × 09 AAM ; (AL)/0AH= 48H /0AH→ 0702 (2)AAD ; (AX) →(AH) ×0AH+(AL)=48H DIV BL ; (AL) = (AX)/(BL)=48H/4=12H AAM ; (AL)/0AH=12H/0AH=0108

第3章作业 Page 109 3.14 ~ 3.17

逻辑指令: AND、OR、NOT、XOR、TEST  移位指令 SHL、SHR 、 SAL 、SAR、 ROL、ROR、RCL、RCR  逻辑运算指令 AND、OR、NOT、XOR、TEST  移位指令 SHL、SHR 、 SAL 、SAR、 ROL、ROR、RCL、RCR

 逻辑运算指令 逻辑非指令:NOT OPR * OPR不能为立即数 执行操作: (OPR)   (OPR) * 不影响标志位  逻辑运算指令 逻辑非指令:NOT OPR * OPR不能为立即数 执行操作: (OPR)   (OPR) * 不影响标志位 逻辑与指令:AND DST, SRC 执行操作: (DST)  (DST)  (SRC) 逻辑或指令:OR DST, SRC 执行操作: (DST)  (DST)  (SRC) 异或指令: XOR DST, SRC 执行操作: (DST)  (DST)  (SRC) 测试指令: TEST OPR1, OPR2 执行操作: (OPR1)  (OPR2) CF OF SF ZF PF AF 0 0 * * * 无定义 根据运算结果设置

例:屏蔽AL的第0、1两位 AND AL, 0FCH 例:置AL的第5位为1 OR AL, 20H 例:使AL的第0、1位变反 * * * * * * * * AND 1 1 1 1 1 1 0 0 * * * * * * 0 0 例:屏蔽AL的第0、1两位 AND AL, 0FCH 例:置AL的第5位为1 OR AL, 20H 例:使AL的第0、1位变反 XOR AL, 3 例:测试某些位是0是1 TEST AL, 1 JZ EVEN * * * * * * * * OR 0 0 1 0 0 0 0 0 * * 1 * * * * * * * * * * * 0 1 XOR 0 0 0 0 0 0 1 1 * * * * * * 1 0 * * * * * * * * AND 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 *

算术左移 SAL OPR, CNT(同逻辑左移) 算术右移 SAR OPR, CNT CF 0  移位指令 逻辑左移 SHL OPR, CNT 逻辑右移 SHR OPR, CNT 算术左移 SAL OPR, CNT(同逻辑左移) 算术右移 SAR OPR, CNT CF 0 0 CF CF

循环左移 ROL OPR, CNT 循环右移 ROR OPR, CNT 带进位循环左移 RCL OPR, CNT 带进位循环右移 RCR OPR, CNT CF CF CF CF

注意: * OPR可用除立即数以外的任何寻址方式 * CNT=1,SHL OPR, 1 CNT>1,MOV CL, CNT SHL OPR, CL ; 以SHL为例 * 条件标志位: CF = 移入的数值 1 CNT=1时,最高有效位的值发生变化 0 CNT=1时,最高有效位的值不变 移位指令: SF、ZF、PF 根据移位结果设置,AF无定义 循环移位指令: 不影响 SF、ZF、PF、AF OF =

例:(AX)= 0012H,(BX)= 0034H,把它们装配成(AX)= 1234H MOV CL, 8 ROL AX, CL ADD AX, BX 例:(BX) = 84F0H (1) (BX) 为无符号数,求 (BX) / 2 SHR BX, 1 ; (BX) = 4278H (2) (BX) 为带符号数,求 (BX) ×2 SAL BX, 1 ; (BX) = 09E0H, OF=1 (3) (BX) 为带符号数,求 (BX) / 4 MOV CL, 2 SAR BX, CL ; (BX) = 0E13CH

(3) (BX)=84F0H,把 (BX) 中的 16 位数每 4 位压入堆栈 MOV CH, 4 ; 循环次数 MOV CL, 4 ; 移位次数 NEXT: ROL BX, CL MOV AX, BX AND AX, 0FH PUSH AX DEC CH JNZ NEXT 0000  (SP) 000F 0004 0008

串处理指令: CLD、STD MOVSB / MOVSW REP STOSB / STOSW REPE / REPZ  设置方向标志指令 CLD、STD  串处理指令  串重复前缀 MOVSB / MOVSW REP STOSB / STOSW REPE / REPZ LODSB / LODSW REPNE / REPNZ CMPSB / CMPSW SCASB / SCASW

与 REP 配合工作的 MOVS / STOS / LODS 执行操作: (1) 如 (CX)=0 则退出 REP,否则转(2) (2) (CX)  (CX) -1 (3) 执行 MOVS / STOS / LODS (4) 重复 (1) ~ (3)

MOVS 串传送指令: MOVS DST, SRC MOVSB (字节) MOVSW (字) 例:MOVS ES: BYTE PTR [DI], DS: [SI] 执行操作: (1) ((DI)) ← ((SI)) (2) 字节操作:(SI)←(SI)±1, (DI)←(DI)±1 字操作: (SI)←(SI)±2, (DI)←(DI)±2 方向标志 DF=0 时用 + ,DF=1 时用 - 。 REP MOVS:将数据段中的整串数据传送到附加段中。 源串(数据段)→ 目的串(附加段)

执行 REP MOVS 之前,应先做好: (1) 源串首地址(末地址)→ SI (2) 目的串首地址(末地址)→ DI (3) 串长度 → CX (4) 建立方向标志 ( CLD 使 DF=0,STD 使 DF=1 )

数据段 附加段 (SI) (DI) DF=0 DF=1 (SI) (DI)

data segment mess1 db ‘personal_computer’ data ends extra segment mess2 db 17 dup (?) extra ends code segment mov ax, data mov ds,ax mov ax, extra mov es, ax lea si, mess1 lea di, mess2 mov cx, 17 cld rep movsb … code ends lea si, mess1+16 lea di, mess2+16 mov cx, 17 std rep movsb

mess2 db 17 dup (?) data segment mess1 db ‘personal_computer’ data ends code segment mov ax, data mov ds, ax mov es, ax lea si, mess1 lea di, mess2 mov cx, 17 cld rep movsb … code ends

STOS 存入串指令: STOS DST STOSB (字节) STOSW (字) 执行操作: 字节操作:((DI))←(AL), (DI)←(DI)±1 字操作:((DI))←(AX), (DI)←(DI)±2 例:把 附加段 中的 10 个字节缓冲区置为 20H lea di, mess2 mov al, 20H mov cx, 10 cld rep stosb lea di, mess2 mov ax, 2020H mov cx, 5 cld rep stosw

LODS 从串取指令: LODS SRC LODSB (字节) LODSW (字) 执行操作: 注意: 字节操作:(AL)←((SI)), (SI)←(SI)±1 字操作:(AX)←((SI)), (SI)←(SI)±2 注意: * LODS 指令一般不与 REP 联用 * 源串一般在数据段中(允许使用段跨越前缀来修改), 目的串必须在附加段中 * 不影响条件标志位

与 REPE / REPZ(REPNE / REPNZ)配合工作的 CMPS 和 SCAS REPE / REPZ REPNE / REPNZ 执行操作: (1) 如 (CX)=0 或 ZF=0 (ZF=1) 则退出串操作, 否则转(2) (2) (CX)←(CX) -1 (3) 执行 CMPS / SCAS (4) 重复 (1) ~ (3)

CMPS 串比较指令: CMPS SRC, DST CMPSB (字节) CMPSW (字) 执行操作: (1) ((SI)) - ((DI)) 根据比较结果置条件标志位:相等 ZF=1 不等 ZF=0 (2) 字节操作:(SI)←(SI)±1, (DI)←(DI)±1 字操作: (SI)←(SI)±2, (DI)←(DI)±2

SCAS 串扫描指令: SCAS DST SCASB (字节) SCASW (字) 执行操作: 字节操作:(AL) - ((DI)), (DI)←(DI)±1 字操作: (AX) - ((DI)), (DI)←(DI)±2

例:从一个字符串中查找一个指定的字符 mess db ‘COMPUTER’ lea di, mess mov al, ‘T’ mov cx, 8 cld repne scasb (di)  C O M P U T (di):相匹配字符的下一个地址 (cx):剩下还未比较的字符个数 (di)  E (CX)=2 R

例:比较两个字符串,找出它们不相匹配的位置 lea si, mess1 lea di, mess2 mov cx, 8 cld repe cmpsb 例:反向传送 lea si, mess1+7 lea di, mess2+7 mov cx, 8 STd rep movsb

控制转移指令:  无条件转移指令 JMP JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、  无条件转移指令 JMP  条件转移指令 JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、 JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、 JLE / JNLE、 JCXZ  循环指令 LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE  子程序调用和返回指令 CALL、RET  中断与中断返回指令 INT、INTO、IRET

无条件转移指令: 段内直接短转移:JMP SHORT OPR 执行操作:(IP) ← (IP) + 8位位移量 段内直接近转移:JMP NEAR PTR OPR 执行操作:(IP) ← (IP) + 16位位移量 段内间接转移: JMP WORD PTR OPR 执行操作: (IP) ← (EA)

段间直接远转移:JMP FAR PTR OPR 执行操作:(IP) ← OPR 的段内偏移地址 (CS) ← OPR 所在段的段地址 段间间接转移: JMP DWORD PTR OPR 执行操作: (IP) ← (EA) (CS) ← (EA+2)

条件转移指令: 注意:只能使用段内直接寻址的8 位位移量 (1) 根据单个条件标志的设置情况转移 格式 测试条件 (1) 根据单个条件标志的设置情况转移   格式 测试条件 JZ(JE) OPR ZF = 1 JNZ(JNE) OPR ZF = 0 JS OPR SF = 1 JNS OPR SF = 0 JO OPR OF = 1 JNO OPR OF = 0 JP OPR PF = 1 JNP OPR PF = 0 JC OPR CF = 1 JNC OPR CF = 0

(2) 比较两个无符号数,并根据比较结果转移* (2) 比较两个无符号数,并根据比较结果转移* 格式 测试条件 < JB (JNAE,JC) OPR CF = 1 ≥ JNB (JAE,JNC) OPR CF = 0 ≤ JBE (JNA) OPR CF∨ZF = 1 > JNBE (JA) OPR CF∨ZF = 0 * 适用于地址或双精度数低位字的比较

格式 测试条件 格式 测试条件 JCXZ OPR (CX)=0 (3) 比较两个带符号数,并根据比较结果转移* * 适用于带符号数的比较 (3) 比较两个带符号数,并根据比较结果转移* 格式 测试条件 < JL (JNGE) OPR SFOF = 1 ≥ JNL (JGE) OPR SFOF = 0 ≤ JLE (JNG) OPR (SFOF)∨ZF = 1 > JNLE (JG) OPR (SFOF)∨ZF = 0 * 适用于带符号数的比较 (4) 测试 CX 的值为 0 则转移 格式 测试条件 JCXZ OPR (CX)=0

MOV AX, X 例:如果 X>50,转到TOO_HIGH;否则 |X-Y| → RESULT, 如果溢出转到 OVERFLOW, CMP AX, 50 TOO_HIGH SUB AX, Y OVERFLOW NONNEG NEG AX NONNEG: MOV RESULT, AX TOO_HIGH: …… OVERFLOW: JG JO JNS

例:、 是双精度数,分别存于 DX,AX 及 BX,CX 中,  >  时转 L1 ,否则转 L2 CMP DX, BX JG L1 JL L2 CMP AX, CX JA L1 L2: …… L1:

循环指令: LOOP LOOPZ / LOOPE LOOPNZ / LOOPNE 执行步骤: 注意: * CX 中存放循环次数 * 只能使用段内直接寻址的8 位位移量 LOOP LOOPZ / LOOPE LOOPNZ / LOOPNE 执行步骤: (1) (CX) ← (CX) - 1 (2) 检查是否满足测试条件,如满足则 (IP) ← (IP) + 8位位移量,实行循环; 不满足则 IP 不变,退出循环。

DEC CX 循环指令:LOOP OPR 测试条件:(CX)  0 为零或相等时循环指令:LOOPZ(LOOPE) OPR 测试条件:ZF=1 且 (CX)  0 不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR 测试条件:ZF=0 且 (CX)  0 LOOP AGAIN DEC CX JNZ AGAIN

例:求首地址为 ARRAY 的 M 个字之和, 结果存入 TOTAL MOV CX, M MOV AX, 0 MOV SI, AX AGAIN: ADD AX, ARRAY[SI] ADD SI, 2 LOOP AGAIN MOV TOTAL, AX

例:在多重循环的程序结构中,CX 计数器的保存和恢复 MOV CX, M AGAIN: …… PUSH CX MOV CX, N NEXT: …… LOOP NEXT …… POP CX LOOP AGAIN MOV DI, M AGAIN: …… MOV CX, N NEXT: …… LOOP NEXT …… DEC DI JNZ AGAIN

子程序调用和返回指令: 段内调用和返回 段间调用和返回 code1 segment main proc far code segment …… call far ptr subp ret main endp code1 ends code2 segment subp proc far subp endp code2 ends code segment main proc far …… call subp ret main endp subp proc near subp endp code ends 段内调用和返回 段间调用和返回

CALL 调用指令 段内直接近调用:CALL DST 执行操作: (SP) ← (SP) - 2 段内间接近调用:CALL DST ( (SP)+1,(SP) ) ← (IP) (IP) ← (IP) + 16位位移量 段内间接近调用:CALL DST (IP) ← (EA)

段间直接远调用:CALL DST 执行操作: (SP) ← (SP) - 2 段间间接远调用:CALL DST ( (SP)+1,(SP) ) ← (CS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (IP) (IP) ← 偏移地址 (CS) ← 段地址 段间间接远调用:CALL DST (IP) ← (EA) (CS) ← (EA+2)

RET 返回指令 段内近返回:RET 执行操作: (IP) ← ( (SP)+1,(SP) ) 段内带立即数近返回:RET EXP (CS) ← ( (SP)+1,(SP) ) 段间带立即数远返回:RET EXP

例:带立即数返回 堆栈段 code segment main proc far …… push ax push bx push cx call sub ret main endp sub proc near ret 6 sub endp code ends (IP) (cx) (bx) (ax) (SP) (SP) (SP) 堆栈段

中断指令: 类型0的(IP) 类型0的(CS) 中断向量: 类型1的(IP) 类型1的(CS) 类型N的(IP) 类型N的(CS) 00000 类型0的(CS) 中断向量: 中断例行程序的入口地址,存放于中断向量区。 00000H 003FFH A0000H C0000H F0000H 640K (RAM) 128K (RAM) 192K (ROM) 64K (ROM) 类型1的(IP) 00004 类型1的(CS) 类型N的(IP) 4*N 类型N的(CS) 类型255的(IP) 003FC 类型255的(CS) 中断向量表

中断指令: INT TYPE 或 INT 执行操作: (SP) ← (SP) - 2 溢出中断指令:INTO 执行操作: 若OF=1, ( (SP)+1,(SP) ) ← (FLAGS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (CS) ( (SP)+1,(SP) ) ← (IP) (IP) ← (TYPE*4) (CS) ← (TYPE*4+2) 溢出中断指令:INTO 执行操作: 若OF=1, (IP) ← (10H) (CS) ← (12H)

执行操作: (IP) ← ( (SP)+1,(SP) ) 从中断返回指令:IRET 执行操作: (IP) ← ( (SP)+1,(SP) ) (SP) ← (SP) + 2 (CS) ← ( (SP)+1,(SP) ) (FLAGS) ← ( (SP)+1,(SP) ) 注意: * TYPE (0~255) 是中断类型号, 隐含的类型号为3 * INT 指令还把 IF 和 TF 置0,但不影响其它标志位 * IRET 指令执行完,标志位由堆栈中取出的值确定

处理机控制与杂项操作指令: CLC、 STC、 CMC、 NOP、HLT、WAIT、ESC、LOCK CLD、STD、 CLI、STI  标志处理指令 CLC、 STC、 CMC、 CLD、STD、 CLI、STI  其他处理机控制与杂项操作指令 NOP、HLT、WAIT、ESC、LOCK

标志处理指令: CLC CF ← 0 CMC CF ← CF STC CF ← 1 CLD DF ← 0 STD DF ← 1 CLI IF ← 0 STI IF ← 1 注意: * 只影响本指令指定的标志

HLT 暂停机 (等待一次外中断,之后继续执行程序) WAIT 等待 (等待外中断,之后仍继续等待) ESC 换码 其他处理机控制与杂项操作指令: NOP 无操作 (机器码占一个字节) HLT 暂停机 (等待一次外中断,之后继续执行程序) WAIT 等待 (等待外中断,之后仍继续等待) ESC 换码 LOCK 封锁 (维持总线的锁存信号,直到其后的指令 执行完) 注意: * 不影响条件标志 

80x86 的指令系统: (1) 指令集的32位扩展 * 可使用 32 位的存储器寻址方式 (2) 使用方式的扩展 (1) 指令集的32位扩展 * 所有 16 位指令都可扩展到 32 位 MOV EAX, 1 * 可使用 32 位的存储器寻址方式 MOV EAX, [EDX] (2) 使用方式的扩展 * IMUL:单操作数指令 → 双操作数指令 / 三操作数指令 IMUL REG, SRC * PUSH:允许使用立即数寻址方式 PUSH 36H * 移位指令:移位次数可用 8 位立即数 (1~31)

(3) 新增指令 MOVSX 带符号扩展传送 MOVZX 带零扩展传送 PUSHA / PUSHAD 所有寄存器进栈 (3) 新增指令 MOVSX 带符号扩展传送 MOVZX 带零扩展传送 PUSHA / PUSHAD 所有寄存器进栈 POPA / POPAD 所有寄存器出栈 LFS / LGS / LSS 指针送寄存器和 FS / GS / SS PUSHFD 标志进栈 POPFD 标志出栈 CWDE 字转换为双字 EAX CDQ 双字转换为 4 字 EDX EAX BSWAP 32 位寄存器的字节次序变反 XADD 交换加 CMPXCHG 比较并交换 (486) CMPXCHG8B 比较并交换 8 字节(Pentium)A

BT 位测试 BTS 位测试并置1 BTR 位测试并置0 BTC 位测试并变反 BSF 正向位扫描 BSR 反向位扫描 SHLD 双精度左移 SHRD 双精度右移 INSB / INSW / INSD 串输入 OUTSB / OUTSW / OUTSD 串输出

条件设置指令 其他处理机控制指令 特权指令 (1) 根据单个条件标志的值把目的字节置 1 SETZ / SETE SETNZ / SETNE (1) 根据单个条件标志的值把目的字节置 1 SETZ / SETE SETNZ / SETNE SETS / SETNS SETO / SETNO SETP / SETPE SETNP / SETPO SETC / SETB / SETNAE SETNC / SETNB / SETAE (2) 比较两个无符号数,根据比较结果把目的字节置 1 SETB / SETNAE / SETC SETNB / SETAE / SETNC SETBE / SETNA SETNBE / SETA (3) 比较两个带符号数,根据比较结果把目的字节置 1 SETL / SETNGE SETNL / SETGE SETLE / SETNG SETNLE / SETG 其他处理机控制指令 BOUND 界限指令 ENTER 建立堆栈帧 LEAVE 释放堆栈帧  特权指令

第3章 练习 Page 109 3.14 ~ 3.17 Page 107 3.23 3.26 3.30 3.31 3.34 3.36 ~ 3.38 3.39 3.22