微机原理周荷琴版第三章_第1页
微机原理周荷琴版第三章_第2页
微机原理周荷琴版第三章_第3页
微机原理周荷琴版第三章_第4页
微机原理周荷琴版第三章_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章第三章 8086指令系统指令系统 指令系统是微处理器(指令系统是微处理器(cpu)所能执行的指令)所能执行的指令的集合,它与微处理器有密切的联系,不同的微处的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统。在本章中我们主要讲解理器有不同的指令系统。在本章中我们主要讲解intel公司生产的公司生产的8086/8088cpu的寻址方式以及各的寻址方式以及各种指令系统,并通过具体实例讲述了各条指令的功种指令系统,并通过具体实例讲述了各条指令的功能和使用方法。能和使用方法。通过本章的学习,读者应该掌握以下内容:通过本章的学习,读者应该掌握以下内容: 4种操作数的寻址方式种操作数的

2、寻址方式 常用指令的格式、功能、以及对标志位的影响常用指令的格式、功能、以及对标志位的影响 3.1 8086的寻址方式的寻址方式操作码操作码 操作数操作数操作码:操作码:指令操作类型;(必须有)指令操作类型;(必须有)操作数:操作数:指令所需操作数或操作数的地址;操作数可以指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个(一个源操作数,一个目的操作有一个,也可以有两个(一个源操作数,一个目的操作数),也可以没有。数),也可以没有。例:例: mov ax,cx ;将;将cx的内容送入的内容送入ax中。中。 inc ax sti汇编指令的格式如下汇编指令的格式如下:一、一、 立即寻址方

3、式立即寻址方式指令操作数部分直接给出指令的操作数,操作数与操作指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中码一起存入代码段中。立即数有立即数有8位和位和16位。位。例例 :mov al,5 ;源操作数为立即寻址;源操作数为立即寻址指令执行后,指令执行后,al=05h,8位数据位数据05h存入存入al寄存器。寄存器。例例 :mov ax,3064h ;源操作数为立即寻址;源操作数为立即寻址指令执行后,指令执行后,ax=3064h,16位数据位数据3064h存入存入ax寄存寄存器。器。 注意:注意:立即数只能作源操作数,不能作目的操作数。立即数只能作源操作数,不能作目的操作数

4、。 以以a、b、c、d、e、f开头的数字出现在指开头的数字出现在指令中时,必须在前面加一个数字令中时,必须在前面加一个数字0。 立即数可以送到寄存器、存储器中。立即数可以送到寄存器、存储器中。例:下列指令是错误的。例:下列指令是错误的。 mov 2000h,ax mov al,b5h 而指令而指令mov 2000h,1234h是对的。是对的。二、二、 寄存器寻址方式寄存器寻址方式 寄存器寻址方式的操作数是寄存器的值,指令中寄存器寻址方式的操作数是寄存器的值,指令中直接使用寄存器名,包括直接使用寄存器名,包括8位或位或16位通用寄存器和段寄位通用寄存器和段寄存器。存器。可使用的可使用的16位寄存

5、器:位寄存器:ax、bx、cx、dx、si、di、sp、bp、cs、ds、es、ss;其中;其中ax、bx、cx、dx可分成两个可分成两个8位寄存器别使用。位寄存器别使用。例:例: mov ax,cx ;(;(ax) (cx) mov al,1 ;(;(al) 1注意:注意:cs不能作为目的操作数,如不能作为目的操作数,如mov cs,ax是错误的指令。是错误的指令。 源操作数必须与目的操作数相匹配。如源操作数必须与目的操作数相匹配。如 mov al,bx是错误的是错误的三、三、 存储器寻址方式存储器寻址方式 在存储器寻址方式中,操作数是某个内存单元的在存储器寻址方式中,操作数是某个内存单元的

6、内容(值),指令中给出的是内存单元的有效地址内容(值),指令中给出的是内存单元的有效地址ea(即偏移地址),段地址通常在隐含的某个段寄存器(即偏移地址),段地址通常在隐含的某个段寄存器中。由于内存单元的地址的给出方式不同,存储器寻中。由于内存单元的地址的给出方式不同,存储器寻址又可分为以下几种寻址方式:直接寻址、寄存器间址又可分为以下几种寻址方式:直接寻址、寄存器间址、寄存器相对寻址、基址变址寻址、基址变址相对址、寄存器相对寻址、基址变址寻址、基址变址相对寻址。寻址。1、直接寻址方式、直接寻址方式 形式:形式:mov ax,nn mov ax,x 在直接寻址方式中,操作数的偏移地址在直接寻址方

7、式中,操作数的偏移地址(有效地址有效地址ea)直接用指令加以指定直接用指令加以指定(有直接地址值和标号两种形有直接地址值和标号两种形式式),它存放在代码段中指定操作码之后,但操作数一,它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操作数的般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。物理地址,然后再访问存储器才能取得操作数。段地址段地址隐含的由隐含的由ds 指定指定,也可以,也可以es指定,但需在指令中指明。指定,但需在指令中指明。最后存储器地址为:最后存储器地址为:ds:偏移地址偏移地址 或或 es:偏移地址。偏

8、移地址。例:例: mov ax,2000h 将将ds:2000h单元内容送入单元内容送入ax mov al,2000h 将将ds:2000h单元的内容取一个字节送单元的内容取一个字节送al例:例: mov ax,es:2000h 将将es:2000h单元中的内容送入单元中的内容送入ax mov al,x x必须是数据段中用必须是数据段中用db定义的变量定义的变量传送原则:低地址的内容(字节)送寄存器的低位,高传送原则:低地址的内容(字节)送寄存器的低位,高地址的内容送寄存器的高位。地址的内容送寄存器的高位。2、寄存器间接寻址、寄存器间接寻址寄存器间接寻址方式的操作数形式为:寄存器间接寻址方式的

9、操作数形式为:reg操作数的有效地址包含在基址寄存器操作数的有效地址包含在基址寄存器bx,基址指针,基址指针bp或一个变址寄存器(或一个变址寄存器(si或或di)中。寄存器间接寻址要)中。寄存器间接寻址要用方括号括起来,以便与寄存器操作数相区别。用方括号括起来,以便与寄存器操作数相区别。例:例: mov ax,bx;将由;将由bx决定的存储单元的内决定的存储单元的内容送到容送到ax寄存器。寄存器。0000000100020003bbaatab:axah al aa bb间接寻址间接寻址数据段数据段0001bx操作数在存储器中,指令中寄存器内容作为操作数所在操作数在存储器中,指令中寄存器内容作为

10、操作数所在单元的有效地址。单元的有效地址。 (bx) (si) (di) (bp)有效地址有效地址 = 段寄存器为段寄存器为ds段寄存器为段寄存器为ss物理地址计算方法:物理地址计算方法:物理地址物理地址 = (ds)* 16 + (bx)或()或(si)或()或(di)物理地址物理地址 = (ss)* 16 + (bp)例:已知:(例:已知:(ds)=2100h,(,(di)=2000h 指令:指令: mov ax,di ;(;(ax) (di) 物理地址物理地址=(ds) * 16 + (di) =2100h * 16 + 2000h =21000h + 2000h =23000h 指令结

11、果:将指令结果:将23000h单元内容送单元内容送al中,中, 将将23001h单元内容送单元内容送ah中。中。例:例: mov ax,ds:bp mov bx,es:si3、寄存器相对寻址方式、寄存器相对寻址方式操作数在存储器内,指令中寄存器内容与指令指定的位操作数在存储器内,指令中寄存器内容与指令指定的位移量(移量(disp)之和作为操作数所在单元的有效地址。)之和作为操作数所在单元的有效地址。 (bx) disp8 (si) (di) (bp) disp16有效地址有效地址 = 段寄存器为段寄存器为ds段寄存器为段寄存器为ss+物理地址物理地址 = (ds)* 16 +(bx)+disp

12、8(si)、()、(di)、)、disp16类同。类同。物理地址物理地址= (ss) *16 + (bp)+disp16例:例: 如果如果 (ds)=3000h, (si)= 2000h, count=3000h, 则执行指令则执行指令 mov ax,conutsi,求出此种寻址方,求出此种寻址方式对应的有效地址和物理地址。式对应的有效地址和物理地址。有效地址有效地址= 2000h + 3000h = 5000h物理地址物理地址=(ds)*16 + 5000h =30000h + 5000h =35000h4、基址变址寻址方式:、基址变址寻址方式:操作数在存储器中,指令将基址寄存器(操作数在存

13、储器中,指令将基址寄存器(bx或或bp)与变址寄存器(与变址寄存器(si或或di)内容之和作为操作数所在存)内容之和作为操作数所在存储单元的有效地址。储单元的有效地址。 (bx) (si) (bp) (di)有效地址有效地址 =+物理地址物理地址 = (ds) * 16 + (bx)+ (si)或()或(di)物理地址物理地址 = (ss) * 16 + (bp) + (si)或()或(di)例:例: mov ax,bx+di 或或 mov ax,bxdi ds:(bx)+(di) 字存储单元内容送字存储单元内容送ax。例:例: mov ax,bp+si 或或 mov ax,bpsi ss:(

14、bp)+(si) 字存储单元内容送字存储单元内容送ax。 例:如果例:如果 (ds)=2100h, (bx)= 0158h, (di)=10a5h, ea=11fdh, 则执行指令则执行指令 mov al,bxdi有效地址:有效地址:ea=(bx)+(di)=0158h+10a5h=11fdh 物理地址:(物理地址:(ds) * 16 + 有效地址有效地址=21000h+11fdh=221fdh执行结果:将执行结果:将221fdh单元内容送入寄存器单元内容送入寄存器al中。中。5、基址变址相对寻址方式、基址变址相对寻址方式操作数在存储器内,指令将基址寄存器(操作数在存储器内,指令将基址寄存器(

15、bx或或bp)与)与变址寄存器(变址寄存器(si或或di)的内容之和再加上位移量()的内容之和再加上位移量(8位位或或16位),得到操作数所在单元的有效地址。位),得到操作数所在单元的有效地址。 (bx) (si) disp8 (bp) (di) disp16有效地址有效地址=+物理地址物理地址 = (ds)* 16 +(bx)产生的有效地址)产生的有效地址物理地址物理地址 = (ss)* 16 +(bp)产生的有效地址)产生的有效地址例:已知:(例:已知:(ds)=3000h,(,(bx)=2000h,(,(si)=1000h,mk=0250h 指令:指令: mov ax,mkbxsi 或或

16、 mov ax,mkbx+si 或或 mov ax,mk+bx+si 有效地址:有效地址:mk+(bx)+(si)=0250h+2000h+0100h =3250h 物理地址:(物理地址:(ds)*16 +有效地址有效地址=30000h+3250h=33250h 执行结果:将执行结果:将33250h单元内容送单元内容送al,33251h内容送内容送ah。 6、 段超越段超越当操作数在内存单元时,系统根据隐含约定,自动将当操作数在内存单元时,系统根据隐含约定,自动将寄存器寄存器ds或或ss的值作为段地址。然而,当操作数段的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀

17、取地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。代其隐含约定。 段超越前缀形式为:段超越前缀形式为: 段寄存器名:段寄存器名:mem例如:例如:mov ax,es:bp ;段地址在;段地址在esmov ax,cs:bx si ;段地址在;段地址在cs段地址的基本约定和允许超越的情况如表所示:段地址的基本约定和允许超越的情况如表所示:存储器存取方式 约定段 允许超越段偏移地址取指令堆栈操作源串目的串bp作基址通用数据读写csssdsesssds无无cs,es,ss无cs,ds,escs,es,ssipspsidi有效地址ea有效地址ea7、 对内存寻址方式的注解对内存寻址方式的注解

18、(1)在汇编后,指令中的变量名有具体的偏移地址)在汇编后,指令中的变量名有具体的偏移地址所取代。所取代。 (2)在寄存器相对寻址与相对基址变址方式中,位)在寄存器相对寻址与相对基址变址方式中,位移量移量disp可以是符号常量或变量,汇编后为一个常数,可以是符号常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。若是变量,则取其偏移地址。(3)在)在microsoft宏汇编宏汇编masm(microsoft macro assembler)中,内存操作数可以采用多种书写形式:)中,内存操作数可以采用多种书写形式:6bxsi、bx+6si、bx+si+6 (4)在)在 中只能出现立即数和中只能

19、出现立即数和bx、bp、si、di,且,且bx和和bp、si和和di不能成对出现在不能成对出现在 中。中。 如:如:bx+bp、si+di是非法的指令形式是非法的指令形式(5)计算出的有效地址以)计算出的有效地址以16位表示,若超过位表示,若超过0ffffh,cpu将忽略所有溢出。将忽略所有溢出。 (6)记忆)记忆8086内存操作数形式的简易方法如下:内存操作数形式的简易方法如下: bx si disp bp di每列选择一项、二项或三项,即可得到有效的内存操作每列选择一项、二项或三项,即可得到有效的内存操作数形式。数形式。 四、端口寻址方式四、端口寻址方式 操作数在端口寄存器中,指令中给出了

20、端口的操作数在端口寄存器中,指令中给出了端口的地址。根据端口地址的不同,有两种寻址方式:地址。根据端口地址的不同,有两种寻址方式:1、端口直接寻址、端口直接寻址 端口为端口为8位地址位地址00hffh 如:如:in al,80h;8位数据位数据 in ax,80h;16位数据位数据 out 81h,al2、端口间接寻址、端口间接寻址 端口为端口为16位地址位地址0000hffffh 如:如:mov dx,218h in al,dx 源操作数的寻址方式例源操作数的允许形式 直接操作数(立即数)mov ax, 20h指令中的直接常数间接操作数 寄存器操作数mov ax, bx通用寄存器或段寄存器存

21、储器操作数直接寻址mov ax, ds:20mov ax, b(字)“段:常数”或“段:常数”“变量”或“变量”间接寻址寄存器间接寻址mov ax, bxbx, bp, si, di 之一寄存器相对寻址mov ax, bx+20 mov ax, bx+b(字)bx, bp, si, di 之一位移量基址变址寻址mov ax, bx+sibx, bp之一si, di 之一基址变址相对寻址mov ax, bx+si+20 mov ax, bx+si+b(字)bx, bp之一si, di 之一位移量端口操作数 直接寻址in al, 20h指令中有端口号(0 0ffh) 间接寻址in al, dxdx

22、 中有端口号(0 0ffffh)操作数的寻址方式操作数的寻址方式3.2 指令的机器码表示方法(略)指令的机器码表示方法(略) 3.3 8080指令系统指令系统8086/8088的指令系统可以分为的指令系统可以分为6组:组:(1)数据传送指令)数据传送指令(2)算术运算指令)算术运算指令(3)逻辑指令与移位指令)逻辑指令与移位指令(4)串操作指令)串操作指令(5)控制转移指令)控制转移指令(6)处理机控制指令)处理机控制指令 一、一、 数据传送指令数据传送指令 数据传送指令是最简单、最常用的一类指令,它数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储是负责

23、把数据、地址、或立即数传送到寄存器或存储单元中单元中 。这类指令又可分为以下几种情况。这类指令又可分为以下几种情况:通用传送指令:通用传送指令:mov、push/pop、xchg、xlat输入输出指令:输入输出指令:in、out地址目标传送指令:地址目标传送指令:lea、lds、les标志传送指令:标志传送指令:lahf、sahf、pushf、popf1、通用传送指令、通用传送指令(1)mov(move):传送指令):传送指令mov指令的格式为:指令的格式为:mov dest,src ;destsrc功能:将源操作数功能:将源操作数src复制到目的操作数复制到目的操作数dest中,源操中,源操

24、作数作数src的内容不变。的内容不变。对标志位的影响:无对标志位的影响:无语法格式:语法格式:mov reg/mem/seg ,reg/mem/seg/immmov指令的操作数及传送方向见下页指令的操作数及传送方向见下页立即数立即数imm存储器存储器mem通用寄存器通用寄存器regds、es、sscs(seg)说明:说明:双操作数指令不允许两个操作数同时为段寄存器或双操作数指令不允许两个操作数同时为段寄存器或存储器操作数存储器操作数 mov seg , seg ;错误;错误 mov mem ,mem ;错误;错误 立即数不能传送到段寄存器中立即数不能传送到段寄存器中 mov seg ,imm

25、; 错误错误 立即数不能作为目的操作数立即数不能作为目的操作数 mov imm , reg ; 错误错误目的操作数不允许使用目的操作数不允许使用cs、ip寄存器寄存器 mov cs,ax ; 错误错误dest与与src必须类型匹配,即同时是字节或字类型。必须类型匹配,即同时是字节或字类型。 mov ax,bx注意:注意:寄存器具有明确的类型,例如,寄存器具有明确的类型,例如,al、ax分别为字节、分别为字节、字类型。字类型。立即数没有明确的类型,立即数没有明确的类型,masm负责将立即数扩展为负责将立即数扩展为与目的操作数位数相同。与目的操作数位数相同。 mov al,34h mov bx,5

26、6h有时有时masm不能确定内存操作数的类型,需要用不能确定内存操作数的类型,需要用byte ptr和和word ptr明确指出是字节或字类型。只要其中一明确指出是字节或字类型。只要其中一个操作数的类型确定即可。个操作数的类型确定即可。 mov 2000h,al mov 2000h,byte ptr 34h例:错误的例:错误的mov 指令如下所示:指令如下所示:mov ax,bl ;类型不匹配;类型不匹配mov ds,1000h ;不允许立即数送段寄存器;不允许立即数送段寄存器mov bx ,si ;不允许内存操作数之间传送;不允许内存操作数之间传送mov es,cs ;不允许段寄存器之间传送

27、;不允许段寄存器之间传送mov cs,ax ;cs不能作为目的操作数不能作为目的操作数例:设例:设b是已定义的字节变量,以下是一些错误和正确是已定义的字节变量,以下是一些错误和正确的指令。的指令。mov ax,b ;错误,类型不匹配;错误,类型不匹配mov b,0 ;正确,;正确,masm可以判断出要可以判断出要 送字节送字节0到单元到单元b中中mov bx,1 :错误,不能确定数据类型:错误,不能确定数据类型mov byte ptr bx,1;正确;正确(2)xchg(exchange):交换指令):交换指令xchg指令的格式为:指令的格式为:xchg oprd1 , oprd2 ;交换;交

28、换oprd1与与oprd2的内容的内容语法格式为:语法格式为:xchg reg/mem,reg/mem例:设数据段中有两个字变量例:设数据段中有两个字变量w1和和w2,将这两个数据,将这两个数据互换的程序段如下:互换的程序段如下:mov ax,w1xchg ax,w2mov w1,ax不用数据交换指令,仅用不用数据交换指令,仅用mov 指令的程序段如下:指令的程序段如下:mov ax,w1mov bx,w2mov w1,bxmov w2,ax还可以用堆栈操作指令来实现,程序段如下:还可以用堆栈操作指令来实现,程序段如下:push w1push w2pop w1pop w2若若w1、w2为字节操

29、作数,则前两种方式均可行(用为字节操作数,则前两种方式均可行(用8位寄存器),但不能用堆栈操作指令实现,因为堆栈操位寄存器),但不能用堆栈操作指令实现,因为堆栈操作只能是字操作。作只能是字操作。(3)push:入堆操作:入堆操作 push reg/mem/seg操作:(操作:(sp) (sp)-2, (sp)+1,(,(sp) (src)即先移后入。即先移后入。(4)pop:出栈:出栈 操作操作 pop reg/mem/seg操作:(操作:(dst) (sp)+1,(,(sp) (sp) (sp)+2先出后移。但先出后移。但cs不能作为目的操作数。不能作为目的操作数。堆栈堆栈ss:01f8ss

30、:01fass:01fcss:01fespaa bb(执行(执行push ax之前)之前)堆栈堆栈ss:01f8ss:01fass:01fcss:01fespaa bb(执行(执行push ax之后)之后)1101h1101h ax堆栈堆栈ss:01f8ss:01fass:01fcss:01fespaa bb(执行(执行pop ax之后)之后)1101h ax123(5)xlat 查表指令查表指令 格式:格式:xlat ; bx+al al功能:将表首地址为功能:将表首地址为bx,偏移地址为,偏移地址为al的单元的内容送到的单元的内容送到al中。该指令通常用来实现一种代码向另一种代码的转换。中

31、。该指令通常用来实现一种代码向另一种代码的转换。十进制数七段代码十进制数七段代码040h512h179h602h224h778h330h800h419h918h例:若十进制数字例:若十进制数字0-9的的led七段代码对照表如前所示,七段代码对照表如前所示,试用求数字试用求数字5的七段代码。的七段代码。table db 40h,79h,24h,30h,19h db 12h,02h,78h,00h,18h方法方法1: mov al,5 mov bx,offset table xlat方法方法2: mov si,5 mov bx,offset table mov al,bx+si2、输入输出指令、输

32、入输出指令 输入输出指令是用来实现输入输出指令是用来实现i/o端口与端口与ax之间的数据之间的数据传送。根据端口地址的不同,又分为端口直接寻址和端传送。根据端口地址的不同,又分为端口直接寻址和端口间接寻址两种。口间接寻址两种。(1)in(input)格式:格式:in al,(,(port););8位地址、位地址、8位数据位数据 in ax,(,(port););8位地址、位地址、16位数据位数据 或:或:in al,dx ;16位地址、位地址、8位数据位数据 in ax,dx ;16位地址、位地址、16位数据位数据(2)out(output)格式:格式:out dx,al ;其余类同。;其余类

33、同。3、地址目标传送指令、地址目标传送指令(1 1)lealea:取有效地址:取有效地址格式:lea reg,mem 功能:取源操作数地址的偏移量,并把它传送到止的操作数所在的单元。要求:源操作数必须是一个存储器操作数,目标操作数必须是一个除段寄存器以外的16位寄存器,通常是间址寄存器si等。lea 指令与指令与mov 指令的区别:指令的区别:lea si,buff指令是将标号指令是将标号buff的偏移地址送入寄存器中;的偏移地址送入寄存器中;mov si,buff指令是将标号指令是将标号buff所指存储单元的内容送所指存储单元的内容送入入si。buff =0123454800fefflea

34、si,buff;执行后:(执行后:(si)=0002hmov si,buff;执行后:(执行后:(si)=0048h段起始地址段起始地址(2) lds:传送有效地址及数据段首址指令:传送有效地址及数据段首址指令格式:格式:lds reg16 ,mem32 ;功能:将源操作数指定的存储单元中取功能:将源操作数指定的存储单元中取4个字节,前两个字节,前两个字节送入指定寄存器,后两个字节送个字节送入指定寄存器,后两个字节送ds寄存器。寄存器。(3)les:传送有效地址及附加数据段指令:传送有效地址及附加数据段指令格式:格式:les reg16 ,mem32 ;功能:将源操作数指定的存储单元中取功能:

35、将源操作数指定的存储单元中取4个字节,前两个字节,前两个字节送入指定寄存器,后两个字节送个字节送入指定寄存器,后两个字节送es寄存器。寄存器。说明:指令中源操作数必须是存储单元,从该单元开说明:指令中源操作数必须是存储单元,从该单元开始的连续始的连续4个字节单元中,存放着一个变量的地址指针。个字节单元中,存放着一个变量的地址指针。57h13h68h24h例:(例:(ds)=c000h,(,(c2480h)=1357h,(,(c2482h)=2468hds:2480hds:2481hds:2482hds:2483h 13 57 24 68 sidslds si,2480lds指令例指令例 ds

36、= 6000h di = 1234h ax = 2233h 12h34h00h60h1200h数数据据段段 1 ds60 0012 34di数数据据段段233h22h61234h4. 标志传送(位操作)指令标志传送(位操作)指令 lahfsahfpushfpopf隐含操作数隐含操作数ah隐含操作数隐含操作数flagslahf,sahf(1)lahf ;将flags的低8位装入ah(2)sahf ;执行与lahf相反的操作sfpfafzfcf.ahflagsd15d0d7d0例:标志寄存器传送。例:标志寄存器传送。执行前:(执行前:(flags)=0485h,(,(ax)=0ffffh执行指令执

37、行指令lahf后,后, (flags)=?(3)pushf功能:功能:将标志寄存器的内容进栈,同时修改sp。(4)popf功能:功能:把当前sp所指的字送到标志寄存器psw,并修改sp的值。标志传送指令说明:标志传送指令说明:lahf/sahf指令是寄存器指令是寄存器ah与标志寄存器与标志寄存器psw的低的低字节之间完成的字节型数据传送。字节之间完成的字节型数据传送。 pushf/popf指令是标志寄存器指令是标志寄存器psw与堆栈间进行的与堆栈间进行的字型数据传送。字型数据传送。指令指令sahf/popf将影响标志位。将影响标志位。所有的数据传送类指所有的数据传送类指令仅此两条指令影响标志位

38、。令仅此两条指令影响标志位。二、二、 算术运算指令算术运算指令运算的数据类型:有符号二进制数、无符号二进制数、运算的数据类型:有符号二进制数、无符号二进制数、无符号压缩无符号压缩bcd码、无符号非压缩码、无符号非压缩bcd码。码。除除cbw、cwd外,所有指令均影响标志位。外,所有指令均影响标志位。指令类型:指令类型: 加法:加法:add、adc、inc 减法:减法:sub、sbb、dec、neg、cmp 乘法:乘法:mul、imul 除法:除法:div、idiv 符号扩展:符号扩展:cbw、cwd十进制调整:十进制调整:daa、das、aaa、aas、aam、aad1、加法指令、加法指令指令

39、格式:指令格式:加法加法 add dst,src;(;(dst) (src)+(dst)带进位加法带进位加法 adc dst,src; (dst) (src)+(dst)+cf加加 1 inc dst ;(;(dst) (dst)+1说明:说明:这在三条指令运算结果将影响状态标志位,但是这在三条指令运算结果将影响状态标志位,但是inc指令不影响标志指令不影响标志cf。src可为可为imm、mem、reg,而,而dst只能为只能为reg、mem类型。类型。加法指令也有数据传送的功能,所以前面数据传送加法指令也有数据传送的功能,所以前面数据传送指令的限制同样有效。指令的限制同样有效。如不能同时为存

40、储器操作数如不能同时为存储器操作数例:将例:将3个个32位无符号数位无符号数12345678h,8765abcdh和和2468fedch相加,其和(仍为相加,其和(仍为32无符号位数)送无符号位数)送dx和和ax的程序段如下:的程序段如下: mov dx,1234h mov ax,5678h add ax,0abcdh adc dx,8765h add ax,0fedch adc dx,2468h注意:字母开头的十六进制数,要在其前面加一数字注意:字母开头的十六进制数,要在其前面加一数字0对对inc 指令,指令,dst既是源操作数,又是目的操作数,既是源操作数,又是目的操作数,因此因此dst只

41、能是只能是reg或或mem,为,为mem操作数时,必操作数时,必须指明数据类型,否则出错。须指明数据类型,否则出错。 如:如:inc si ;错误;错误 应为:应为:inc word ptr si ;字内容加;字内容加1 inc byte ptr si ;字节内容加;字节内容加1 2、减法指令、减法指令指令格式:指令格式:减法减法 sub dst,src ;(;(dst) (dst)- (src)带进位减法带进位减法 sbb dst,src;(;(dst)()(dst)-(src)-cf减减 1 dec opr ;(;(opr) (opr)-1求补求补 neg opr ;(;(opr) 0ff

42、ffh-(opr)+1比较比较 cmp opr1,opr2;(;(opr1)-(opr2) 以上五条指令均可作字或字节运算,而且除以上五条指令均可作字或字节运算,而且除dec不不影响影响cf外,其他都按一般规则影响状态标志位外,其他都按一般规则影响状态标志位 。说明:说明: 减法指令的语法规范同加法指令一致减法指令的语法规范同加法指令一致 求补指令不是求补码指令,它对任何形式的数均求补指令不是求补码指令,它对任何形式的数均求补。求补。如如al=0ah,neg al 后,后,al=f6h。所以所以neg指令常用来求负数(补码形式)的绝对值指令常用来求负数(补码形式)的绝对值 比较指令除了不回送结

43、果外,其他一切均同比较指令除了不回送结果外,其他一切均同sub指令,该指令主要用来判断两数的大小与是否相等。指令,该指令主要用来判断两数的大小与是否相等。比较指令后面常常是条件转移指令,根据比较的结果比较指令后面常常是条件转移指令,根据比较的结果实现程序的转移。实现程序的转移。 sbb指令常用在多精度数的减法运算。指令常用在多精度数的减法运算。 例:例:34124275h-2f65e2a5h=? 34 124 275 -2f65e2a5 04ac4fd0程序段:程序段:x dw 4275h,3412h y dw 0e2a5h,2f65h z dw 0,0 mov ax,x sub ax,y m

44、ov z,ax mov ax,x+2 sbb ax,y+2 mov z+2,ax 3、乘法指令、乘法指令指令格式:指令格式:无符号数乘法无符号数乘法 mul src ;(;(ax)()(al)*(src)字节乘法)字节乘法 ;(;(dx,ax)()(ax)*(src)字乘法)字乘法带符号数乘法带符号数乘法 imul src;操作同上;操作同上进行字节运算时,目的操作数必须是累加器进行字节运算时,目的操作数必须是累加器al,乘积在寄存器,乘积在寄存器ax中;进行字运算时,目的操作数必须是累加器中;进行字运算时,目的操作数必须是累加器ax,乘积在寄,乘积在寄存器存器dx,ax中。中。源操作数不允许

45、使用立即数。源操作数不允许使用立即数。乘法指令运算结果只影响状态标志乘法指令运算结果只影响状态标志cf、of。例:例:mul bx ;无符号数乘法,;无符号数乘法,bx乘上乘上ax 例例:编程求编程求y=5x,假定,假定x为字节数。为字节数。 mov al,x mov bl,5 mul bl mov al,5 mul x 4、除法指令、除法指令指令格式:指令格式:无符号数除法无符号数除法 div src ;(;(al) (ax)/(src)除法的商)除法的商 (ah) (ax)/(src)除法余数)除法余数 或者或者 (ax)()(dx,ax)/(src)除法的商)除法的商 (dx)()(dx

46、,ax)/(src)除法余数)除法余数带符号数除法带符号数除法 idiv src ;操作同上。;操作同上。当除数是字节数据时,被除数必须放在当除数是字节数据时,被除数必须放在ax中;当除数是字数据中;当除数是字数据时,被除数必须放在时,被除数必须放在dx,ax中。中。除法指令运算结果对状态标志无定义。除法指令运算结果对状态标志无定义。8086/8088规定规定idiv指令运算结果余数的符号与被除数相同。指令运算结果余数的符号与被除数相同。带符号数除法运算中,当被除数位数不够时,可进行扩展。带符号数除法运算中,当被除数位数不够时,可进行扩展。符号扩展指令:符号扩展指令:字节扩展到字字节扩展到字

47、cbw;将寄存器;将寄存器al中的符号位扩展到寄存器中的符号位扩展到寄存器ah字扩展到双字字扩展到双字 cwd;将寄存器;将寄存器ax中的符号位扩展到寄存器中的符号位扩展到寄存器dx指令功能:指令功能: 如果(如果(al)80h,则(,则(ah)=00h(正数)(正数) 否否则(则(ah)=0ffh(负数)(负数) 如果(如果(ax)8000h,则,则dx=0000h(正数)(正数) 否则(否则(dx)=0ffffh(负数)(负数) 70al70ah015axdx150cbwcwd例:求例:求-4001h4=?mov ax,-4001hcwdmov cx,4idiv cx说明:此题不能用说明:

48、此题不能用16位除位除8位的方式,因为其商超过了位的方式,因为其商超过了256。 5、压缩、压缩bcd码十进制调整指令码十进制调整指令加法十进制调整加法十进制调整 daa;执行的操作:这条指令执行前必须先执行执行的操作:这条指令执行前必须先执行add或或adc指令,加法指令必须把两个压缩的指令,加法指令必须把两个压缩的bcd码相加,并把结码相加,并把结果存放在果存放在al寄存器中。寄存器中。 减法十进制调整减法十进制调整 das;执行的操作:这条指令执行之前,必须先执行执行的操作:这条指令执行之前,必须先执行sub或或sbb指令,减法指令必须把两个指令,减法指令必须把两个bcd码相减,并把结果

49、码相减,并把结果存放在存放在al寄存器中。寄存器中。 调整的方法:调整的方法:累加器累加器al低低4位大于位大于9或辅助进位标志位或辅助进位标志位af=1,则累加器,则累加器al加加06h修正。修正。累加器累加器al高高4位大于位大于9或辅助进位标志位或辅助进位标志位af=1,则累加器,则累加器al加加60h修正。修正。累加器累加器al高高4位大于等于位大于等于9,低,低4位大于位大于9,则累加器,则累加器al进行加进行加66h修正。修正。例:进行例:进行bcd码加法运算码加法运算59+68=127 0101 1001 59 + 0110 1000 68 1100 0001 c1 + 0110

50、 0110 66 10010 0111 127 加法运算结果为加法运算结果为c1,af=1,高位大于,高位大于9加加66h进行压缩进行压缩bcd调整调整说明:说明:压缩压缩bcd码加法或减法十进制调整指令必须在码加法或减法十进制调整指令必须在add(adc)或或sub(sbb)指令之后,调整结果对标志)指令之后,调整结果对标志of无影响,对其它无影响,对其它状态标志位均有影响。状态标志位均有影响。减法十进制调整方法与加法十进制调整方法类同,只是将加减法十进制调整方法与加法十进制调整方法类同,只是将加6变为减变为减6操作。操作。上述加法及调整的指令如下:上述加法及调整的指令如下: mov al,

51、59h add al,68h daa练习:求练习:求8338=?(用?(用bcd码实现)码实现)6、非压缩、非压缩bcd码十进制调整指令码十进制调整指令指令格式:指令格式:加法十进制调整加法十进制调整 aaa ;减法十进制调整减法十进制调整 aas ;乘法十进制调整乘法十进制调整 aam ;除法十进制调整除法十进制调整 aad ;aaa指令将指令将al的内容变换成一位非压缩的十进制数。的内容变换成一位非压缩的十进制数。aaa检检查查al低四位,如低四位是低四位,如低四位是0-9的数字,的数字,aaa就清除就清除al的高四的高四位,以及位,以及af和和cf标志;如标志;如al低四位表示的数大于低

52、四位表示的数大于9或或af=1,aaa执行:执行:加加6到到al寄存器;寄存器;加加1到到ah寄存器;寄存器;置置af=1,cf=1;清除清除al高四位为高四位为0例:求例:求7+8=?mov ax,0007hmov bl,08hadd al,blaaa ;结果;结果al=05h,ah=01h,cf=af=1。aas指令检查指令检查al低四位,如低四位表示的数是低四位,如低四位表示的数是0-9的的数字,数字,ass清除清除al高四位及高四位及cf和和af标志;如标志;如al低四低四位表示的数大于位表示的数大于9或或af=1,aas进行如下调整:进行如下调整:al减去减去6;ah减去减去1;置置

53、af=1,cf=1;清除清除al中高四位中高四位。例:求例:求134=?mov ax,0103hmov bl,04hsub al,bl ;al=ffhaas ;al=09h,ah=0aam:指令的作用是用:指令的作用是用10(0ah)来除)来除al寄存器的寄存器的内容,并将除得的商和余数分别送到内容,并将除得的商和余数分别送到ah和和al来实现来实现转换。转换。例:例:79=?mov al,07hmov bl,09hmul bl ;ax=003fhaam ;ah=06h,al=03haad(非压缩(非压缩bcd码除法调整)码除法调整)指令格式:指令格式:aad指令功能:在做除法之前,将指令功能

54、:在做除法之前,将al加加ah*10,ah清清0进进行调整。然后与非压缩行调整。然后与非压缩bcd码作除法,码作除法,al中得到正中得到正确的商,确的商,ah中得到正确的余数。中得到正确的余数。例:例:732=? mov ax,0703h mov bl,02h aad div bl ;al=24h,ah=01h aam ;ah=03h,al=06h以上几条指令的执行结果为:在以上几条指令的执行结果为:在ax中得到正确的商中得到正确的商(非压缩(非压缩bcd码),但余数丢失。如果需要保留余数,码),但余数丢失。如果需要保留余数,则应在则应在div指令之后,指令之后,aam之前,将余数暂存到一个之

55、前,将余数暂存到一个寄存器。如果有必要,还应对余数进行调整。寄存器。如果有必要,还应对余数进行调整。三、三、 逻辑运算与移位指令逻辑运算与移位指令1、逻辑运算指令:对字节或字数据进行按位的操作。、逻辑运算指令:对字节或字数据进行按位的操作。格式:格式:逻辑与逻辑与 and dst,src; (dst)()(dst)and(src)逻辑或逻辑或 or dst,src; (dst)()(dst)or(src)逻辑非逻辑非 not opr ; (opr)()(opr)异或异或 xor dst,src; (dst)()(dst)xor(src)测试测试 test opr1,opr2;(;(opr1)a

56、nd(opr2)and指令主要用于使操作数的某些位保留(和指令主要用于使操作数的某些位保留(和1相与)、相与)、某些位清某些位清0(和(和0相与)。相与)。 例:例:and al,0fh;屏蔽高;屏蔽高4位,保留低位,保留低4位。位。 or用法:用法: a 用于使操作数的某些位保留(和用于使操作数的某些位保留(和0相或),某些相或),某些位置位置1(和(和1相或)。相或)。 b 用于分离符号标志,进行判断、转移。影响用于分离符号标志,进行判断、转移。影响zf、sf和和pf,cf=of=0。例:例:or bx,0c000b将将bx的两位最高的有效位(的两位最高的有效位(15和和14位)置成位)置

57、成1,而其,而其它位不变。它位不变。xor用法:用于使操作数的某些位保留(与用法:用于使操作数的某些位保留(与0异或),异或),某些位取反(和某些位取反(和1异或)。异或)。例:将例:将al的高的高4位保留,低位保留,低4位取反:位取反: xor al,0fh例:将例:将ax中的内容清中的内容清0: xor ax,axnot指令改变寄存器或存储单元的每一位状态,原指令改变寄存器或存储单元的每一位状态,原来为来为0变为变为1,原为,原为1变为变为0。例:例: not ax ;ax各位取反各位取反test指令是一条测试指令,它执行的操作与指令是一条测试指令,它执行的操作与and相相同,不过它不送回

58、结果,只影响标志位。同,不过它不送回结果,只影响标志位。例:例:test al,0000 0001b;如;如al最低位为最低位为0,则,则zf=1。例:测试例:测试al的的0、3、5位,若有一位为位,若有一位为1,则转出错,则转出错处理。处理。 test al,00101001b jnz error ;zf=0,转出错,转出错error。2、移位指令、移位指令逻辑左移逻辑左移 shl opr,cnl算术左移算术左移 sal opr,cnl逻辑右移逻辑右移 shr opr,cnl算术右移算术右移 sar opr,cnl其中:其中:opr为操作数,为操作数,cnl为为1或或cl表示移位次数表示移位

59、次数0cfopr0cfoprcfopr例:设例:设al=1011 0100,cf=1在在shl al,1之后,之后,al= 0110 1000 cf=1在在sal al,1之后,之后,al= 0110 1000 cf=1在在shr al,1之后,之后,al=0101 1010 cf=0在在sar al,1之后,之后,al=1101 1010 cf=0 算术左移(算术左移(sal)和算术右移()和算术右移(sar)实现带符号数移位。)实现带符号数移位。sar通过在整个移位过程中复制符号来保护操作数的符号。通过在整个移位过程中复制符号来保护操作数的符号。sal不保护进位,但如果符号位发生变化的话,

60、就将不保护进位,但如果符号位发生变化的话,就将1送送of标标志。在多次移位的情况下,志。在多次移位的情况下,of的值不确定。的值不确定。逻辑左移(逻辑左移(shl)和逻辑右移()和逻辑右移(shr)对无符号数的移位。)对无符号数的移位。shl将操作数左移,空出来的第将操作数左移,空出来的第0位置位置0;shr将操作数右移,空出来的高位(字节时第将操作数右移,空出来的高位(字节时第7位,字时第位,字时第15位)置位)置0。例:将两个非压缩例:将两个非压缩bcd码(高位在码(高位在bl,低位在,低位在al)合并成压)合并成压缩缩bcd码送码送al。 mov cl,4 ;将计数值送;将计数值送cl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论