MOV [BX]+12H,DAT1 avx指令集对于游戏对还是错

微机原理模拟试题及参考答案
阳光网【期末试题】 编辑:admin
  模拟试题对于我们掌握微机原理课程知识点起着重要的作用,下面是阳光网小编整理的微机原理模拟试题,以供大家阅读。
  微机原理模拟试题一、填空题
  (20*1)
  1、微机系统由( 硬件系统)和( 软件系统 )两部分组成。
  2、8086有( 20 )位地址线,存储器容量为( 1M )B。
  3、8086CPU 内部组成结构从功能上讲,可分为( BIU )和( EU )两部分。 4、的四个段寄存器为( DS )、( ES )、( SS )、( CS )
  5、用来存放CPU状态信息的寄存器是( FLAGS )。
  6、用来存放指令地址的寄存器是( IP )。
  7、8086的16位标志寄存器FLAGS中OF=1表示运算结果( 溢出 ),ZF=1表示运算结果为零。PF=0表示运算结果的低8位中1的个数为( 奇数 )。
  8、 8086的16位标志寄存器FLAGS中IF=1表示CPU( 允许 )中断,TF=1表示CPU进入( 单步 )工作方式。
  9、地址4000H:0300H,其物理地址是(40300H),段地址是(4000H ),偏移地址是 (0300H )。 10、8086存储器管理采用( 分段管理 )技术。
  11、I/O端口的寻址方式有两种,分别是( 直接寻址 ),( 间接寻址 )。
  12、指令JO NEXT 表示OF=( 1 )时转移。
  13、将I/O设备端口内容读入AL中的指令助记符是( IN )。
  14、8086CPU的 I/O指令采用间接寻址时,使用的间接寄存器是( DX )。
  15、设置DF=1的指令为( STD )。
  16、清除CF标志的指令为( CLC )。
  17、一对操作堆栈的指令为( POP )和( PUSH )。
  18、LOOPNZ的循环条件为( CX&0且ZF=0 )。
  19、实现无符号数乘2的指令的助记符是( SHL ),实现有符号数除2的指令的助记符是( SAR )。
  20、变量/标号的三个属性是( 段属性 ),( 偏移属性 ),( 类型属性 )。
  21、DEBUG命令中,反汇编命令的英文字母为( U ),显示内存命令的英文字母为( D ),跟踪执行命令的英文字母为( T ),显示和修改寄存器的命令( R ),汇编命令是( A )。 22、8086CPU引脚信号中中断请求两个信号名称为( INT )和( NMI )。
  23、半导体存存储器按使用功能分为( RAM )和( ROM )两种。
  24、地址译码方式有( 单译码 )和( 双译码 )两种。
  25、接口电路中一般有( 数据 )、 ( 状态 ) 和( 控制 )三种端口。
  26、I/O端口的编址方式一般有( 存储器统一编址 )和 ( 独立编址 )两种
  27、CPU与IO设备之间数据传送控制方式常见的有( 程序控制方式 )、( 中断控制方式 )和( DMA )三种。
  28.在串行通信中有( 同步通讯 )、( 异步通讯 )两种最基本的通信方式。
  29.1片8259A中断控制器可管理( 8 )级中断,用9片8259A可构成( 64 )级主从式中断管理系统。
  微机原理模拟试题二、选择题
  (20*1)
  1、源的变址寄存器是( A)。
  A)SI B)DI C)SP D)BX
  2、用来存放即将执行的指令的偏移地址的寄存器是( B )。
  A)SP B)IP C)BP D)CS
  3、用来存放运行结果状态的寄存器为( C )操作。
  A)SP B)SI C)FLAGS D)DX
  4、微机中控制总线传送的是( D )。
  A)存储器和I/O接口的地址码
  B)微处理器向内存储器和I/O接口传送的命令信号
  C)存储器和I/O设备向微处理器传送的状态信号
  D)B和C
  5.在下列指令的表示中,不正确的是( C )
  A.MOV AL,[BX+SI] B.JMP SHORT DONI
  C.DEC 100 D.MUL CL
  6.将DX的内容除以2,正确的指令是( C )
  A.DIV 2 B.DIV DX,2 C.SAR DX,1 D.SHL DX,1
  7.若栈顶的物理地址是20100H,当执行完POP AX指令后,栈顶的物理地址是( A )。
  A)20102H B)20101H C)20100H D)20103H
  8.下列指令中,源操作数的寻址方式中,( C )属于立即寻址,( B )属于寄存器寻址,( E )属于寄存器间接寻址,( A )属于直接寻址,( D )属于寄存器相对寻址。
  A)MOV AX,[4000H] B)MOV [BX],AX
  C)SUB AX,2000H D)MOV AX,[SI+12H]
  E)MOV CX,[BX] F)MOV AX,[SI+BX+10H]
  9.下列指令中错误指令是( B )、( E )和( F )。
  A)MOV AX,DS B)MOV CS,1500H
  C)MOV SI,BX D)MOV [3000H],AL
  E)MOV [DI+32H],[1845H] F)MOV AL,1000H
  10.指令LOOPNZ的循环结束条件是( D )。
  A)CX=0且ZF=0 B)CX=0或ZF=0
  C)CX=0且ZF=1 D)CX=0或ZF=1
  11.语句DA1 DB 2 DUP(4,6),5汇编后,与该语句功能等同的语句是( C )。
  A)DA1 DB 4,6,5 B)DA1 DB 2,4,6,5
  C)DA1 DB 4,6,4,6,5 D)DA1 DB 4,6,5,4,6,5
  12、对于语句 Y DW 10 DUP(0),则TYPE Y为(A )、LENGTH Y为(B ),SIZE Y为( C )。
  A)2 B)10 C)20 D)4
  13、8086CPU引脚MN/ MX 接电源电压时,表示系统工作于( A )。
  A)最小模式 B)最大模式
  14、CPU的RD、M/IO引脚上为逻辑0时,意味着( C )操作。
  A)读存储器 B)写存储器 C)读I/O端口 D)写I/O端口
  15、Intel 8286的作用是( D )
  A)地址锁存 B)产生时钟 C)总线控制 D)数据驱动
  [3、Intel 8282的作用是( A )
  A)地址锁存 B)产生时钟 C)总线控制 D)数据驱动
  4、Intel 8284的作用是( B )
  A)地址锁存 B)产生时钟 C)总线控制 D)数据驱动
  6、Intel 8288的作用是( C )
  A)地址锁存 B)产生时钟 C)总线控制 D)数据驱动]
  16.以下存储器件,若存有数据,当掉电时,( B )存储器件不能保留原有数据?
  A)磁芯存储器 B)RAM C)ROM
  17.可编程芯片8259的作用是( B )。
  A.定时/计数 B.中断控制 C.并行输入输出 D.数/摸转换
  18.在串行通信中,每一位数据传送所需要时间与( A )有关。
  A.波特率 B.帧格式 C.CPU频率 D.固定不变
  19.芯片DAC0832的作用是( D )。
  A.定时/计数 B.模/数转换 C.并行输入输出 D. 数/模转换
  [4.芯片ADC0809的作用是( B )。
  A.定时/计数 B.模/数转换 C.并行输入输出 D. 数/模转换 ]
点击下页还有更多&&&微机原理模拟试题
[微机原理模拟试题及参考答案]相关的文章
【期末试题】图文推荐第三章(1)指令系统_甜梦文库
第三章(1)指令系统
第三章 汇编语言程序设计基本方法3.1 汇编语言基本概念 3.2 指令系统 3.3 汇编语言程序设计的基本方法1 3.1 汇编语言基本概念3.1.1 汇编语言 任何一种语言,都规定了一系列用于编写程序的语句和应该 遵守的语法规则。 汇编语言,根据汇编语言的语句和其语法规则,就可以写出 汇编语言程序。2 3.1 汇编语言基本概念3.1.1 汇编语言与高级语言计算机语言的分类1. 高级语言 如c语言、c++、b语言等2. 低级语言 如汇编语言、机器语言3 3.1 汇编语言基本概念3.1.1 汇编语言与高级语言的区别1. 高级语言与CPU无关 2. 汇编语言与CPU密切相关汇编语言语句与机器的种类和型号密切相关,需要对处理器的结构有更加深入的了解。4 3.1 汇编语言基本概念3.1.1 汇编语言与高级语言的区别例如: X=A+B高级语言(如C语言): X=A+B汇编语言:1.需指出A、B存放在何处 2.相加后,结果存放在何处如:MOVMOBAX, ABX, B AX, BX5ADD 3.1 汇编语言基本概念3.1.1 汇编语言与机器语言机器语言:它的每一条语句就是计算机的可以直接执行的指令,这 些指令以二进制的形式表示。 例如: (AX)+2? (AX) 其机器语言指令为:00 00B(05 02 00H)优点:可以直接执行缺点:不易书写,不易检查。 6 3.1 汇编语言基本概念3.1.1 汇编语言与机器语言汇编语言:其基本思想是采用一组字母、数字或符号来代替一条二 进制码表示的指令。 例如: (AX)+2? (AX) ADD AX, 02 优点:易书写,易检查缺点:需要汇编成机器代码才能执行。 7 3.1 汇编语言基本概念计算机只能执行二进制的机器语言程序。 源程序:采用助记符指令(汇编语言)写成的程序。目标程序:源程序翻译成的机器语言程序。汇编过程(汇编):将源程序翻译成目标程序的过程。汇编源程序目标程序ADD AX, 0200 00 B8 3.1 汇编语言基本概念3.1.1 汇编语言与机器语言汇编语言:一种低级语言。有操作符和操作数等汇编语言程序:用汇编语言书写的程序,也叫汇编语言源序。 汇编程序:将汇编语言程序翻译成机器语言程序的软件。如MASM。 汇编:将汇编语言程序翻译成机器语言程序的过程9 3.1 汇编语言基本概念3.1.1 汇编语言与机器语言 汇编语句:1. 指令 2. 伪指令指令:可由汇编程序翻译成机器语言指令,从而使CPU产生动作,指令 在程序执行时才处理的语句。 例如: ADD AX, 02伪指令:不被翻译成机器语言指令,不产生CPU动作,伪指令是为汇编 程序在汇编时候用的。 例如: STR DB ‘STUDENT’ ;定义了一个字符串 10 3.1.2 汇编语言语句格式空格 :名称操作助记符空格 操作数; 注释例如: CYCLE : ADD AX,02 DATA1 DB 20H,30H,40H; (AX)?(AX)+2DISPLAY PROC FAR 11 3.1.2 汇编语言语句格式名称空格 :操作助记符空格 操作数; 注释1. 名称(非必需) 1. 标识符,可由字母(a~z),数字(0~9)及特殊符号(?、?、@、_、$)组成,不分大小写。如: loop1 stude3? .data12 3.1.2 汇编语言语句格式名称空格 :操作助记符空格 操作数; 注释1. 名称(非必需) 2. 必须由字母打头,若名字有圆点,则圆点有必须用作第一个字符,数字不能做第一个字符。如: data 2datastring cccc1 .proc @string *cccc1 proc.13 3.1.2 汇编语言语句格式名称空格 :操作助记符空格 操作数; 注释1. 名称(非必需) 3. 构成字符的字符总数可多达31个,若超过31个字符,则31个字符以后的字符无效。cdae777 (31个) cdae777mm cdae77700 14 3.1.2 汇编语言语句格式名称 1. 名称名称不是所有语句必需的。大多数情况下,名称表示的是名称后 面各项在内存存放的第一个内存单元的地址(段地址和偏移地址)。空格 :操作助记符空格 操作数; 注释DATA1 DB 20H,30H,40H,50H 假如:(DS)=2000H 那么:DATA1表示的地址就是H H H H20H 30H 40H 50HDATA1H名称----空格代表变量冒号代表标号15 汇编语言语句格式名称空格 :操作助记符空格 操作数; 注释2. 操作助记符(必需)指明该语句的基本功能。它是语句的必要部分。 操作助记符是汇编语言中规定了明确含义的一组符号,所有不能随意使用。ADD DB加法助记符 定义字节变量的伪指令助记符16 汇编语言语句格式名称空格 :操作助记符空格 操作数; 注释3. 操作数(非必需) 语句中的操作数可以是数据本身,也可以是指出如 何获得操作数的信息。 例如:ADD AX, 2第一个操作数:AX,指出操作数存放在AX中;第二个操作数: 2,指出操作数就是数据本身。 17 汇编语言语句格式名称空格 :操作助记符空格 操作数; 注释3. 操作数(非必需)操作数不是语句必需的。若语句为指令,语句中可以没有操作数, 也可以有1~2个操作数;若语句为伪指令,可以有多个操作数。 当语句中有2个或2个以上操作数时,操作数之间应用逗号分隔,而 操作数与助记符之间必须用空格分隔。 例如:ADD AX , 02DATA1 DB 20H, 30H, 40H, 50H 18 汇编语言语句格式名称 4. 注释注释仅用作语句或程序段的说明,它不是程序的可执行部分,汇编 时不形成任何目标码。注释必须以分号开头。它可以作为语句的一部 分,也可以作为一个单独的语句。 例如: CYCLE : ADD AX,02 ;this is a simple program. ; (AX)?(AX)+2空格 :操作助记符空格 操作数; 注释19 汇编语言语句格式名称 总结: 只有操作助记符是必须的,而其它都不是必须的。最完整的语言: CYCLE : ADD AX,02 最简单的语言: STD 20空格 :操作助记符空格 操作数; 注释; (AX)?(AX)+2 3.1.3 汇编语言中的常数和表达式1.常数(1)数值常数:十进制、八进制、十六进制、二进制等,缺省形式是十进制; (2)字符串常数:用单引号括起来。数值常数:B, 178D, 23H 字符串常数:‘welcome to luoyang’注:数值常数的第一位必须是数字,例如:FFH应表示为0FFH21 3.1.3 汇编语言中的常数和表达式字符串是由单引号括起来的,定义时候,一般被存 储在数据段,且存储的是每个字符的ASII码。如: ‘abc’ 61H, 62H, 63H ‘123’ 31H, 32H, 33H 22 3.1.3 汇编语言中的常数和表达式字符串是由单引号括起来的,定义时候,一般被存 储在数据段,且存储的是每个字符的ASII码。12 ‘12’ (ds):0000 (ds):0001 (ds):000211 1023 3.1.3 汇编语言中的常数和表达式需要说明的是: 汇编语言中的数值常数的第一位必须是数字, 否则汇编时候将被看成是标示符 例如: 十六进制的FFH,必须写出0FFH。 MOV AX , FF00H ;将一个变量送入AXMOV AX , 0FF00H ;将0FF00H 送入AX中。 24 3.1.3 汇编语言中的常数和表达式2.表达式 表达式由操作数和操作符组成, 操作数可以是常数,可以是标识符,也可以是子表达式。 如: 常数:75 + 69 标识符: VB LE VA25 3.1.3 汇编语言中的常数和表达式2.表达式 操作符可以分为算术表达式、逻辑表达式和关系 表达式等。 算术操作符:+、-、*、/、MOD。 逻辑操作符:AND、OR、NOT、XOR。关系操作符:EQ、NE、LT、GT、LE、GE。26 汇编语言中的常数和表达式汇编语言中,表达式不能单独成句,只能作为语句的一部分。语句中表达式的求值在对源程序进行汇编连接时完成。 MOV BUF+2, ALADD AL, 10+56 ;在汇编时变成ADD AL,66,然后在变成机器指令JMP AGAIN+3 MOV BL, VB LE VA27 3.1.4 标号 变量 伪指令名称空格 :操作助记符空格 操作数 空格代表变量; 注释名称-----冒号代表标号 一、标号标号是由标识符表示的指令的名称,用以指示对应指令的位置(地址)。定义方法:在指令的助记符前加上标识符和冒号如: START: ADD AX, 2;其机器指令为:05 02 00h28 3.1.4 标号 变量 伪指令一、标号标号是由标识符表示的指令的名称,用以指示对应指令的位置(地址)。 如: START: ADD AX, 2 ;其机器指令为:05 02 00hSTART表示ADD AX, 2指令在内存单元存放的第一个内存单元的地址。 存储器假如(CS)=2000H,05H的偏 移地址是0010H START表示的是H。H H H05H 02H 00H29 3.1.4 标号 变量 伪指令一、标号有三种属性:段地址、偏移地址和类型。 段地址:是指该标号对应的指令所在段的段地址 偏移地址:是指该标号对应的指令在所在段的偏移地址 类型:NEAR和FAR NEAR: 表示该标号在段内使用,默认值 FAR: 表示该标号在段间使用START: ADD AX, 2;其机器指令为:05 02 00hSTART表示的是H。30 3.1.4 标号 变量 伪指令名称空格 :操作助记符空格 操作数 空格代表变量; 注释名称-----冒号代表标号一、标号的用途标号可以作为程序转移指令的操作数―即要转向的地址 START: ADD AX, 2………JMP START;表示要跳转到处31 3.1.4 标号 变量 伪指令二、变量1. 变量定义汇编语言中变量的值在程序运行期间是可以改变的。2. 定义格式通过伪指令定义的,其格式如下: 变量名 DB 表达式;定义字节变量 变量名 DW 表达式;定义字变量变量名 DD 表达式;定义双字变量变量名 DQ 表达式;定义长字变量 变量名 DT 表达式;定义一个十字节变量变量名是一个标识符,后面不能加冒号,只能用空格,变量名不是必要的。变量名的类型跟后面的关键字DB,DW,DD,DQ,DT有关。 32 3.1.4标号 变量 伪指令变量定义中的表达式可以是:① 一个或多个常数或表达式。当为多个时中间用逗号隔开。② 带引号的字符串。③ 一个问号“?”。只留出相应的存储空间,不存入新的值。 ④ 重复方式。此时表达式部分的格式为:重复次数 DUP (表达式)33 3.1.4 标号 变量 伪指令DATA1 DB 20HDATA2 DW 0204H,1000H DATA3 DB (-1*3),(15/3)H H 3 4 5 6 7 8 20H 04H 02H 00H 10H FDH 05H 45H 23H F H 1 2 3 4 5 6 7 42H 41H 43H 00H 44H 00H ? ? ?DATA4 DD 12345HDATA5 DB ‘0123’ DATA6 DW ‘AB’,’C’,’D’ DATA7 DB ? DATA8 DW ? DATA9 DB 2 DUP (00) DATA10 DW 2 DUP (?)9A B C01H00H 30H 31H89 A B C D0000 ? ?D32H33H?? 34E 标号 变量 伪指令2. 变量的属性 段地址(SEG):变量所在段的段地址。 偏移地址(OFFSET):变量所在段内的偏移地址。 类型(TYPE):变量的类型所定义的每个变量所占据的字 节数,对于DB、DW、DD、DQ、DT定义的变量其类型分别 为1、2、4、8、10。 长度(LENGTH):变量定义时,一个变量名所定义的变量 个数。在含有DUP操作符的变量中,变量名所定义的变量个数 为定义格式中的重复次数。在其它各种变量定义中,每个变量 名所定义的变量个数均为1。 大小(SIZE):变量定义语句中,分配给一个变量名的所有 变量的总的字节数,其值为该变量的类型与长度的乘积。 35 属性操作符及表达式1.获取属性的操作符 用下列的操作符来获取变量或标号的属性 操作符 表达式SEG 变量名或标 号OFFSET 变量名 或标号表达式的意义取变量名或标号所在 段的段地址取变量名或标号在段 内的偏移地址SEGOFFSETTYPELENGTHTYPE 变量名或 标号LENGTH 变量名取变量名或标号的类 型取变量的长度SIZESIZE 变量名取变量的大小36 属性操作符及表达式举例例如: SEG DATA1 OFFSET DATA1 LENGTH DATA6 TYPE DATA6 TYPE DATA9 LENGTH DATA9 SIZE DATA 9;结果为0100H ;结果为0000H ;结果为1 ;结果为2 ;结果为1 ;结果为5 ;结果为537 属性操作符及表达式表达式不能构成单独的语句,只能是语句的一个成分。例如: MOV AX,SIZE DATA9 ;将data9所占的字节数送AXMOV AX,SEG DATA1 ;将data1段地址送ax MOV BL ,TYPE DATA9 ;将data9的类型(ax)=5 (ax)=0100h (bl)=138 属性操作符及表达式还可以如下定义变量 DAT1 DB 02H DAT2 DW 0F00HDAT3 DB 5 DUP (?)DAT4 DB LENGTH DAT3 ;汇编时,此处的值为将dat3的长度5 DAT5 DW DAT3;汇编时,此处的值为dat3的偏移地址。 假如offset dat3=0008h,则此句实际为 DAT5 DW 0008H 39 属性操作符及表达式2.PTR操作符 格式:类型 PTR 表达式 功能:重新定义已定义的变量或标号的类型。 类型: 变量的类型:BYTE WORD DWORD 标号的类型: NEAR FAR40 属性操作符及表达式例如: DAT3 DW 0011H20:001111H 00HDAT3这样的定义,DAT3是个字变量,0011h必须以字的形式出现。如果用 MOV AL, 55H 20:H41DAT3MOV DAT3 , AL ; 非法指令 属性操作符及表达式例如: DAT3 DW 0011H20:001111H 00H 55H 00HDAT3用PTR重新定义DAT3:
MOV AL, 55H
MOV BYTE PTR DAT3 , ALDAT3需指出的是,变量DAT3仅在该语句中作为字节变量使用, DAT3原来定义的字变量类型并没有被修改。 42 3.2 指令系统指令系统是处理器所能完成的所有指令的集合。它在处理器设计时就确定了的,所以不同的处理器, 其指令系统是中所包含的具体指令将是各不相同的。43 3.2 指令系统3.2.1 数据传送类指令 3.2.2 算术运算类指令 3.2.3 逻辑运算类指令3.2.4 移位指令和循环移位指令3.2.5 处理机控制类指令转移和循环控制指令调用和返回指令 字符串操作指令输入和输出指令44 指令操作数的表达缩写与符号意义缩写与符号意义OPRSRC DST REG RSRC RDST CNT D8 D16 ADDR操作数源操作数目的操作数EASEG DATA ?? ? (X) ∧ ∨ ∨ X有效地址段 立即数 互相交换 替代 X的内容 逻辑与 逻辑或 异或 X的反码45寄存器 源寄存器目的寄存器计数 8位位移量16位位移量地址 位移量DISP 学习指令的注意事项? 指令的功能――该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式。?? ?指令支持的寻址方式――该指令中的操作数可以采用何指令对标志的影响――该指令执行后是否对各个标志位 其他方面――该指令其他需要特别注意的地方,如指令种寻址方式。 有影响,以及如何影响。执行时的约定设置、必须预置的参数、隐含使用的寄存器等。46 3.2.1 数据传送类指令把数据从一个位置传送到另一个位置。14条指令分5组: 1. 2. 3. 4. 5. 通用数据传送: MOV XCHG XLAT 堆栈操作: PUSH POP 标志寄存器传送: LAHF SAHF PUSHF POPF 地址传送: LEA LDS LES 输入输出: IN OUT47 3.2.1 数据传送类指令? 数据传送是计算机中最基本最重要的一种操作,传 送指令也是最常使用的一类指令。 ? 除标志寄存器传送指令外,均不影响标志位。 ? 本节要求: 重点掌握: MOV PUSH POP特别熟悉:一般了解:XCHG XLAT LEALAHF SAHF PUSHF POPF LDS LES以后展开:IN OUT48 操作数存放在: 传送指令MOV(move) 1.指令中,imm格式:MOV DST, SRC 功能:把一个字节或字的操作数从源地址传送至目的地址。 MOV reg/mem,imm ;立即数送寄存器或主存2.寄存器中,reg 3.存储器中,memMOV reg/mem/seg,reg ;寄存器送(段)寄存器或主存 MOV reg/seg,mem MOV reg/mem,seg;主存送寄存器 ;段寄存器送寄存器或主存49 传送指令MOV(move)例1:立即数传送MOV reg/mem,immMOV AL,4 MOV CX,0FFH MOV SI,200H MOV BYTE PTR [SI],0AH ;DS:[SI] ←0AH,BYTE PTR 说明是字节操作;立即数送寄存器或主存;AL←4,字节传送 ;CX←00FFH,字传送 ;SI←0200H,字传送MOV WORD PTR [SI+2],0BH;DS:[SI+2] ←0BH ;DS:[SI+3] ←00H ,WORD PTR 说明是字操作注意:要明确指令是字节操作还是字操作。50 传送指令MOV(move)例2:寄存器传送MOV reg/mem/seg,reg ;寄存器送(段)寄存器或主存MOV MOV MOV MOVAX,BX AH,AL DS,AX [BX],AL51 传送指令MOV(move)例3:存储器传送MOV reg/seg,mem ;主存送寄存器MOV AL,[BX] MOV DX,[BP] ;DX←SS:[BP] MOV ES,[SI] ;ES←DS:[SI]52 传送指令MOV(move)例4:段寄存器传送MOV reg/mem,seg ;段寄存器送寄存器或主存MOV [SI],DS MOV AX,ES53 传送指令MOV(move)举例: MOV AL, 4[DI] 假如:[DI]=0400H 则:EA=0404H(DS):0402H AL (DS):0403H用逻辑地址 来确定内存 单元,无需 知道ds的值。?B(DS):0404H(DS):0405H0AH 0BH54 传送指令MOV(move)举例: MOV AX,[BX+2]假如:[BX]=1000H 则:EA=1002H?(DS):1000H AH AL (DS):1001HBB(DS):1002H (DS):1003H04H 02H55 传送指令MOV(move)举例: MOV [BX][DI],DX假如(BX)=0400H (DI)=1000H 则: EA=1400H?DHDLBB(DS):1400H (DS):1401H00H 04H56 传送指令MOV(move)(DS):0000H定义如下变量(DS):0001H (DS):0002H (DS):0003HDATA1 DW 20H,30HDATA2 DB 50H, 60H,70H(DS):0004H (DS):0005H (DS):0006H (DS):0007HDATA3 DW 10H DUP(?)DATA1 DATA2 DATA3(DS):0000H (DS):0004H (DS):0007H(DS):0025H (DS):0026H20H 00H 30H 00H 50H 60H 70H ? ? ?……….DATA1DATA2DATA3? ?57 传送指令MOV(move)定义如下变量DATA1 DW 20H,30H DATA2 DB 50H, 60H,70H DATA3 DW 10H DUP(?)(DS):0000H (DS):0001H (DS):0002H (DS):0003H (DS):0004HDATA1(DS):0000H(DS):0005H (DS):0006HMOV AX, DATA1等效: MOV AX, [0000H]; 默认的是DSAH AL(DS):0007H20H 00H 30H 00H 50H 60H 70H ? ? ?……….DATA1DATA2DATA300H20H(DS):0025H (DS):0026H? ?58 传送指令MOV(move)定义如下变量DATA1 DW 20H,30H DATA2 DB 50H, 60H,70H DATA3 DW 10H DUP(?)(DS):0000H (DS):0001H (DS):0002H (DS):0003H (DS):0004HDATA3(DS):0007H(DS):0005H (DS):0006HMOV DATA3, BX 等效: MOV [0007H], BX ;默认的是DSBH BL(DS):0007H20H 00H 30H 00H 50H 60H 70H FFH 55H ?……….DATA1DATA2DATA355HFFH(DS):0025H (DS):0026H? ?59 传送指令MOV(move)定义如下变量DATA1 DW 20H,30H DATA2 DB 50H, 60H,70H DATA3 DW 10H DUP(?)(DS):0000H (DS):0001H (DS):0002H (DS):0003H (DS):0004H (DS):0005H (DS):0006H (DS):0007HDATA2(DS):0004HMOV AL, DATA2[DI]假如(DI)=1。则EA=5H等效:MOV AL ,[0005H] ;默认的是DSAL20H 00H 30H 00H 50H 60H 70H FFH 55H ?……….DATA1DATA2DATA360H(DS):0025H (DS):0026H? ?60 传送指令MOV(move)定义如下变量DATA1 DW 20H,30H DATA2 DB 50H, 60H,70H DATA3 DW 10H DUP(?)(DS):0000H (DS):0001H (DS):0002H (DS):0003H (DS):0004H (DS):0005H (DS):0006H (DS):0007HDATA3(DS):0007HMOV DATA3[SI], DX假如(SI)=0。则EA=7H等效:MOV [0007H], DX ;默认的是DSDH20H 00H 30H 00H 50H 60H 70H DDH 23H ?……….DATA1DATA2DATA3DL(DS):0025H (DS):0026H23HDDH? ?61 传送指令MOV(move)定义如下变量DATA1 DW 20H,30H DATA2 DB 50H, 60H,70H DATA3 DW 10H DUP(?) MOV CX, LENGTH DATA3 LENGTH DATA3=10H 故(CX)=0010H MOV BX, SIZE DATA3 SIZE DATA3=2*10H=20H 故(BX)=0020H MOV SI, OFFSET DATA2 OFFSET DATA2=0004H 故(SI)=0004H(DS):0000H (DS):0001H (DS):0002H (DS):0003H (DS):0004H (DS):0005H (DS):0006H (DS):0007H20H 00H 30H 00H 50H 60H 70H ? ? ?……….DATA1DATA2DATA3(DS):0025H (DS):0026H? ?62 传送指令MOV(move)操作数的类型: 当操作数是寄存器时,其类型(TYPE)是确定的; 当操作数是立即数、某种方式所指的内存单元时, 其类型有时是确定的,有时是不确定的。 确定的,如下: 例如: DATA3 DB 02H, 03H,04H MOV SI, 1 ;操作数是SI,16位。 MOV DATA3[SI], 02;操作数类型取决于DATA3,8位;SI是寄存器间接寻址,[SI]表示一个偏移地址,没有类型 63 传送指令MOV(move)操作数的类型: 当操作数是寄存器时,其类型是确定的; 当操作数是立即数、某种方式所指的内存单元时,其类型有时是确 定的,有时是不确定的。不确定的,如下: MOV 4[DI], 02;操作数不确定,是非法指令必须用PTR操作符来指明其操作类型。格式如下: MOV BYTE PTR 4[DI], 02 64 传送指令MOV(move)当然,操作数和目的操作数必须一致,否则,指令为 非法指令。 例如合法指令: MOV AX, BX 非法指令:DATA1 DW 05H,15H,20H DATA2 DB 0FH, 10H, 0AH DATA3 DB 5 DUP(?)MOV AX , BL MOV AL, DATA1 MOV BX, DATA3[SI]65 传送指令MOV(move)立即数AX BX CX AX BX CX DX SI DI SP BP存 储 器段寄存器 DS ES SS CSDX SI DI SP BP66 传送指令MOV(move)操作数存在的地方:1.立即数 ;不具有存储功能2. 寄存器 ; 具有存储功能 3. 存储器 ; 具有存储功能 寄存器:通用寄存器AX/BX/ CX/DX/DI/SI/BP/SP段寄存器 DS/ES/SS/CS 67 传送指令MOV(move)合法传送种类 1. 2. 3. 4. 5. 6. 7. 8. 通用寄存器 通用寄存器 存储器 段寄存器 DS/ES/SS 立即数 立即数 CS CS 通用寄存器 存储器 段寄存器 DS/ES/SS 通用寄存器之间 存储器 通用寄存器 存储器 通用寄存器立即数和CS不能作为目的操作数68 传送指令MOV(move)非法传送种类 1. 2. 3. 4. 5. 6. 7. 存储器 段寄存器 存储器 通用寄存器 存储器 通用寄存器 立即数 存储器 段存储器 立即数 立即数 CS CS 段寄存器MOV [2000H],[3000H] MOV DS, ES MOV 20, [2000H] MOV 20, AX MOV CS, [2000H] MOV CS, AX MOV DS, 0056H立即数和CS不能作为目的操作数 69 传送指令MOV(move)判断是否非法 1. 2. 3. 4. 5. 6. 7. MOV [2200H],[3200H] MOV SS, ES MOV 10, [2000H] MOV 50, AX MOV CS, [2000H] MOV CS, AX MOV DS, 0056H70 传送指令MOV(move)例:实现存储器之间的数据传送buffer1单元的数据传送到buffer2单元( buffer1 和buffer2 都 在内存中)buffer1AXbuffer2MOV AX,buffer1 ;AX←buffer1(将buffer1内容送AX) MOV buffer2,AX ;buffer2←AX ;这里buffer1和buffer2是两个字变量 ;实际表示直接寻址方式 71 传送指令MOV(move)(DS): 0000H 55H AAHAH AX ALBUFFER1 MOV AX,buffer1AAH55H MOV buffer2,AX(DS): 00FFH55H AAHBUFFER272 传送指令MOV(move)例:实现立即数给段寄存器赋值MOV AX, SEG DATA1 ;这里必须是AXMOV DS, AX ; (DS)=2000HH55H DATA1 AAH ……………….73 传送指令MOV(move)总结:1. 存储器之间不能直接传送数据2. 段寄存器之间不能直接传送数据3. CS和立即数不能作为目的操作数 4. 立即数不能直接给段寄存器赋值74 有效地址传送指令LEA(load EA)格式:LEA r16,mem ;r16←mem的有效地址功能:将存储器操作数的有效地址传送至指定寄存器中 例: LEA AX, [2500H] 其功能是将[2500H]的有效地址传送给AX,所有执行 指令后,AX里的内容(AX)=2500H。注:源操作数只能是存储器寻址方式,不能使立即数和寄存器寻址方式; 目的操作数不能是段寄存器。 LEA AX, 2500H ;源操作数是立即数,为非法指令 LEA AX, BX ;源操作数是寄存器,为非法指令 LEA DS, [2500H] ;目的操作数为段寄存器,为非法指令 75 有效地址传送指令LEA(load EA)格式:LEA r16,mem ;r16←mem的有效地址功能:将存储器操作数的有效地址传送至指定寄存器中区别LEA 指令和MOV指令。 LEA AX, 10H[DI] MOV AX, 10H[DI] 假如(DS)=0200H,(DI)=0500H, EA=10HH HFFH 00HLEA AX, 10H[DI]; (AX)=0510H MOV AX, 10H[DI];(AX)=00FFH 76 练习1. 定义字变量DAT,并赋初值H,3312H 2. 将DAT变量的偏移地址送到寄存器SI中 3. 利用SI,寄存器相对寻址方式将0210H,送到AXDAT DW H,3312H LEA SI, DATMOV AX, 2[SI]77 取地址指针指令(LDS,LES)格式:LDS/LES DST, SRC功能:将源操作数SRC的有效地址所对应的内存单元中 的32位内容分别送给DS(或者ES)和指令所指出的寄存 器中。注: 源操作数只能是存储器寻址方式,不能使立即数和寄存器寻址方式; 目的操作数不能是段寄存器(因为要存储32位数据)。 LDS DI, 2500H LES ES, BX LDS SS, [2500H];源操作数是立即数,为非法指令 ;源操作数是寄存器,为非法指令 ;目的操作数为段寄存器,为非法指令78 取地址指针指令(LDS,LES)有下面的便令定义和指令:TABLE POINT1 POINT2 LDS DB DD DD 10H,20H,30H,40,50H HH H H H H H H H H H AH BH CH10H 20H 30H 40H 50H 00H 10H 00H 02H 00H 00H 00H 01HTABLETABLEPOINT1DI,POINT1LESSI,POINT2指令执行后: (DI)=1000H, (DS)=0200H (SI)=0000H, (ES)=0100HPOINT279 标志传送指令LAHF, SAHFLAHF ;AH←FLAG的低8位送到AH中 功能:将标志寄存器的低8位送入寄存器AH SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0 位,而AH的第5/3/1位任意。7 6 SF ZF54 AF32 PF10 CF80 标志传送指令LAHF, SAHFSAHF ;FLAGS的低字节←AH 功能:将AH寄存器内容送FLAGS的低8位。 用AH的第7/6/4/2/0位相应 设置 SF/ZF/AF/PF/CF标志7 6 SF ZF54 AF32 PF10 CF例如:MOV AH, 0FH ; (AH)=BSAHF则:CF=1, PF=1 ,AF=0, ZF=0 , SF=0 81 交换指令XCHG(exchange)格式:XCHG DST, SRC 功能:源操作数SRC和目的操作数DST互换例如:MOVAX,0200HMOVXCHGBX,AX,2200HBX;(AX)=2200H.(AX)=0200H82 交换指令XCHG(exchange)格式:XCHG DST, SRC 功能:源操作数SRC和目的操作数DST互换 该指令是完成寄存器与寄存器或者寄存器和存储器之 间内容的互换。但不能是段寄存器。 交换指令可以在寄存器与寄存器之间对换数据交换指令可以在寄存器与存储器之间对换数据交换指令不能在存储器与存储器之间对换数据 83 换码指令XLAT(translate)格式:XLAT;Al←DS:[BX+AL] 功能:将EA(EA=(BX)+(AL))所对应的内存单 元的一个字节数据送入AL,从而实现AL中的字节变 换。1. 换码指令执行前: 在主存中建立一个字节表格,内容是要转换成的目的代码,表格的首地址存放于BX,将相对表格首地址的位移量存放在AL 。 2. 然后,执行换码指令XLAT:将AL寄存器的内容转换为目标代码。 隐含寻址84 换码指令XLAT(translate)如右表:将表中的代码转换 CODE1 CODE2 0 5 1 8 6 2 3 4 4 9 5 1 6 2 7 3 8 0 85 9 7CODE1转换成代码 CODE2。将CODE2的代码依次 存入地址连续的内存 单元中,其首地址 TABLE送入BX中,将 需要转换的一个 CODE1代码送入AL中, 执行XLAT指令后, AL中便是对应的 CODE2的代码了。 换码指令XLAT(translate)TABLE DB 05H,08H,06H,04H,09H, 01H,02H,03H,00H,07H MOV AX, SEG TABLE MOV DS, AX MOV BX, OFFSET TABLE MOV AL, 05内存单元 TABLE 05 08 06 04 09 01 02 03 00 0786TABLE+5XLAT执行完后,5?1,(AL)=01HTABLE+9 堆栈操作指令在程序设计中,堆栈是个非常有用的一种结构。 在以下情况下会用到堆栈:1. 调用和返回子程序; 2. 保存程序中的某些信息; 3. 中断响应和返回堆栈是一种暂时保存数据的存储机构。它的操作规 则是先进后出,后进先出。87 堆栈操作指令内存单元堆栈通常是存储器的一部分。 如右图,开辟了一个大小为256B (0000H~00FFH)的堆栈。 上面是低地址,下面是高地址。 SP:堆栈指针,又叫栈顶指针。永 远指向栈顶。 栈底:00FFH对应的内存单元。 栈底是固定不变的。 栈顶:SP指向的内存单元。随着 数据的进栈出栈,栈顶在不断的 移动(SP的值在不断的变化)0000H低地址堆 栈 区00FFH SP ? 0100H栈底高地址88 堆栈操作指令栈顶指针SP是一个16位的地址寄存器,用来存放堆栈区中栈 顶内存单元的偏移地址,而堆栈区默认的段地址保存在SS中。 堆栈操作指令只对字进行操作。压栈: 首先 SP?SP-2,然后将数据压 入堆栈。(如将8855H压栈。) 55H 88H SP ?压栈顺 便表明: 高地址 对应高 字节、 低地址 对应低 字节出栈: 首先将数据弹出堆栈, 然后SP?SP+2SP ? 55H 88H 12H 00H00FFH 0100H12H 00H00FFH 0100H(SP)=00FCH (SP)=00FEH(SP)=00FEH89 堆栈操作指令如右图:在内存中开辟了一个堆 栈,其偏移地址为 0000H~00FFH(256B)。 刚开始,堆栈是空栈,栈顶指针 指向0100H。即(SP)=0100H。1. 向堆栈压入0102H。0000H低地址2. (SP)=00FEH,然后再 压入0304H。3. (SP)=00FCH4. 0304H出栈。 (SP)=00FEH00FAH 00FBH 00FCH 00FDH 00FEH 00FFH SP ? 0100H堆 栈 区04H 03H 02H 01H01H栈底高地址90 堆栈操作指令堆栈的操作堆栈只有两种基本操作:进栈和出栈。对应两条指令: PUSH:压入堆栈指令POP:弹出堆栈指令91 堆栈操作指令堆栈的操作堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP。 PUSH r16/m16/seg ;进栈指令: ;SP←SP-2 ;SS:[SP]←r16/m16/seg POP r16/m16/seg ;出栈指令: ;r16/m16/seg←SS:[SP] ;SP←SP+2进栈:先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部; 出栈:先把栈顶的一个字传送至指定的目的操作数,然后堆栈 指针SP加2。
92 堆栈操作指令格式:PUSH SRC ; (SP)?(SP)-2, ( (SP+1) , (SP) ) ? (SRC)功能:将操作数的内容送入堆栈,并修正堆栈指针SP的内容。1. 指令操作必须是字操作; 2. SRC可以是通用寄存器和段寄存器,也可以是内存单元, 但不能是立即数。 3. PUSH指令对FLAG REG的内容没有影响 4. 先修正SP的值,然后把数据压入堆栈93 堆栈操作指令格式:PUSH SRC 功能:将操作数的内容送入堆栈,并修正堆栈指针SP的内容。举例: PUSH AX ; (SP)?(SP)-2, ( (SP+1) , (SP) ) ? (SRC) PUSH DS PUSH [2000H] PUSHF ;将标志寄存器(FLAG REG) 的内容压入堆栈。非法指令: PUSH 2000H ; 操作数不能是立 即数 修改: MOV AX, 2000H PUSH AX94 堆栈操作指令MOV AX, 2000H PUSH AX ;(SP)=00FEH首先 SP?SP-2, (SP+1)?(AH) , (SP)?(AL) 。00FCH 00FDH SP ? 00FEH00FFH 0100H00H 20H 12H 00H(AL) ( AH)先修正SP, 然后压入 堆栈(SP)=00FCH (SP)=00FEH 95 堆栈操作指令格式:POP DST; (AX) ?( (SP+1) , (SP) ) , (SP)?(SP)+2功能:将SP所指向的栈顶的内容取出,并送入DST所指向的寄 存器、内存单元或者标志寄存器,并修正堆栈指针SP的内容。 1. 指令操作必须是字操作; 2. DST可以是通用寄存器和除了CS外段寄存器,也可以是内 存单元,但不能是立即数。 3. POP指令对FLAG REG的内容没有影响 4. 先弹出数据,然后再修正SP的值96 堆栈操作指令格式:POP DST 功能:将SP所指向的栈顶的内容取出,并送入DST所指向的寄 存器、内存单元或者标志寄存器,并修正堆栈指针SP的内容。举例: POP AX; (AX) ?( (SP+1) , (SP) ) (SP)?(SP)+2,POP DS POP [2000H] POPF ;将SP所指向的栈顶内容取出,送入标 志寄存器(FLAG REG),并修正SP的值。非法指令: POP 2000H ; 操作数不能是 立即数 POP CS ;操作数不能使CS97 堆栈操作指令POP AX ;(SP)=00FCH首先, (SP)?(AL), (SP+1)?(AH) ,然后 SP?SP+2 。AHSP ? 00FCH 00FDH 00FEH 00FFH H 12H 00HAL先弹出数 据,再修 正SP(SP)=00FCH (SP)=00FEH 98 堆栈操作指令堆栈用途:保存和恢复寄存器内容MOV SP, 0100H PUSH AX PUSH BX ;对SP 赋值 ; AX内容压栈 ;BX内容压栈PUSH CX……… POP POP POP CX BX AX ; 弹出栈顶内容,送入BX ;弹出栈顶内容,送入BX遵循:后进先出的原则。 99 标志寄存器出入堆栈堆栈可用来:置位单步标志PUSHF ;保存全部标志到堆栈POP AXOR AX,0100H PUSH AX POPF;从堆栈中取出全部标志;设置D8=TF=1, ;AX其他位不变 ;将AX压入堆栈 将堆栈内容取到标志寄存器,;即FLAGS←AX 100 输入输出指令功能:8086通过输入输出指令与外设进行数据传送。IN AL/AX, i8/DX ;AL/AX←I/O端口 ? 输入IN指令将外设数据 传送给CPU内的AL/AX OUT i8/DX, AL/AX ; I/O端口← AL/AX?输出OUT指令将CPU内的AL/AX数据传送给外设输入输出指令将在第4章详述 101 3.2.2 算术运算类指令实现二进制(和十进制)数据的四则运算 1. 加法运算: ADD ADC INC 2. 减法运算:SUB 3. 比较指令:CMP 4. 乘法运算:MUL IMUL SBB DEC NEG CMP5. 除法运算:DIVIDIV6. 符号扩展:CBW CWD 102 3.2.2 算术运算类指令? 四则运算是计算机经常进行的一种操作。算术 运算类指令也是经常使用的一类指令。 ? 请注意算术运算指令对标志的影响。重点掌握:ADD/ADC SUB/SBB INC/DEC CMP 比较熟悉: NEG MUL/IMUL DIV/IDIV 一般了解: CBW CWD103 加法指令ADD(add)格式:ADD DST, SRC 功能: (DST) ? (DST) + (SRC) ,SRC保持不变。 对标志寄存器有影响。 DST DST+SRC举例:MOV ADDAL, 01H BL, AL;(AL)=01HMOV BL, 02H;(BL)=02H;(BL)=03H (AL)=01H104 加法指令ADD(add)SRC:立即数、通用寄存器和内存单元 DST:通用寄存器、内存单元,但不能是立即数。 ADD reg,imm/reg/mem ADD mem,imm/reg合法指令: ADD ADD ADD ADD;reg←reg+imm/reg/mem ;mem←mem+imm/reg非法指令:ADD ADD 0025H, AX ;DST为立即数 WORD PTR[2020H], [3000H]AL, BL CX, 08H AX, [SI] [BX][DI], AX;两个操作数不能同时在内存单元105 加法指令ADD(add)ADD AX, [SI]; 假如(AX)=004AH,(SI)=0100H EA=0100H (AX)?(AX)+020CH AX: 00 1010 + 00 10
(DS):0100H (DS):0101H OF= 0 ZF= 0 PF= 1内存单元0CH 02H SF= 0 AF= 1 CF= 0106(AX)=0236H 加法指令ADD(add)需要指出的是:CF位-----无符号数而言 OF位-----有符号数而言例如:MOV AX, 0FDAAH MOV BX, 0FBCEH10 1010 + 00
00ADD AX, BXOF= 0CF= 1107训练 带进位加法指令ADC(add with carry)格式:ADC DST , SRC ; 功能: (DST)?(DST)+(SRC)+CF,结果影响标 志寄存器 DST DST+SRC+CF注:CF位是上由程序中本指令之前的指令产生的 例如:ADC AX, BX ; (AX)?(AX)+(BX)+CF 108 加法指令ADC(adc)SRC:立即数、通用寄存器和内存单元 DST:通用寄存器、内存单元,但不能是立即数。 ADC reg,imm/reg/mem ADC mem,imm/reg合法指令: ADC ADC ADC ADC;reg←reg+imm/reg/mem+CF ;mem←mem+imm/reg+CF非法指令:ADC ADC 0025H, AX;DST为立即数 WORD PTR[2020H], [3000H]AL, BL CX, 08H AX, [SI] [BX][DI], AX;两个操作数不能同时在内存单元109 带进位加法指令ADC(add with carry)无符号双字加法运算 11 100010 1010 + 00 1110例如:MOV AX, OFDAAHMOV BX, OFBCEH ADD AX, BX ;CF=1 ADC AX, 0001H00 0001+
11 1010 CF=0训练110 减法指令SUB(subtract)格式:SUB DST, SRC 功能: (DST)?(DST) - (SRC),结果影响标志寄存器 DST DST-SRC例如:MOV AL, 05H ;(AL)=05H MOV BL, 02H ;(BL)=02H SUB AL, BL ;(AL)=03H111 减法指令SUB(subtract)? ? SRC:立即数、通用寄存器和内存单元 DST:通用寄存器、内存单元,但不能是立即数。SUB reg,imm/reg/memSUB mem,imm/reg 合法指令: SUB AL,07H SUB AL,[200H] SUB AX, BX;reg←reg-imm/reg/mem;mem←mem-imm/reg非法指令: SUB AL,BX SUB [3000H],[200H] SUB 20, BX112 减法指令SUB(subtract)? 例如: MOV AX, 0560H MOV BX, 0012H SUB AX, BX ;(AX)=054EH 10 0000 - 01 001000 1110OF= 0 ZF= 0SF= 0 AF= 1 CF= 0 训练113PF= 1 带借位减法指令SBB(subtract with borrow)格式:SBB DST, SRC 功能: (DST)?(DST) - (SRC)-CF,结果影响标志 寄存器 DST DST-SRC-CF注:CF位是上由程序中本指令之前的指令产生的 114 减法指令SBB? ? SRC:立即数、通用寄存器和内存单元 DST:通用寄存器、内存单元,但不能是立即数。SBB reg,imm/reg/mem SBB mem,imm/reg 合法指令: SBB AL,07H SBB AL,[200H] SBB AX, BX;reg←reg-imm/reg/mem-CF ;mem←mem-imm/reg-CF 非法指令: SBB AL,BX SBB [3000H],[200H] SBB 20, BX115 带借位减法指令SBB(subtract with borrow)MOV MOV SUB SBB AL, 05H AH, 09H AL, AH AL , 01H ;(AL)=05H ;(AH)=09H ;(AL)?(AL)-(AH) (AL)=FCH, CF=1 ;(AL)?(AL)-01H-CF (AL)=FAH, CF=0 FCH H- 1
H H FCH CF OF= 0 ZF= 0 PF= 1 SF= 1 AF= 0 CF= 0116 FAH CF 带借位减法指令SBB(subtract with borrow)举例:SBB CX, DATA1 DST的寻址方式: 寄存器寻址方式 SRC的寻址方式: 直接寻址方式 功能:(CX)减去DATA1对应的内存单元中的一个字及 CF的当前值,相减后结果返回寄存器CX,并设置标志寄存器 的各位。 (CX)=3F50H DATA1对应的字为1728H CF=1. 其功能:(CX)?(CX) C 1728H - 1 117存储器 H 0008H78 12DATA1 带借位减法指令SBB(subtract with borrow)举例:SBB CX, DATA1 (CX)=3F50H DATA1对应的字为1728H CF=1.内存单元(DS):0006H (DS):0007H……. 28H 17H ……01 11
OF= 0 ZF= 0 PF= 1 SF= 0 AF= 1 CF= 01181?CF10 0111 取负指令NEG(negative)格式:NEG DST 功能:(DST)?0 - (DST) 并影响标志位。即将(DST)取负DST:其寻址方式可以是除了立即数外的其他各 种寻址方式,但不能是段寄存器。 例如1: NEG AX NEG BYTE PTR[DI] NEG DAT1[SI]例如2: NEG 2500H NEG DS NEG CS119 取负指令NEG(negative)DST如果是: 1. 正数――绝对值相同的负数的补码; 2. 负数――绝对值相同的正数. MOV AX , FFA0H NEG AX 00 H - 10 0000 FFA0H(AX)=0060H 60HCF(FFA0)补码=8060H 120 取负指令NEG(negative)DST如果是: 1. 正数――绝对值相同的负数的补码; 2. 负数――绝对值相同的正数. MOV AX , 0005H NEG AX 00 H - 00 H(AX)=0060H
FFFBHCF(FFFB)补码=8005H 121 增量指令INC(increment)格式:INC DST 功能: (DST)? (DST) + 1,并影响标志位,但不影响CF位DST:其寻址方式可以是除了立即数外的其他各 种寻址方式,但不能是段寄存器。 例如1: INC AX INC BYTE PTR[DI] INC DAT1[SI]例如2: INC 2500H INC DS INC CS122 增量指令INC(increment)格式:INC DST 功能: (DST)? (DST) + 1,并影响标志位,但不影响CF位例如1: MOV AX , 0025H INC AX (AX)=0026H123 增量指令INC(increment)INC指令是单操作数指令。主要用于对计数器和地址指针 的调整。 例如: INC CX INC SI INC DI设计加1指令的目的,主要是用于对计数器和地址指针的 调整,所以它们不影响进位CF标志,对其他状态标志位的影 响与ADD、ADC指令一样。124 减量指令DEC(decrement)格式:DEC DST 功能: (DST)?(DST)- 1,不影响进位CF标志,按定义设 置其他状态标志。DST:其寻址方式可以是除了立即数外的其他各 种寻址方式,但不能是段寄存器。 例如1: DEC AX DEC BYTE PTR[DI] DEC DAT1[SI]例如2: DEC 2500H DEC DS DEC CS125 减量指令DEC(decrement)格式:DEC DST 功能: (DST)?(DST)- 1,不影响进位CF标志,按定义设 置其他状态标志。例如1: MOV AX , 0025H INC AX (AX)=0024H126 减量指令DEC(decrement)DEC指令是单操作数指令。主要用于对计数器和地址指 针的调整。 例如: DEC CX DEC SI DEC DI设计加1指令的目的,主要是用于对计数器和地址指针的 调整,所以它们不影响进位CF标志,对其他状态标志位的影 响与SUB、SBB指令一样。127 比较指令CMP(compare)格式:CMP DST, SRC 功能: (DST)-(SRC),同时影响标志寄存器。 CMP指令执行的功能与SUB指令,但结果不 回送目的操作数。DST-SRC相关指令:SUB 类似指令:TEST 128 比较指令CMP(compare)? ? SRC:立即数、通用寄存器和内存单元 DST:通用寄存器、内存单元,但不能是立即数。CMP reg,imm/reg/mem CMP mem,imm/reg 合法指令: CMP AL,BL CNP AL,[DI] CMP AX, CX CMP AX, 06H;reg-imm/reg/mem ;mem-imm/reg 非法指令: CMP AL,BX CMP [3000H],[200H] CMP 20, BX129 比较指令CMP(compare)SUB 和CMP指令的比较 MOV MOV SUB AL, 05H BL, 03H AL, BL MOV MOV CMP AL, 05H BL, 03H AL, BL(AL)?(AL)-(BL) (AL)=05H-03H=02H (BL)=03HOF= 0 ZF= 0 PF= 0(AL)-(BL) (AL)=05HOF= 0(BL)=03HSF= 0SF= 0 AF= 0 CF= 0ZF= 0 PF= 0AF= 0 CF= 0130 比较指令CMP(compare)CMP指令的应用CMP主要用来判断两个数的大小关系,CMP指令用于程序 的跳转前的比较。执行CMP指令之后,可以根据标志位判断两个数的大小 关系。所以,CMP指令后面常跟条件转移指令,根据比较结果 不同产生不同的分支。131 比较指令CMP(compare)CMP指令的应用例16:比较AL是否小于0。PP DB 3 DUP(?) NN DB 3 DUP(?) …………. MOV SI, 0 MOV AL, 05H CMP AL, 0 ;(AL) - 0 JB BELOW ;(AL)&0 MOV PP[SI], AL ;(AL)≥0 ………… MOV NN[SI], AL …… AL&0? 否 存放到PP处 是存放到NN处BELOW:如果大于,存在PP处,如果小于则存在NN处。 132 乘法指令乘法指令分两种:MUL SRCIMUL SRC;无符号数的乘法;有符号数的乘法133 乘法指令格式1:MUL R8/M8 ;无符号字节乘法 功能:(AX)←(AL)*R8/M8 格式2:MUL R16/M16;无符号字乘法 功能:(DX:AX)←(AX)*R16或M16格式1:IMUL R8/M8 ;有符号字节乘法 功能:(AX)←(AL)*R8或M8 格式2:IMUL R16/M16 ;有符号字乘法 功能:(DX:AX)←(AX)*R16或M16注:IMUL指令运算时,操作数和结果均以补码形式表示。 134 乘法指令MUL/IMUL SRCSRC:其寻址方式显式的,可以是除了立即数以外的其他各 种寻址方式,但不能是段寄存器。DST:其寻址方式是隐含的,必须是累加器AL或AX。 字节相乘: (AX)←(AL)*R8/M8,得到16位的结果; 字相乘: (DX:AX)←(AX)*R16或M16,得到32位的结果,其高 字存入DX,低字存入AX中。 135 乘法指令MUL/IMUL SRCSRC:其寻址方式显式的,可以是除了立即数以外的其他各 种寻址方式,但不能是段寄存器。DST:其寻址方式是隐含的,必须是累加器AL或AX。 MUL AX MUL BYTE PTR[BX]MUL 2000H MUL DS136 乘法指令乘法指令对标志的影响? 乘法指令执行后,只对CF和OF有意义,其它位均不确定:MUL指令――若乘积结果的高16位(字运算)或高8位(字节运算) 均为0,则OF=CF=0;否则OF=CF=1。 IMUL指令――若乘积结果的高16位或高8位是低16位或低8位的符号 扩展时,则OF=CF=0;否则OF=CF=1 。? ?乘法指令对其他状态标志没有定义:指令执行后这些标志是任意的、不可预测对标志没有影响是指令的执行不改变标志的状态。 137 乘法指令乘法指令(MUL/IMUL)对标志位CF和OF的影响MOV AL, 0B4H ;(AL)=04H=4 MOV AL, 04H ;(AL)=B4H=180 MOV AL, 0B4H ;(AL)=B4H=-76 MOV BL, 11H ;(BL)=11H=17 MOV BL, 02H ;(BL)=02H=2 MOV BL, 11H ;(BL)=11H=17 MUL BL MUL BL IMUL BL ;(AX)=0BF4H=3060 ;(AX)=0008H=8 ;(AX)=FAF4H=-1292,AX高8位不为0(字节运算) AX高8位为0(字节运算) AX高8位含有效数字 所以,OF=CF=1 所以,OF=CF=0 所以,OF=CF=1138 乘法指令举例:说明MUL/IMUL执行后的不同结果 DAT1 MOV DW 8004H AX, 05H DAT1内存单元MUL DAT105H MOV AX, MOV AX, 05H 05*8004H?(DX:AX)DAT1 MUL BYTE 05H MOV AX, PTR IMUL BYTE PTR DAT1 (DX)=0002H (AL)*04H=05*04H?(AX) IMUL WORD PTR DAT1 (AL)*04H=05*04H?(AX) (AX)=8014H (AX)=4H?(DX:AX) AX (AX)=0014H (DX)=0FFFDH (AX)=8014H 对于MUL指令……. 04H 80H ……0005H对于MUL指令 因为(DX)=0002H 对于IMUL指令 因为(AH)=00H 对于IMUL指令 因为(AH)=00H,(AL)=14H,最高位为0 所以,CF=1,OF=1 因为(DX)=0FFFDH,(AX)=8014H,最高位为1 所以,CF=0,OF=0 139 所以,CF=0,OF=0 所以,CF=1,OF=1 除法指令DIV SRC ;无符号字节除法: ;(AL)←(AX)/(SRC)的商,(AH)← (AX)/(SRC)的余数 DIV SRC ;无符号字除法: ; (AX) ←(DX:AX)/(SRC)的商 ; (DX)← (DX:AX)/(SRC)的余数 IDIV SRC ;有符号字节除法: ;(AL)← (AX)/(SRC)的商,(AH)← (AX)/(SRC)的余数 IDIV SRC ;有符号字除法: ;(AX)← (DX:AX)/(SRC)的商 ;(DX)← (DX:AX)/(SRC)的余数 140 除法指令DIV/IDIV SRCSRC:其寻址方式显式的,可以是除了立即数以外的其他各 种寻址方式,但不能是段寄存器。DST:其寻址方式是隐含的,必须是累加器AX或DX:AX。 DIV AXDIV 2000H除法指令执行后,标志位均无意义。 IDIV BYTE PTR[BX] IDIV DS 除法指令不允许出现除数为0和商溢出的情况,如发生结果无意义,并引起中断 141 除法指令除法错中断? 当被除数远大于除数时,所得的商就有可能超出它所能表达的 范围。如果存放商的寄存器AL/AX不能表达,便产生溢出, 8086CPU中就产生编号为0的内部中断――除法错中断。 ? 对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,则发生除法溢出。? 对IDIV指令,除数为0,或在字节除时商不在-128~127范围内, 或在字除时商不在-3范围内,则发生除法溢出。142 除法指令例18:无符号和有符号数的除法运算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=36143 符号扩展指令MOV BX , 0005H MOV AL, 22H ADD BX, AL ;使两个数相加MOV BX , 0005H MOV AL, 22H CBW ;(AH)=00H,(AX)=0022H ADD BX, AX ; 两个数匹配144 符号扩展指令格式:CBW 功能:AL的符号扩展至AH,字节扩展成字格式:CWD 功能:AX的符号扩展至DX,字扩展成双字145 符号扩展指令CBW CWD无符号数(AH)=00H(DX)=0000H有符号数1.正数: (AH)=00H 2.负数: (AH)=11H1.正数: (DX)=0000H 2.负数: (DX)=1111H注:如果没有注明的话,一般是有符号数的扩展 146 符号扩展指令例19:符号扩展MOV AL,80H CBW MOV AL,7FH CBW MOV AX,8000H CWD MOV AX,7F00H CWD;(AL)=80H = B ;(AH)=FFH, (AX)=FF80H ;(AL)= 7FH = B ; (AH)=00H, (AX)= 007FH ;(AX)=8000H ;(DX)=FFFFH, (AX)=8000H ;(AX)= 7F00H ; (DX)=0000H, (AX)= 7F00H147 十进制调整指令十进制数调整指令对二进制运算的结果进行十 进制调整,以得到十进制的运算结果。 分为组合BCD码和分离BCD码调整。组合BCD码就是通常的 8421码,它用4个二进制位表 示一个十进制位,一个字节可 以表示两个十进制位,即00 ~ 99。 分离BCD码用8个二进制 位表示一个十进制位,只用低 4个二进制位表示一个十进制 位0 ~ 9,高4位任意,通常默 认为0。148 十进制调整指令组合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标志无定义,按结果影响其他标 志,例如CF反映组合BCD码相加或减的进位或借位状态 149 十进制调整指令例21:组合BCD码的加减运算MOV AL,68H MOV BL,28H ADD AL,BL DAA ;AL=68H,组合BCD码表示真值68 ;BL=28H,组合BCD码表示真值28 ;二进制加法:AL=68H+28H=90H ;十进制调整:AL=96H ;实现组合BCD码加法:68+28=96 ;AL=68H,组合BCD码表示真值68 ;BL=28H,组合BCD码表示真值28 ;二进制减法:AL=68H-28H=40H ;十进制调整:AL=40H ;实现组合BCD码减法:68-28=40150MOV AL,68H MOV BL,28H SUB AL,BL DAS 十进制调整指令分离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;对其他
151 标志无定义。 十进制调整指令例22:分离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-09=59 152 十进制调整指令分离BCD码乘、除调整指令(MUL r8/m8) AAM ;AX←将AX的乘积调 整为分离BCD码 AAD ;AX←将AX中分离 BCD码扩展成二进制数 (DIV r8/m8)? AAM指令跟在字节乘MUL之后,将乘积调整为分离 BCD码 ? AAD指令跟在字节除DIV之前,先将分离BCD码的被 除数调整为二进制数 ? AAM和AAD指令根据结果设置SF、ZF和PF,但对OF、 CF和AF无定义 153 十进制调整指令例23:分离BCD码的乘除运算MOV AX,0608H ;AX=0608H,分离BCD码表示真值68 MOV BL,09H ;BL=09H,分离BCD码表示真值9 MUL BL ;二进制乘法:AL=08H×09H=0048H AAM ;十进制调整:AX=0702H ;实现分离BCD码乘法:8×9=72MOV AX,0608H ;AX=0608H,分离BCD码表示真值68 MOV BL,09H ;BL=09H,分离BCD码表示真值9 AAD ;二进制扩展:AX=68=0044H DIV BL ;除法运算:商AL=07H,余数AH=05H ;实现分离BCD码除法:68÷9=7(余5)
154 3.2.3 逻辑运算类指令逻辑运算类指令有以下:与 或 异或 非 测试 AND OR XOR NOT TEST注意这些指令对标志寄存器的影响。 155 3.2.3 逻辑运算类指令逻辑运算类指令都是按位进行的,位与位之间没 有联系。对标志寄存器的影响: 1. NOT指令对标志寄存器不产生任何影响 2. AND、OR、XOR、TEST指令: 1) 使CF、OF为0; 2) 并正常影响SF、ZF和PF位的值; 3) 对AF没有影响。 156 逻辑与指令AND格式:AND DST, SRC 功能:DST和SRC按位与运算,结果送给DST。 DST DST按位ANDSRC1) 使CF=OF=0; 2) 并正常影响SF、ZF和PF位的值; 3) 对AF没有影响。 157 逻辑或指令AND格式:AND DST, SRC 功能:DST和SRC按位与运算,结果送给DST。与运算法则: 0 ∧ 0 = 0 ;0 ∧ 1 = 0 ; 1 ∧ 0 = 0 ;1 ∧ 1 = 10 ∧ * = 0 ;1 ∧ * = * 158 逻辑与指令AND? ? SRC:立即数、通用寄存器和内存单元 DST:通用寄存器、内存单元,但不能是立即数。AND reg,imm/reg/mem AND mem,imm/reg 合法指令: AND AL,BL AND AL,[DI] AND [SI], CX AND AX, 06H;reg←reg∧imm/reg/mem ;mem←mem∧imm/reg 非法指令: AND AL,BX AND [3000H], [200H] AND 20, BX159 逻辑与指令AND举例: MOV AL, 0F0H MOV BL, 55H AND AL, BL;(AL)=0F0H ;(BL)=55H ;(AL)?(AL) ∧(BL)0F0H 55H 50HSF= 0 AF= 不影响 CF= 0160 ∧ 01 0000OF= 0 ZF= 0PF= 1 逻辑与指令ANDAND指令的用途: AND主要用来屏蔽操作数的某些位,操作时将SRC置为 立即数,需要屏蔽的位设置为0。 如:现在要对(AL)中的第0、2、4、6位置零。 如:现在要对(BL)中的高4位置零。 AND AL, B AND BL, B **** **** (AL) **** **** (BL) ∧
AAH ∧ FH *0*0 *0*0 0000 **** (AL)=*0*0 *0*0B
(BL)=0000 ****BOF= 0 OF= 0 ZF= 0/1 ZF= 0/1 PF= 0/1 PF= 0/1 SF= * SF= 0 AF= 不影响 AF= 不影响 CF= 0 CF= 0161 逻辑与指令ANDAND指令和AND逻辑操作符的区别。 AND AL , 0FH MOV AL, 65H AND 0FH ;(AL)=(AL) ∧0FH ;(AL)=05H1. AND AL , 0FH:指令是在汇编后执行的程序指令,它 让CPU产生一定的动作; 2. 65H AND 0FH:逻辑操作符AND是在汇编的过程中, 就得到了其值05H,即在汇编的时候,得到的是 MOV AL, 05H 3. AND是指令,而逻辑操作符AND是伪指令。 162 逻辑或指令OR格式:OR DST, SRC 功能:DST和SRC按位或运算,结果送给DST。 DST DST按位ORSRC1) 使CF=OF=0; 2) 并正常影响SF、ZF和PF位的值; 3) 对AF没有影响。 163 逻辑或指令OR格式:OR DST, SRC 功能:DST和SRC按位或运算,结果送给DST。或运算法则: 0 ∨ 0 = 0 ;0 ∨ 1 = 1 ; 1 ∨ 0 = 1 ;1 ∨ 1 = 10 ∨ * = * ;1 ∨ * = 1 164 逻辑或指令OR? ? SRC:立即数、通用寄存器和内存单元 DST:通用寄存器、内存单元,但不能是立即数。OR reg,imm/reg/mem OR mem,imm/reg 合法指令: OR AL, BL OR AL, [DI] OR [SI], CX OR AX, 06H;reg←reg ∨ imm/reg/mem ;mem←mem ∨ imm/reg 非法指令: OR AL,BX OR [3000H], [200H] OR 20, BX165 逻辑或指令OR举例: MOV AL, 0F0H MOV BL, 55H OR AL, BL;(AL)=0F0H ;(BL)=55H ;(AL) ? (AL) ∨ (BL) ∨ 11 01010F0H 55H F5HOF= 0 ZF= 0 PF= 1SF= 1 AF= 不影响 CF= 0(AL)=B 166 逻辑或指令OROR指令的用途: OR主要用来对某些位置1,操作时将SRC置为立即数, 需要置1的位设置为1。 如:现在要对(AL)中的第0、2、4、6位置1。 OR AL, B **** **** ∨
(AL) 55HOF= 0SF= *ZF= 0AF= 不影响 CF= 0167*1*1 *1*1PF= 0/1(AL)=*1*1 *1*1B 逻辑或指令OROR指令的用途: OR主要用来对某些位置1,操作时将SRC置为立即数, 需要置1的位设置为1。 如:现在要对(BL)中的高3位置1。 OR BL, B **** **** ∨ 1* **** (BL)=111* ****B (BL) 0E0HOF= 0 ZF= 0 PF= 0/1SF= 1 AF= 不影响 CF= 0168 逻辑或指令OROR指令和OR逻辑操作符的区别。 OR AL , 0FH ;(AL)=(AL) ∨ 0FH MOV AL, 65H OR 0FH ;(AL)=6FH 1. OR AL , 0FH:指令是在汇编后执行的程序指令,它让 CPU产生一定的动作; 2. 65H OR 0FH:逻辑操作符OR是在汇编的过程中,就 得到了其值6FH,即在汇编的时候,得到的是 MOV AL, 6FH 3. OR是指令,而逻辑操作符OR是伪指令。 169 逻辑异或指令XOR格式:XOR DST, SRC 功能:DST和SRC按位异或运算,结果送给DST。 DST DST按位XORSRC1) 使CF=OF=0; 2) 并正常影响SF、ZF和PF位的值; 3) 对AF没有影响。 170 逻辑异或指令XOR格式:XOR DST, SRC 功能:DST和SRC按位异或运算,结果送给DST。异或运算法则: 0
1 = 0;0 *=* ; 1*= *171 逻辑异或指令XOR? ? SRC:立即数、通用寄存器和内存单元 DST:通用寄存器、内存单元,但不能是立即数。XOR reg,imm/reg/mem XOR mem,imm/reg 合法指令: XOR AL, BL XOR AL, [DI] XOR [SI], CX XOR AX, 06H;reg←reg
imm/reg/mem ;mem←mem
imm/reg 非法指令: XOR AL,BX XOR [3000H], [200H] XOR 20, BX172 逻辑异或指令XOR举例: MOV AL, 0F0H MOV BL, 55H XOR AL, BL;(AL)=0F0H ;(BL)=55H ;(AL) ? (AL)
(BL)OF= 0 ZF= 0 PF= 1 SF= 1 AF= 不影响 CF= 0
10 01010F0H 55H A5H(AL)=B 173 逻辑异或指令XORXOR指令的用途: XOR主要用来对某些位置取反,或者用于清零。 如:现在要对(AL)中的低4位置取反。 MOV AL, 0FFH XOR AL, B
FFH 0FHOF= 0 SF= 1ZF= 0AF= 不影响 CF= 0174PF= 1(AL)=B 逻辑异或指令XORXOR指令的用途: XOR主要用来对某些位置取反,或者用于清零。 如:现在要对BL内容清零。 XOR BL, BL **** ****
(BL) (BL)OF= 0 ZF= 1 PF= 1SF= 0 AF= 不影响 CF= 0175(BL)=B 逻辑异或指令XORXOR指令和XOR逻辑操作符的区别。 XOR AL , 0FH MOV AL, 0FFH XOR 0FH ;(AL)=(AL)
0FH ;(AL)=0F0H1. XOR AL , 0FH:指令是在汇编后执行的程序指令,它 让CPU产生一定的动作; 2. 65H XOR 0FH:逻辑操作符XOR是在汇编的过程中, 就得到了其值6AH,即在汇编的时候,得到的是 MOV AL, 6AH 3. XOR是指令,而逻辑操作符XOR是伪指令。 176 逻辑非指令NOT格式: NOT DST 功能: DST逻辑非运算,结果送给DST 。按位NOTDSTDST注:对标志寄存器没有任何的影响。 177 逻辑非指令NOT格式: NOT DST 功能: DST逻辑非运算,结果送给DST 。逻辑非运算法则: 0 = 11 = 0 178 逻辑非指令NOTDST:通用寄存器、内存单元,但不能是立即数合法指令: NOT AL NOT BYTE PTR [DI]非法指令: NOT [3000H] NOT 20 NOT DS NOT IP179 逻辑非指令NOT举例: MOV AL, 0F0H XOR AL;(AL)=0F0H ;(AL) ? (AL) B = B(AL)=B180 逻辑非指令NOTNOT指令和NOT逻辑操作符的区别。 NOT AL MOV AL, ;(AL)=(AL) ;(AL)=0FHNOT B1. NOT AL :指令是在汇编后执行的程序指令,它让CPU 产生一定的动作; 2. NOT B :逻辑操作符NOT是在汇编的过程中, 就得到了其值0FH,即在汇编的时候,得到的是 MOV AL, 0FH 3. NOT是指令,而逻辑操作符NOT是伪指令。 181 逻辑类指令总结1. 都是按位运算 2. 除了NOT指令,其它逻辑运算类对标志寄存器有影响 3. 用途: 1. AND用于对某些位清零 2. OR用于对某些位置1 3. XOR用于对某些位取反或整体清零 4. NOT用于整体取反182 测试指令TEST格式:TEST DST, SRC 功能:DST和SRC按位与运算,结果不返回DST。 DST按位ANDSRC对标志寄存器的影响与AND指令一样1) 使CF=OF=0; 2) 并正常影响SF、ZF和PF位的值; 3) 对AF没有影响。 183 测试指令TEST格式:TEST DST, SRC 功能:DST和SRC按位与运算,结果不返回DST。TEST指令:与运算法则 0 ∧ 0 = 0 ;0 ∧ 1 = 0 ;1 ∧ 0 = 0 ;1 ∧ 1 = 1 184 测试指令TEST? ? SRC:立即数、通用寄存器和内存单元 DST:通用寄存器、内存单元,但不能是立即数。TEST reg,imm/reg/mem TEST mem,imm/reg 合法指令: TEST AL,BL TEST AL,[DI] TEST[SI], CX TEST AX, 06H;reg←reg∧imm/reg/mem ;mem←mem∧imm/reg 非法指令: TEST AL,BX TEST[3000H], [200H] TEST 20, BX185 测试指令TEST举例: MOV AL, 0F0H MOV BL, 55H TEST AL, BL;(AL)=0F0H ;(BL)=55H ;(AL) ∧(BL), (AL)=0F0H, (BL)=55H0F0H 55H 50HSF= 0 AF= 不影响 CF= 0186 ∧ 01 0000OF= 0 ZF= 0PF= 1 测试指令TESTTEST指令的用途:TEST指令用来测试某位是“0”还是“1”。例如:判断AL寄存器中第3位的值。 MOV AL, H ;(AL)=B TEST AL, B ∧ 00 *000通过判断ZF的值,就知道*的值。1.如果ZF=1,即结果为B,则*为0, 2. 如果ZF=0,即结果为B,则*为1187 测试指令TESTTEST指令的用途: TEST指令用来测试某位是“0”还是“1”。? ? ? ? ?TEST AL,01H ;测试AL的最低位D0 JNZ THERE ;标志ZF=0,即D0=1 ;则程序转移到THERE ... ;否则ZF=1,即D0=0,顺序执行 THERE: ...188 3.2.4 移位指令和循环移位指令移位指令将操作数移动一位或多位,分成逻辑移 位和算术移位,分别具有左移或右移操作。 SHR DST, CNT ;逻辑右移 SHL DST, CNT ;逻辑左移 SAR DST, CNT ;算术右移 SAL DST, CNT ;算术左移 ROR DST, CNT ;循环右移 ROL DST, CNT ;循环左移 RCR DST, CNT ;带进位循环右移 RCL DST, CNT ;带进位循环左移 189 3.2.4 逻辑右移指令SHR格式: SHR DST, CNT ;逻辑右移 功能:每向右移一位,最低位进入CF位,最高位 补0 ,右移的次数由CNT决定。 DST 0 CF0DST * * * * * * * * * * *右移一次的效果图CF190 3.2.4 逻辑右移指令SHR格式: SHR DST, CNT ;逻辑右移 功能:每向右移一位,最低位进入CF位,最高 位补0 ,右移的次数由CNT决定。 DST:通用寄存器或者内存单元,不能是立即 数,不能是段寄存器。 CNT: 当CNT为立即数时,其值只能为1;当移位 次数超过1时,CNT应为寄存器CL,CL中 的内容为移位次数。 191 3.2.4 逻辑右移指令SHR格式: SHR DST, CNT ;逻辑右移 功能:每向右移一位,最低位进入CF位,最高位 补0 ,右移的次数由CNT决定。 举例: SHR AL, 1 MOV CL, 3 SHR AL, CL192 3.2.4 逻辑右移指令SHR格式: SHR DST, CNT ;逻辑右移 功能:每向右移一位,最低位进入CF位,最高位补0 ,右移的次数 由CNT决定。举例: MOV AL, 0FH ;(AL)=B SHR AL, 1 0 DST 0 0 0 0 1 1 11 (AL)=07H CF=1 193CF 3.2.4 逻辑右移指令SHR举例:MOV AL, 0FH ;(AL)=B MOV CL, 3 SHR AL, CLDSTCF0 00 0 0 0 1 1 11DSTCF第一次, (AL)=07H CF=1 第二次, (AL)=03H CF=1 第三次, (AL)=01H CF=11940 0 0 0 0 1 11DST CF00 0 0 0 0 0 11 训练 3.2.4逻辑/算术左移指令SHL/SAL格式: SHL/SAL DST, CNT ;逻辑/算术左移 功能:每向左移一位,最高位进入CF位,最低 位补0 ,左移的次数由CNT决定。 CF DST 0 CFDST * * * * * * * * * * *左移一次效果图0195 3.2.4逻辑/算术左移指令SHL/SAL格式: SHL/SAL DST, CNT ;逻辑/算术左移 功能:每向左移一位,最高位进入CF位,最低 位补0 ,左移的次数由CNT决定。 DST:通用寄存器或者内存单元,不能是立即 数,不能是段寄存器。 CNT: 当CNT为立即数时,其值只能为1;当移位 次数超过1时,CNT应为寄存器CL,CL中 的内容为移位次数。 196 3.2.4 逻辑/算术左移指令SHL/SAL格式: SHL/SAL DST, CNT ;逻辑/算术左移 功能:每向左移一位,最高位进入CF位,最低 位补0 ,左移的次数由CNT决定。 举例: SHL/SAL AL, 1 MOV CL, 3 SHL/SAL AL, CL197 3.2.4 逻辑/算术左移指令SHL/SAL格式:SHL/SAL DST, CNT ;逻辑/算术左移 功能:每向左移一位,最高位进入CF位,最低位补0 ,左移的次 数由CNT决定。举例: MOV AL, 0FH ;(AL)=B SHL/SAL AL, 1 CF DST 0 0 0 0 1 1 1 10(AL)=1EHCF=0198 3.2.4 逻辑/算术左移指令SHL/SAL举例:MOV AL, 6FH ;(AL)=B MOV CL, 3 SHL/SAL AL, CL CFDST0 1 1 0 1 1 1 1CF0 0第一次, (AL)=DEH CF=0 第二次, (AL)=BCH CF=1 第三次, (AL)=78H CF=1199DST1 1 0 1 1 1 1 0CFDST1 0 1 1 1 1 0 00 3.2.4算术右移指令SAR格式: SAR DST, CNT ;算术右移 功能:每向右移一位,最低位进入CF位,最高 位补符号位,右移的次数由CNT决定。 DST CFDST * * * * * * * * * * *CF注:执行算术移位指令时,把操作数当做有符号数; 执行逻辑移位指令时,把操作数当做无符号数。 200 通常左移一位,相对于乘以2;右移一位,相当于除以2 3.2.4算术右移指令SAR格式: SAR DST, CNT ;算术右移 功能:每向右移一位,最低位进入CF位,最高 位补符号位,右移的次数由CNT决定。 DST:通用寄存器或者内存单元,不能是立即 数,不能是段寄存器。 CNT: 当CNT为立即数时,其值只能为1;当移位 次数超过1时,CNT应为寄存器CL,CL中 的内容为移位次数。 201 3.2.4算术右移指令SAR格式: SAR DST, CNT ;算术右移 功能:每向右移一位,最低位进入CF位,最高 位补符号位,右移的次数由CNT决定。 举例: SAR AL, 1 MOV CL, 3 SAR AL, CL202 3.2.4算术右移指令SAR格式:SAR DST, CNT ;算术右移 功能:每向右移一位,最低位进入CF位,最高位补符号位,右移 的次数由CNT决定。举例: MOV AL, 8FH ;(AL)=B SAR AL, 1 DST 1 0 0 0 1 1 11 (AL)=C7H CF=1 203CF 3.2.4算术右移指令SAR举例:MOV AL, 0CCH MOV CL, 3 SAR AL, CL ;(AL)=BDSTCF1 1 0 0 1 1 00DST第一次, (AL)=0E6H CF=0 第二次, (AL)=0F3H CF=0 第三次, (AL)=0F9H CF=1CF1 1 1 0 0 1 10DSTCF1 1 1 1 0 0 11训练204 3.2.4 移位指令总结1. 执行算术移位指令时,把操作数当做有符号数; 执行逻辑移位指令时,把操作数当做无符号数。 通常左移一位,相对于乘以2;右移一位,相当于除以2. 23. 对标志寄存器的影响 1. 对AF不影响,并影响其余其它各位标志位。 2. 对于移位指令,只有当CNT=1时,OF才有意义。1. 当操作数的最高位在移位前后不发生变化,OF=0 2. 当操作数的最高位在移位前后发生变化,OF=1205 3.2.4 移位指令总结对标志寄存器的影响 1. 对AF不影响,并影响其余其它各位标志位。 2. 对于移位指令,只有当CNT=1时,OF才有意义。1. 当操作数的最高位在移位前后不发生变化,OF=0 2. 当操作数的最高位在移位前后发生变化,OF=1举例: MOV AL, 0FH ;(AL)=B SAL AL, 1CFDST 0 0 0 0 1 1 1 10(AL)=1EH206CF= 0, OF= 0 , PF= 1 ,ZF=0 ,SF= 0 3.2.4 移位指令总结对标志寄存器的影响 1. 对AF不影响,并影响其余其它各位标志位。 2. 对于移位指令,只有当CNT=1时,OF才有意义。 1. 当操作数的最高位在移位前后不发生变化,OF=0 2. 当操作数的最高位在移位前后发生变化,OF=1举例:MOV AL, 4FH MOV CL , 3 1 SAL AL, SAL AL, CL ;(AL)=BCFDST 0 1 0 0 1 1 1 10(AL)=9EH207CF= 0, OF= 1 , PF= 0 ,ZF=0 ,SF= 1 3.2.4 循环右移指令ROR格式: ROR DST, CNT ;循环右移 功能:DST为循环体,循环右移 ,次数由CNT 决定。 DST CFDST * * * * * * * * * * *循环右移一次CF208 3.2.4 循环右移指令ROR格式: ROR DST, CNT ;循环右移 功能:DST为循环体,循环右移 ,次数由CNT决定。DST:通用寄存器或者内存单元,不能是立即 数,不能是段寄存器。 CNT: 当CNT为立即数时,其值只能为1;当移位 次数超过1时,CNT应为寄存器CL,CL中 的内容为移位次数。209 3.2.4 循环右移指令ROR格式: ROR DST, CNT ;循环右移 功能:DST循环右移 ,次数由CNT决定。举例: ROR AL, 1 MOV CL, 3 ROR AL, CL210 3.2.4 循环右移指令ROR格式: ROR DST, CNT ;循环右移 功能:DST循环右移 ,次数由CNT决定。 举例: MOV AL, 0FH ;(AL)=B ROR AL, 1 DST 0 0 0 0 1 1 1 1 CF(AL)=B, CF=1 211 3.2.4 循环右移指令ROR举例:MOV AL, 0FH ;(AL)=B MOV CL, 3 ROR AL, CLDSTCF0 0 0 0 1 1 11DSTCF第一次, (AL)=87H CF=1 第二次, (AL)=0C3H CF=1 第三次, (AL)=0E1H CF=11 0 0 0 0 1 11DSTCF1 1 0 0 0 0 11训练212 3.2.4 循环左移指令ROL格式: ROL DST, CNT ;循环左移 功能: DST为循环体,循环左移 ,次数由CNT决定。CFDSTCFDST * * * * * * * * * * *213 3.2.4 循环左移指令ROL格式: ROL DST, CNT ;循环左移 功能: DST为循环体,循环左移 ,次数由CNT决定。DST:通用寄存器或者内存单元,不能是立即 数,不能是段寄存器。 CNT: 当CNT为立即数时,其值只能为1;当移位 次数超过1时,CNT应为寄存器CL,CL中 的内容为移位次数。214 3.2.4 循环左移指令ROL格式: ROL DST, CNT ;循环左移 功能: DST为循环体,循环左移 ,次数由CNT 决定。 举例: ROLAL, 1MOV CL, 3 ROL AL, CL215 3.2.4 循环左移指令ROL格式: ROL DST, CNT ;循环左移 功能:DST为循环体,循环左移 ,次数由CNT决定。举例: MOV AL, 0FH ;(AL)=B ROL AL, 1 CF DST 1 0 0 0 0 1 1 1(AL)=B, CF=1 216 3.2.4 循环左移指令ROL举例:MOV AL, 0FH ;(AL)=B MOV CL, 3 ROL AL, CL CFDST0 0 0 0 1 1 1 1CF第一次, (AL)=1EH CF=0 第二次, (AL)=3CH CF=0 第三次, (AL)=78H CF=0217DST0 0 0 1 1 1 1 0CFDST0 0 1 1 1 1 0 0 3.2.4 带进位的循环右移指令 RCR格式:RCR DST, CNT ;循环右移 功能:DST加上CF为循环体,一起循环右移 ,次数由 CNT决定。DSTCFDST * * * * * * * * * * * DST和CF是循环体CF *218 3.2.4 带进位的循环右移指令 RCR格式:RCR DST, CNT ;循环右移 功能:DST加上CF为循环体,一起循环右移 ,次数由 CNT决定。DST:通用寄存器或者内存单元,不能是立即 数,不能是段寄存器。 CNT: 当CNT为立即数时,其值只能为1;当移位 次数超过1时,CNT应为寄存器CL,CL中 的内容为移位次数。219 3.2.4 带进位的循环右移指令 RCR格式:RCR DST, CNT ;循环右移 功能:DST加上CF为循环体,一起循环右移 ,次数由 CNT决定。举例: RCR AL, 1 MOV CL, 3 RCR AL, CL220 3.2.4 带进位的循环右移指令 RCR格式:RCR DST, CNT ;循环右移 功能:DST加上CF为循环体,一起循环右移 ,次数由 CNT决定。举例: MOV AL, 0FH ;(AL)=B,CF=1 RCR AL, 1 DST 0 0 0 0 1 1 1 1 CF 1(AL)=B, CF=1 221 3.2.4 带进位的循环右移指令 RCR举例:MOV AL, 0FH ;(AL)=B , CF=0 MOV CL, 3 RcR AL, CLDSTCF0 0 0 0 1 1 11DST0CF第一次, (AL)=07H CF=10 0 0 0 0 1 11DST1CF第二次, (AL)=83H CF=1 第三次, (AL)=0C1H CF=12221 0 0 0 0 0 111 3.2.4 带进位的循环左移指令 RCL格式:RCL DST, CNT ;循环左移 功能:DST加上CF为循环体,一起循环左移 ,次数 由CNT决定。CFDSTCF *DST * * * * * * * * * * *DST和CF是循环体223 3.2.4 带进位的循环左移指令 RCL格式:RCL DST, CNT ;循环左移 功能:DST加上CF为循环体,一起循环左移 ,次数由 CNT决定。DST:通用寄存器或者内存单元,不能是立即 数,不能是段寄存器。 CNT: 当CNT为立即数时,其值只能为1;当移位 次数超过1时,CNT应为寄存器CL,CL中 的内容为移位次数。224 3.2.4 带进位的循环左移指令 RCL格式:RCL DST, CNT ;循环左移 功能:DST加上CF为循环体,一起循环左移 ,次数由 CNT决定。举例: RCR AL, 1 MOV CL, 3 RCR AL, CL225 3.2.4 带进位的循环左移指令 RCL格式:RCL DST, CNT ;循环左移 功能:DST加上CF为循环体,一起循环左移 ,次数由 CNT决定。举例: MOV AL, 0FH ;(AL)=B,CF=1 RCL AL, 1 CF 1 DST 0 0 0 0 1 1 1 1(AL)=B, CF=0 226 3.2.4 带进位的循环左移指令 RCL举例:MOV AL, 0FH ;(AL)=B , CF=0 MOV CL, 3 ROR AL, CL CFDST0CF0 0 0 0 1 1 1 1DST第一次, (AL)=1EH CF=00CF0 0 0 1 1 1 1 0DST第一次, (AL)=3CH CF=0 第一次, (AL)=78H CF=022700 0 1 1 1 1 0 0 3.2.4 循环移位指令总结循环移位指令对标志寄存器的影响 1. 只对CF和OF有影响。 2. 对于循环移位指令,只有当CNT=1时,OF才有意义。1. 当操作数的最高位在移位前后不发生变化,OF=0 2. 当操作数的最高位在移位前后发生变化,OF=1举例: MOV AL, 0FH RCL AL, 1 ;(AL)=B,CF=1CF 1DST 0 0 0 0 1 1 1 1(AL)=1FH228CF= 0, OF= 0 , PF= 0 ,ZF=0 ,SF= 0 3.2.5 处理机控制类指令? 对标志位进行设置的指令 C CLC STC CMC C CLD STD C CLI STI 对CPU状态进行控制的指令 C NOP CS: SS: DS: ES: C LOCK HLT ESC WAIT 重点掌握: CLC STC CMC CLD STD CS: SS: DS: ES: NOP CLI STI LOCK HLT ESC WAIT 229?特别熟悉:
一般了解: 进位标志操作指令用于任意设置进位标志。 CLC STC CMC ;复位进位标志:CF←0 ;置位进位标志:CF←1 ;求反进位标志:CF←~CF230 方向标志和中断标志操作指令CLD ;复位方向标志:DF←0 STD ;置位方向标志:DF←1 串操作指令中,需要使用。CLI ;复位中断标志:IF←0 STI ;置位中断标志:IF←1 在编写中断服务程序时,需要控制可屏蔽中断 的允许和禁止。 231 空操作指令NOP该指令不执行任何操作,但占用一个字节存储 单元,空耗一个指令执行周期。 该指令常用于程序调试。例如:在需要预留指令空间时用NOP填充,代 码空间多余时也可以用NOP填充,还可以用NOP实 现软件延时。 NOP和XCHG AL,AL的指令代码一样。 232 暂停指令? HLT ;进入暂停状态 暂停指令使CPU进入暂停状态,这时CPU不进 行任何操作。当CPU发生复位或来自外部的中断时, CPU脱离暂停状态。 HLT指令可用于程序中等待中断。当程序中必 须等待中断时,可用HLT,而不必用软件死循环。 然后,中断使CPU脱离暂停状态,返回执行HLT的 下一条指令。233 等待指令? WAIT ;进入等待状态8086就是利用WAIT指令和测试引脚实现与 8087同步运行的。 浮点指令经由8086CPU处理发往8087,并与 8086本身的整数指令在同一个指令序列;而8087执 行浮点指令较慢,所以8086必须与8087保持同步。234 封锁前缀指令? LOCK ;封锁总线 这是一个指令前缀,可放在任何指令前。 这个前缀使得在这个指令执行时间内,8086 处 理器的封锁输出引脚有效,即把总线封锁,使别的 控制器不能控制总线;直到该指令执行完后,总线 封锁解除。235 交权指令? ESC 6位立即数 reg/mem ;把浮点指令交给浮点处理器执行提高系统浮点运算能力的协处理器8087指令是与8086的整 数指令组合在一起的,8086主存中存储8087的操作码及其所需 的操作数。当8086发现是一条浮点指令时,就利用ESC指令将 浮点指令交给8087执行。实际编写程序时,一般采用易于理解 的浮点指令助记符格式。 ESC 6,[SI] ;实数除法指令:FDIV dword ptr [SI]ESC 20H,AL ;整数加法指令:FADD ST(0),ST 236 训练 变量H 22H 31H 55H 44H 56H 34H 12H 00H 32HDATA1 DB 22H,31HDATA2 DW 4455HH 3 4 5 6 7 8DATA3 DD 123456HDATA5 DB ‘234’ DATA6 DW ‘AB’ DATA7 DB 2 DUP (?)9A B C33H34H 42H 41HD??237E ADD指令训练溢出和进位对比 例1:3AH + 7CH=B6H+3AHCH
B6H无符号数运算:58+124= 182,范围内0~255,无进 位 CF=0 有符号数运算: 58+124=182 ,范围外-128~127,有溢出 OF=1238 ADD 指令训练溢出和进位对比 例2:AAH + 7CH=(1)26H AAH+ CH1 无符号数运算:170+124 =294,范围外0~255 ,有 进位 CF=1 26H有符号数运算:-86+124 =28 ,范围内-128~127,无溢出OF=0239 ADC指令训练无符号双字加法运算例如:1.把0FFFEH送入AX中 --------MOV AX, 0FFFEH2. 把0002H送入BX中 --------MOV BX, 0002H 3. 使AX和BX相加-------ADD AX, BX4. 使AX内容加05H,并 -------ADC AX, 05H 带进位240 ADC指令训练FFFEH+0002H11 1110H+CF00 000000 0101 + 1 00 0110+ 00 00101 00 0000CFOF= 0 ZF= PF= 1 1 SF= 0OF= 0 ZF= PF= 0 1SF=0AF= 1 CF= 1AF= 0 CF= 0241 SUB指令训练例3:03H-04H= (1)FFH H-1 04HFFHOF= 0 ZF= 0SF= 1 AF= 1PF= 1CF= 1242 符号扩展指令训练1.将2245H送入BX中。 2.将11H送入AL中。 3.对AL的内容进行符号扩展MOV BX, 2245H MOV AL, 11H CBW4.使AX和BX内容相加,结果返回BX ADD BX, AX 5.对AX内容进行扩展 6.使(DX:AX)/(BX)CWDIDIV BX243 逻辑右移指令SHR 训练 举例:MOV AL, 33H ;(AL)=B MOV CL, 3 SHR AL, CLDSTCF0 00 0 1 1 0 0 11DSTCF第一次, (AL)=19H CF=1 第二次, (AL)=0CH CF=1 第三次, (AL)=06H CF=02440 0 0 1 1 0 01DST CF00 0 0 0 1 1 00 逻辑/算术左移指令SHL/SAL 训练 举例:MOV AL, 33H ;(AL)=B MOV CL, 3 SHL/SAL AL, CL CFDST0 0 1 1 0 0 1 1CF0 0第一次, (AL)=66H CF=0 第二次, (AL)=BBH CF=0 第三次, (AL)=98H CF=1245DST0 1 1 0 0 1 1 0CFDST1 1 0 0 1 1 0 00 3.2.4算术右移指令SAR举例:MOV AL, 99H ;(AL)=B MOV CL, 3 SAR AL, CLDSTCF1 0 0 1 1 0 01DST第一次, (AL)=0CCH CF=1 第二次, (AL)=0E6H CF=0 第三次, (AL)=0F3H CF=0CF1 1 0 0 1 1 00DSTCF1 1 1 0 0 1 10训练246 3.2.4 循环右移指令ROR举例:MOV AL, 0FH ;(AL)=B MOV CL, 3 ROR AL, CLDSTCF0 0 1 1 0 0 11DSTCF第一次, (AL)=99H , CF=1 第二次, (AL)=0CCH ,CF=1 第三次, (AL)=66H ,CF=01 0 0 1 1 0 01DSTCF1 1 0 0 1 1 0 0训练247
更多相关文档

我要回帖

更多关于 工行指令状态未核对 的文章

 

随机推荐