指令系统1学习.pptx

上传人:莉*** 文档编号:73773728 上传时间:2023-02-22 格式:PPTX 页数:289 大小:937.34KB
返回 下载 相关 举报
指令系统1学习.pptx_第1页
第1页 / 共289页
指令系统1学习.pptx_第2页
第2页 / 共289页
点击查看更多>>
资源描述

《指令系统1学习.pptx》由会员分享,可在线阅读,更多相关《指令系统1学习.pptx(289页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 (1)操作数位于指令区,即操作数包含在指令中,只要取出该指令进行操作,就会寻到紧随其后的操作数,这种操作数称为立即数。(2)操作数位于CPU的某一个内部寄存器中,指令中的操作数是寄存器名,只要知道寄存器的地址(编号)就可寻到操作数,这种操作数称为寄存器操作数。(3)操作数位于存储器数据区或堆栈区的某个单元中,指令中以不同的方式给出了存储单元的地址,只要知道了存储单元的地址就可以寻到操作数,这种操作数称为存储器操作数。第1页/共289页 (4)操作数位于I/O端口中,指令中以直接或间接的方式给出I/O端口的地址,只要知道I/O端口的地址就可以寻到I/O端口操作数。指令中寻找操作数的方式就是寻址

2、方式。根据操作数位于计算机中的不同地方,常用的寻址方式有立即寻址、寄存器寻址、存储器和I/O端口寻址。其中存储器寻址又包括直接寻址、寄存器间接寻址、变址寻址和基址加变址寻址,如图4.1所示。第2页/共289页图4.1 寻址方式分类第3页/共289页4.1.1 立即寻址 操作数直接出现在指令中的寻址方式称为立即寻址。立即数可以是8位或者16位的整数,如果是16位立即数,存放时低8位在前(低地址部分),高8位在后(高地址部分)。例如:MOV BL,80H MOV AX,2008H第4页/共289页图4.2 立即寻址方式第5页/共289页立即数在指令中只能作为源操作数。立即寻址方式主要用于给寄存器或

3、存储单元赋初值,但是段寄存器与标志寄存器除外,为了给段寄存器传送数据,应先将立即数赋给一个通用寄存器,然后再由通用寄存器传送给段寄存器。例如:MOV AX,1234H;AX1234H MOV SS,AX;SS(AX)第6页/共289页4.1.2 寄存器寻址l操作数位于CPU内部寄存器,寄存器名出现在指令中。l寄存器可以是8位和16位的。l对于8位的寄存器,只能是AH、AL、BH、BL、CH、CL、DH和DL。l对于16位的寄存器可以是8个通用寄存器。l一条指令中源操作数与目的操作数都可以使用寄存器寻址,但二者必须等长。例如:MOV BX,AX第7页/共289页其执行情况如图4.3所示。由于寄存

4、器操作数位于CPU内部,寻址过程不涉及总线操作,因此寄存器寻址方式速度较快。图4.3 寄存器寻址方式第8页/共289页4.1.3 直接寻址 存储单元的地址由两部分构成,即段的基地址和段内偏移量。指令中只提供段内偏移量,又称有效地址EA。EA的构成方式有多种,形成了多种存储器寻址方式。操作数地址的16位段内偏移量包含在指令中,即EA直接由指令提供,这种寻址方式称为直接寻址。操作数所在单元的物理地址就为数据段寄存器DS加上指令中提供的16位段内偏移量。第9页/共289页例如:MOV AX,3000H 注意表示有效地址的16位数必须加上方括号,另外指令完成的功能不是将数3000H,传送到累加器AX,

5、假设数据段寄存器DS=2000H,则该存储器单元的物理地址为 2000H10H+3000H20000H+3000H23000H 操作数物理地址的形成以及指令执行情况如图4.4所示,指令执行后AX中的内容为3412H。第10页/共289页图4.4 直接寻址方式第11页/共289页段超越,即允许用CS、SS或ES作为段寄存器,例如:MOV BX,ES:3000H4.1.4 寄存器间接寻址 操作数位于存储器中,而操作数所在存储单元的16位偏移量即有效地址EA则位于寄存器中。可以存放有效地址的寄存器有4个,即SI、DI、BX和BP。当选择不同的间址寄存器时,隐含的段寄存器有所不同。第12页/共289页

6、1.选择SI、DI和BX作为间址寄存器 隐含段寄存器为DS,例如:MOV AX,SI 假设数(DS)=3100H,(SI)=0100H,则存储器单元的物理地址为 3100H10H+0100H31000H+0100H31100H 操作数物理地址的形成以及指令执行情况如图4.5所示。第13页/共289页图4.5 SI寄存器间接寻址 第14页/共289页2.选择BP作为间址寄存器 隐含段寄存器为SS,例如:MOV BP,AX (AX)=5678H,(SS)=2500H,(BP)=1000H,则存储器单元的物理地址为 2500H10H+1000H25000H+1000H26000H操作数物理地址的形成

7、以及指令执行情况如图4.6所示,指令执行后26000H单元中的内容为78H,26001H单元中的内容为56H。第15页/共289页图4.6 BP寄存器间接寻址 第16页/共289页 注意:p用作间接寻址的寄存器必须加上方括弧。p无论用SI、DI、BX或者BP作为间址寄存器,都允许段超越,例如:MOV ES:BX,AX MOV BX,DS:BP 这两条指令分别改变了各自的隐含段寄存器。8086中关于隐含段寄存器的约定以及允许段超越的说明见表4-1。第17页/共289页 表4-1 访问存储器时段寄存器的约定 存储器操作的类型存储器操作的类型隐含的段寄存器隐含的段寄存器允许超越的段寄存器允许超越的段

8、寄存器有效地址有效地址取指令取指令CS无无IP堆栈操作堆栈操作SS无无SP通用数据读取通用数据读取DSCS,ES,SS有效地址有效地址EA源数据串源数据串DSCS,ES,SSSI目的数据串目的数据串ES无无DI用用BP作为基址寄存器作为基址寄存器SSCS,DS,ES有效地址有效地址EA第18页/共289页4.1.5 变址寻址 变址寻址又称作寄存器相对寻址,有效地址EA为指定寄存器的内容与指令中给定的8位或16位位移量(disp)的和,位移量的取值范围为-32768+32767。可以用作变址寻址的寄存器有4个,即SI、DI、BX和BP。当选择不同的变址寄存器时,隐含的段寄存器有所不同,分两种情况

9、。第19页/共289页1.选择SI、DI和BX作为变址寄存器 隐含段寄存器为DS。例如:MOV AX,SI+1200H (DS)=2000H,(SI)=1500H,则存储器单元的物理地址为 2000H10H+1500H+1200H20000H+1500H+1200H 22700H 操作数物理地址的形成以及指令执行情况如图4.7所示,指令执行后AX中的内容为8967H。第20页/共289页图4.7 SI寄存器变址寻址 第21页/共289页2.选择BP作为变址寄存器 隐含段寄存器为SS。操作数的物理地址为SS的内容左移4位,加上BP中的内容,再加上指令中给定的8位或16位的位移量。例如:MOV B

10、P+2100H,AX 假设(AX)=9ACDH,(SS)=3000H,(BP)=2000H,则存储器单元的物理地址为 3000H10H+2000H+2100H30000H+2000H+2100H 34100H 操作数物理地址的形成以及指令执行情况如图4.8所示。第22页/共289页图4.8 BP寄存器变址寻址第23页/共289页 注意变址寻址指令可以有几种不同的形式,例如以下3种写法就能实现相同的功能。MOV AL,BP+disp MOV AL,BP+disp MOV AL,dispBP 另外,无论用SI、DI、BX或者BP作为变址寄存器,都允许段超越,即改变隐含段寄存器。第24页/共289页

11、4.1.6 基址加变址寻址 有效地址EA为指定基址寄存器(BX或BP)的内容与指定变址寄存器(SI或DI)内容的和,再加上指令中给定的8位或16位位移量(disp),位移量的取值范围为-32768+32767。隐含的段寄存器,由所用的基址寄存器决定,当使用BX存放基地址时,隐含段寄存器为DS,当使用BP时,隐含段寄存器为SS。例如:MOV AX,1100HBXDI第25页/共289页 假设(DS)=2000H,(BX)=0100H,(DI)=1500H,则存储器单元的物理地址为 2000H10H+0100H+1500H+1100H 20000H+0100H+1500H+1100H22700H操

12、作数物理地址的形成以及指令执行情况如图4.9所示,指令执行后AX中的内容为1357H。第26页/共289页图4.9 基址加变址寻址方式 第27页/共289页注意以下6种写法可实现相同的功能。MOV AL,disp BPSI MOV AL,BP+dispSI MOV AL,BP+SI+disp MOV AL,BP disp SI MOV AL,BP+SI disp MOV AL,dispSIBP基址加变址寻址指令允许段超越,即改变隐含段寄存器。另外,不允许将两个基址寄存器或者两个变址寄存器组合在一起寻址。第28页/共289页 当操作数位于I/O端口寄存器中,8086 CPU可以通过直接和间接的方

13、式来进行操作数的寻址。p直接寻址方式,I/O端口的地址以8位立即数的形式在指令中直接给出,能够寻址的端口号在0255的范围内,即能够寻址256个端口。例如:IN AL,60H第29页/共289页p间接寻址方式,16位的I/O端口的地址必须存放在DX寄存器中,即通过DX间接寻址,这种方式能够寻址的端口号范围为065535,共计64K个端口。例如:MOV DX,0360H IN AL,DX 上述指令将地址为0360H的端口中的内容送至累加器AL。第30页/共289页 微处理器指令的分类很多,按指令功能可以分为数据传送类指令、数据处理类指令、程序控制类指令、CPU控制类指令以及为提高计算机求解专门问

14、题的效率或简化程序而增设的其他指令。8086的指令按功能可以分为6类:数据传送指令、算术运算指令、逻辑运算和移位指令、串操作指令、控制转移指令和处理器控制指令。第31页/共289页4.2.1 数据传送指令(Data Transfer)数据传送是一种最基本、最主要的操作,数据传送指令在程序中占着极大的比例,数据传送指令是应用最频繁的、寻址方式最多的、也是数量最多的一类指令。8086CPU数据传送指令可分为通用数据传送指令、交换指令、堆栈操作指令、地址传送指令、累加器专用传送指令和标志寄存器传送指令,共14条。第32页/共289页1.通用数据传送指令(General Purpose Transfe

15、r)1)传送指令(Movement)指令格式:MOV DST,SRC 指令功能:把源操作数SRC的内容传送给目的操作数DST。可以进行字节数据、字数据的传送,但是源和目的操作数必须等长。源操作数可以是通用寄存器、段寄存器、存储器或立即操作数;目的操作数可以是通用寄存器、段寄存器(CS除外)或存储器,立即数不能作为目的操作数,且两者不能同时为存储器操作数。第33页/共289页图4.10 传送指令传送方向示意图第34页/共289页MOV CL,05H ;立即数向通用寄存器传送MOV BX,2008H;立即数向存储器单元传送MOV SI,BP ;通用寄存器之间传送MOV DS,AX ;通用寄存器向段

16、寄存器传送MOV BX,ES ;段寄存器向通用寄存器传送MOV DS,SI+BX ;存储单元向段寄存器传送MOV BP,ES ;段寄存器向存储单元传送MOV AX,2008H;存储单元向通用寄存器传送MOV 1234H,BX;通用寄存器向存储单元传送第35页/共289页使用MOV指令应注意:(1)立即数只能作为源操作数。(2)CS只能作为源操作数,不能作为目的操作数。(3)CPU中的寄存器除IP外都可通过MOV指令访问。(4)立即数不能直接传送到段寄存器,但可通过其他寄存器或堆栈传送。(5)段寄存器之间不能直接传送。(6)两个存储单元之间不能直接传送。第36页/共289页【例4.1】将存储单元

17、3000H的内容送至4000H单元。MOV AX,3000H MOV 4000H,AX【例4.2】将累加器AX与寄存器CX中的内容对调。MOV BX,AX MOV AX,CX MOV CX,BX【例4.3】判断指令正误。MOV CS,AX 错 MOV AX,CS 对 MOV SS,SP 对 MOV AX,ES 对 MOV DS,CS 错 MOV AX,BL 错第37页/共289页2)堆栈操作指令 在介绍堆栈操作指令之前,首先解释什么是堆栈以及为什么要用堆栈。在微机中,堆栈实质上就是一个按照后进先出(Last-in,First-out)原则组织的一段内存区域。堆栈的构造如图4.13所示。第38页

18、/共289页图4.11 子程序调用示意图 图4.12 子程序嵌套示意图第39页/共289页图4.13 堆栈示意图第40页/共289页 堆栈的一端是固定的,另一端是浮动的。堆栈的固定端是堆栈的底部,称为栈底。堆栈的浮动端可以推入或弹出数据。向堆栈推入数据时,堆放在堆栈顶部,称为栈顶。从堆栈弹出数据时,栈顶的数据最先弹出,而最先推入的数据则最后弹出。为了指示现在堆栈中存放数据的位置,通常设置一个堆栈指针SP,它始终指向堆栈的顶部。当一个字节的数据被推入堆栈时,SP自动减1,向上浮动而指向新的栈顶;当一个字节的数据被弹出堆栈时,SP自动加1,向下浮动而指向新的栈顶。第41页/共289页 在8086系

19、统中,建立堆栈就是规定堆栈底部在存储器中的位置,用户可以通过数据传送指令将堆栈底部的地址设置在堆栈指针SP和堆栈段寄存器SS中,这时,栈中无数据,堆栈顶部与底部重叠,是一个空栈。例如:MOV AX,2000H MOV SS,AX;初始化SS段寄存器 MOV SP,56H;初始化SP指针第42页/共289页(1)入栈指令(Push Word onto Stack)指令格式:PUSH SRC 指令功能:PUSH指令将16位的源操作数推入堆栈,先存入高字节,再存入低字节,而目标地址为SP指向的栈顶单元,源操作数可以是寄存器、段寄存器或存储器。例如:PUSH AX 其执行过程如图4.14所示。第43页

20、/共289页 入栈操作分两步:第一步先将堆栈指示器的内容减1,即栈顶向低地址方向移动一个单元,指向新的栈顶,然后把高字节推入堆栈指示器所指向的栈顶单元,即 SP(SP)1;(SP)AH中的高字节数据 第二步,将堆栈指示器的内容再减1,然后把低字节数据推入当前的栈顶单元,即 SP(SP)1;(SP)AL中的低字节数据第44页/共289页(2)出栈指令(Pop Word off Stack)指令格式:POP DST 指令功能:POP指令将SP指示的栈顶两字节数据传送给目的操作数DST,目的操作数可以是寄存器、段寄存器或存储器。例如:POP AX 其执行过程如图4.15所示。出栈的操作顺序与入栈相反

21、,第一步 AL(SP);SP(SP)+1第二步 AH(SP);SP(SP)+1 第45页/共289页图4.14 入栈示意图 图4.15 出栈示意图 第46页/共289页注意:PUSH和POP指令只能是字操作(16位的操作数),入栈或出栈一个字数据后,SP的修改必须是加2或减2。PUSH和POP指令不能使用立即数方式。POP指令的操作数不允许是CS寄存器。PUSH和POP指令都不影响标志位。PUSH和POP指令互为逆操作,在编程中应使两条指令成对使用,已达到“栈 平衡”。第47页/共289页【例4.4】将AX、BX寄存器的内容分别传送给CX、DX寄存器。PUSH AX ;AX入栈 PUSH BX

22、 ;BX入栈 POP DX ;将后入栈的BX内容弹出到DX寄存器 POP CX ;将先入栈的AX内容弹出到CX寄存器第48页/共289页【例4.5】假设(DX)=052CH,(AX)=6789H,(SS)=3000H,试分析顺序执行以下3条指令的结果。MOV SP,123DH PUSH AX PUSH DX 执行第一条指令后,(SP)=123DH;执行第二条指令后,(3123CH)=67H,(3123BH)=89H;执行第三条指令后,(3123AH)=05H,(31239H)=2CH。第49页/共289页3)交换指令(Exchange)指令格式:XCHG DST,SRC 指令功能:将两个操作数

23、进行字节或字数据的相互交换,即(DST)(SRC)。操作数既可以是通用寄存器,也可以是存储单元,但不能同时为存储器单元。使用交换指令时应注意:(1)不允许使用段寄存器。(2)不影响标志位。第50页/共289页图4.16 交换指令传送方向示意图第51页/共289页 XCHG AX,BX;(AX)(BX)XCHG AH,BL;(AH)(BL)XCHG CX,DI;(CX)(DI)【例4.7】假设(AX)=5566H,(BX)=0F23H,(SI)=0010H,(DS)=1000H,(10F33H)=2002H,写出下列指令执行的结果。XCHG AH,AL;执行前(AH)=55H,(AL)=66H;

24、执行后(AH)=66H,(AL)=55HXCHG AX,BX+SI ;执行前(AX)=5566H,;(10F33H)=2002H;执行后(AX)=2002H,(10F33H)=5566H第52页/共289页2.累加器专用传送指令 累加器(AC)专用传送指令包括I/O数据传送指令IN/OUT和字节转换指令XLAT,I/O数据传送指令用于完成累加器AL/AX与I/O端口(Port)之间的传送数据。在8086指令系统中,I/O数据传送指令对I/O端口的寻址可以采用直接与间接两种方式;字节转换指令XLAT用于完成存储器中一个字节的编码转换。第53页/共289页1)输入指令(Input Byte or

25、Word)指令格式:IN AC,Port IN AC,DX 指令功能:将指定端口中的内容传送到累加器AX/AL中,可以是直接寻址或间接寻址,可以是字节操作或字操作。例如:IN AL,20H ;AL端口20H的内容 IN AX,80H ;AX端口80H的内容 IN AL,DX ;AL端口(DX)的内容 IN AX,DX ;AX端口(DX)的内容第54页/共289页2)输出指令(Out Byte or Word)指令格式:OUT Port,AC OUT DX,AC 指令功能:将累加器AX/AL中的内容传送到指定端口中,可以是直接寻址或间接寻址,可以是字节操作或字操作。例如:OUT 30H,AL ;

26、端口30H(AL)OUT 30H,AX ;端口30H(AX)OUT DX,AL ;端口(DX)(AL)OUT DX,AX ;端口(DX)(AX)第55页/共289页注意:(1)只限于在AL/AX与I/O端口之间的传送信息。(2)I/O端口间接寻址时只能使用DX寄存器。(3)不影响标志位。第56页/共289页3)字节转换指令(Translate)指令格式:XLAT指令功能:隐含操作数AL,指令将EA=(BX)+(AL)对应的单元中字节送入AL,从而实现代码转换,即AL(BX)+(AL)。(1)建立代码转换表(最大容量为256B),将表首地址的偏移量置入BX。(2)将待转换的十进制数在表中的序号送

27、入AL,该值实际上是与表首地址之间的位移量。(3)执行XLAT第57页/共289页注意:字节表格长度不能超过256。表中元素的序号(索引值)从零开始计数。为提高程序的可读性,字节转换指令还可写成XLAT Table的形式,其中Table为字节表格的首地址,由于字节表格的首地址事先已经存入BX寄存器,所以在指令中可有可无。指令不影响标志位。第58页/共289页【例4.8】存储器数据段中有一张16进制的ASCII码表,其首地址为Hex-table,现想查出第10个元素,并将结果送入AL中。MOV BX,OFFSET Hex-table;BX表首地址MOV AL,0AH ;AL待查元素序号XLAT

28、Hex-table ;查表转换上述指令后,“A”的ASCII码存放到AL中,即 (AL)=41H第59页/共289页图4.17 例4.8图第60页/共289页3.地址传送指令(Address-Object Transfer)可传送操作数的段地址或偏移地址到指定寄存器,包含LEA、LDS和LES这3条指令。1)有效地址装入指令(Load Effective Address)指令格式:LEA DST,SRC 指令功能:把源操作数SRC(存储器操作数)的16位偏移地址(即有效地址),传送到一个指定的16位通用寄存器中。这条指令常用来建立串操作指令所需要的寄存器指针。第61页/共289页【例4.9】L

29、EA BX,SI+0500H 假设(DS)=3000H,(SI)=0100H,上述指令的执行过程如图4.18所示。执行结果为(BX)=0600H。注意:LEA指令与MOV指令的区别。若指令改为 MOV BX,SI+0500H 则指令的执行结果为(BX)=1234H。若指令改为 MOV BX,OFFSET SI+0500H其中OFFSET SI+0500H表示存储单元的有效地址。第62页/共289页图4.18 LEA指令执行过程 第63页/共289页2)地址指针装入DS指令(Load Pointer Using DS)指令格式:LDS DST,SRC 指令功能:传送32位地址指针的指令,功能是从

30、源操作数SRC所指定的存储单元开始,在4个连续的存储单元中取出一个32位地址指针,其中包括一个偏移地址(前两个字节)和一个段地址(后两个字节),前者送入指令中指定的寄存器,后者送入数据段寄存器DS。【例4.10】LDS SI,0010H 假设原来(DS)=F000H,(F0010H)=60H,(F0011H)=01H,(F0012H)=00H,(F0013H)=20H第64页/共289页图4.19 LDS指令执行过程第65页/共289页3)地址指针装入ES指令(Load Pointer Using ES)指令格式:LES DST,SRC 指令功能:与LDS指令类似,其功能是从源操作数SRC所指

31、定的存储单元开始,取出一个32位地址指针,前者送指定的寄存器,后者送入附加数据段寄存器ES。【例4.11】LES DI,BX 假设原来(DS)=A000H,(BX)=0456H,(A0456H)=34H,(A0457H)=12H,(A0458H)=78H,(A0459H)=56H,指令执行过程类似图4.19,指令执行后,(DI)=1234H,(ES)=5678H。第66页/共289页注意:(1)指令中的目标操作数不能是段寄存器。(2)指令中的源操作数必须使用存储器寻址方式。(3)指令不影响标志位。(4)地址传送指令常用于串操作时建立初始地址指针。第67页/共289页4.标志寄存器传送(Flag

32、 Register Transfer)这组指令共有4条。用于完成和标志位有关的操作,指令中隐含操作数分别是AH和FLAGS寄存器。1)取标志指令(Load AH from Flags)指令格式:LAHF 指令功能:该指令将FLAGS中的5个状态标志位SF、ZF、AF、PF以及CF分别取出,并传送到累加器AH的对应位。LAHF指令对标志位无影响。第68页/共289页图4.20 LAHF指令操作示意图第69页/共289页2)置标志指令(Stroe AH into Flags)指令格式:SAHF 指令功能:SAHF指令将AH寄存器中的第7、6、4、2、0位分别传送到FLAGS的对应位。SAHF指令将

33、影响标志位。【例4.12】若要求将SF取反,可用以下程序实现。LAHF ;取标志位送至AH XOR AH,80H ;AH最高位取反 SAHF ;置标志位,使SF取反第70页/共289页3)标志入栈指令(Push Flags onto Stack)指令格式:PUSHF 指令功能:(SP)(SP)2,(SP)(FLAGSL),(SP)+1)(FLAGSH),指令的操作不影响标志位。第71页/共289页4)标志弹出堆栈指令(Pop Flags off Stack)指令格式:POPF 指令功能:(FLAGSL)(SP),(FLAGSH)(SP)+1),(SP)(SP)+2,POPF指令对标志位有影响。

34、PUSHF和POPF指令常用于调用子程序时保护和恢复状态标志位。第72页/共289页【例4.13】若要将TF清零,可用下面程序实现。PUSHF ;将FLAGS寄存器的内容压入堆栈POP AX ;出栈操作将FLAGS寄存器的内容送入累加器AXAND AH,0FEH ;将AH的最低位(对应TF位)清零PUSH AX ;将AX的内容压入堆栈POPF ;标志弹出堆栈,实现TF值的修改第73页/共289页4.2.2 算术运算指令p无符号的二进制数。可以是8位或16位p带符号的二进制数。用补码表示。p无符号的压缩十进制数(压缩型BCD码)。每个字节存放两位数,即两位BCD码。p无符号的非压缩十进制数(非压

35、缩型BCD码)。每个字节只存放一位数,且存放在低4位,而高4位在进行乘除法运算时必须全为0,加减法运算时可以为任意值。p除了压缩十进制数只有加、减法操作外,其余3种都可以进行加、减、乘、除法运算。第74页/共289页1.加法指令(Addition)包括二进制加法指令、带进位加法指令、加1指令和十进制的加法调整指令。1)二进制加法指令(Binary Addition)指令格式:ADD DST,SRC 指令功能:DST(DST)+(SRC)。目标操作数可以是寄存器或存储器,源操作数可以是立即数、寄存器或存储器,但不能同为存储器。不能对段寄存器进行加法运算。可以是8位或16位相加,但目标操作数与源操

36、作数必须等长。第75页/共289页ADD AL,80H ;寄存器操作数加立即数ADD BX,SI ;寄存器操作数加寄存器操作数ADD AX,1200H;寄存器操作数加存储器操作数ADD DI,BL ;存储器操作数加寄存器操作数ADD BX+disp,08H ;存储器操作数加立即数 加法指令将会影响标志寄存器FLAGS中的CF、PF、AF、ZF、SF和OF。第76页/共289页使用加法指令时要注意,对于带符号数如果字节相加的和超出128+127,或者字相加的和超过32768+32767,则发生溢出,这时OF标志位置1,异号数相加是不会发生溢出的,而同号数相加则可能发生溢出,此时,相加的运算结果将

37、是错误的。而对于无符号数,若字节加法运算的结果超出255,或字加法运算的结果超过65535,则最高位要产生进位,即CF位置为1。第77页/共289页【例4.14】计算带符号数59H与6AH相加的和。MOV AL,59H MOV BL,6AH ADD AL,BL 指令执行完后,(AL)=C3H,SF=1,ZF=0,AF=1,PF=1,CF=0,OF=1。其中OF=1表示发生了溢出,显然相加结果(195)超过了127,这样的结果是错误的,因为59H、6AH均为正数,而相加结果C3H却为负数。第78页/共289页 若将上述运算改为字操作,则可以避免溢出的发生。MOV AX,0059H MOV BX,

38、006AH ADD AX,BX 指令执行完后,(AX)=00C3H,SF=0,ZF=0,PF=1,CF=0,OF=0。此时没有发生溢出,结果正确。第79页/共289页2)带进位加法指令(Addition with Carry)指令格式:ADC DST,SRC 指令功能:DST(DST)+(SRC)+(CF)。目标操作数与源操作数的规定与ADD指令相同,而且操作对象可以是8位和16位。ADC指令对标志寄存器的影响同ADD指令。带进位加法指令主要用于多字节的加法运算,如果低字节相加时产生进位,则在下一次高字节相加时应将进位标志位加上。第80页/共289页【例4.15】计算56AB7809H+239

39、05DF2H=?假设被加数和加数分别存放在以DADA1和DATA2为首地址的存储区,相加结果存放在以DATA3为首地址的存储区。如图4.21所示。可用以下程序段实现相加。第81页/共289页图4.21 例4.15被加数与加数的存放第82页/共289页MOV AX,DATA1 ;低16位的被加数送累加器AXADD AX,DATA2 ;低16位的被加数与低16位的加数 相加MOV DATA3,AX;低16位相加的和送存MOV AX,DATA1+2;高16位的被加数送累加器AXADC AX,DATA2+2;高16位的被加数与高16位的加数相加MOV DATA3+2,AX;高16位相加的和送存相加的结

40、果为7A3BD5FBH。第83页/共289页3)加1指令(Increment by 1)指令格式:INC DST 指令功能:DST(DST)+1。操作数DST可以是寄存器或存储器,但不能是段寄存器。可以进行字节操作或字操作。例如:INC AL;8位寄存器加1 INC BX;16位寄存器加1 INC BYTE PTRDI ;存储器加1,字节操作 INC WORD PTRSI ;存储器加1,字操作第84页/共289页 指令中的BYTE PTR和 WORD PTR分别指定随后的存储器操作数的类型是字节还是字。注意:(1)操作数不能为立即数。(2)指令操作对SF、ZF、AF、PF和OF有影响,但对于C

41、F无影响。(3)INC指令常常用于循环程序中修改地址。第85页/共289页4)非压缩BCD码加法调整指令(ASCII Adjust for Addition)指令格式:AAA 指令功能:隐含累加器操作数AL和AH,功能是对在AL中的两个非压缩的十进制操作数相加后的结果进行调整,产生一个非压缩的和。两个非压缩的十进制数可以直接用ADD指令或ADC指令相加,然后使用一条AAA指令进行调整。调整的操作为第86页/共289页若(AL)&(0FH)9,或(AF)=1则AL(AL)+6AH(AH)+1AF1CF(AF)AL(AL)&0FH)否则AL(AL)&0FH)调整后,非压缩BCD码结果的低位在AL中

42、,高位在AH中。第87页/共289页【例4.16】求两个十进制数的和8+9=?MOV AX,0008H;(AL)=08H,(AH)=00H MOV BL,09H;(BL)=09H ADD AL,BL;(AL)=11H AAA;(AL)=07H,(AH)=01H,;(CF)=(AF)=1运行结果以不压缩BCD码形式存放。注意,指令将影响标志位AF和CF,而不影响标志位SF、ZF、PF和OF。第88页/共289页5)压缩BCD码加法调整指令(Decimal Adjust for Addition)指令格式:DAA 指令功能:隐含累加器操作数AL,其功能是对在AL中两个压缩的十进制操作数相加的结果进

43、行调整,产生一个正确的压缩的十进制和。对于两个压缩的十进制数可以直接用ADD指令或ADC指令相加,然后使用一条DAA指令进行调整。调整的操作为若(AL)&(0FH)9,或(AF)=1则AL(AL)+6AF1若(AL)9FH,或(CF)=1则AL(AL)+60HCF1第89页/共289页【例4.17】求两个十进制数的和62+57=?先将62和57以压缩BCD码形式分别存放,然后相加,再进行调整。相应的程序段如下:MOV AL,62H;(AL)=62HMOV BL,57H;(BL)=57HADD AL,BL;(AL)=B9HDAA;(AL)=19H,(CF)=1运行结果为19,且以压缩BCD码形式

44、存放在AL中,进位标志位CF置位。DAA指令对标志位SF、ZF、AF、PF、CF和OF有影响。第90页/共289页2.减法指令(Subtraction)减法指令包括二进制的减法指令、带借位减法指令、减1指令、求补指令、比较指令和十进制的减法调整指令。1)二进制减法指令(Binary Subtraction)指令格式:SUB DST,SRC 指令功能:DST(DST)(SRC)。操作数的类型与加法指令相同,例如:第91页/共289页SUB AL,18H ;寄存器操作数减立即数SUB BX,SI ;寄存器操作数减寄存器操作数SUB AX,0200H ;寄存器操作数减存储器操作数SUB SI,BL

45、;存储器操作数减寄存器操作数SUB BP+disp,0FH ;存储器操作数减立即数 减法指令将会影响标志位CF、PF、AF、ZF、SF和OF。第92页/共289页2)带借位减法指令(Subtraction with Borrow)指令格式:SBB DST,SRC 指令功能:DST(DST)(SRC)(CF)。目标操作数与源操作数的规定与SUB指令相同,可以进行8位或16位的操作。带借位减法指令SBB对标志寄存器的影响与SUB指令相同,且主要用于多字节的减法。第93页/共289页3)减1指令(Decrement by 1)指令格式:DEC DST 指令功能:DST(DST)1。操作数的类型与IN

46、C指令相同。例如:DEC BH;8位寄存器加1DEC CX;16位寄存器加1DEC BYTE PTR BP;存储器加1,字节操作DEC WORD PTR BX;存储器加1,字操作第94页/共289页注意:(1)同INC指令一样,操作数不能为立即数。(2)DEC指令对SF、ZF、AF、PF和OF有影响,但对于CF无影响。(3)DEC指令常常用于在循环程序中修改循环次数。第95页/共289页4)求补指令(Negate)指令格式:NEG DST 指令功能:DST0(DST)。操作数的类型可以是寄存器或存储器,可以对8位或16位数求补。NEG AH;8位寄存器求补NEG BX;16位寄存器求补NEG

47、BYTE PTR BXDI;8位存储器求补NEG WORD PTR SI+0200H;16位存储器求补 求补指令对标志位SF、ZF、AF、PF、CF和OF有影响,且一般总使CF=1。第96页/共289页注意:(1)求补指令不同于补码的求法,若DST为正数,求补后可得绝对值相等的负数(补码);若DST为负数(补码),求补可得绝对值相等的正数。(2)求补指令可以得到负数的绝对值。(3)当操作数为128或32768时,执行NEG指令后,结果不变,但会产生溢出,OF=1。【例4.18】已知BL=01H,执行NEG BL 后,BL=?BL=01H=00000001B=+1,执行NEG BL后,BL=FF

48、H【例4.19】已知AL=FFH,执行NEG AL 后,AL=?AL=FFH=11111111B=1,执行NEG AL后,AL=01H 第97页/共289页【例4.20】存储器数据段存放了100个带符号数,其首地址为AREA,要求将各数据取绝对值后再送存原来的存储单元。LEA SI,AREA;SI源地址MOV CX,100;CX循环次数CHECK:OV AL,SI;取一个带符号数送ALOR AL,AL;AL内容不变,但影响标志位JNS NEXT;若SF=0,则转向NEXTNEG AL;否则求补MOV SI,AL;负数求补后送回NEXT:NC SI;源地址加1DEC CX;循环次数减1JNZ C

49、HECK;循环次数不为0,转向CHECKHLT;停止第98页/共289页第99页/共289页5)比较指令(Compare)指令格式:CMP DST,SRC 指令功能:(DST)(SRC),执行指令后,两个操作数的内容均不变,而比较结果仅仅反映在标志位上。目标操作数可以是寄存器或存储器,源操作数可以是立即数、寄存器或存储器,可以进行字节或字比较。CMP AL,09H ;寄存器操作数与立即数比较CMP AX,SI ;寄存器操作数与寄存器操作数比较CMP BX,1000H;寄存器操作数与存储器操作数比较CMP SI+10,BL ;存储器操作数与寄存器操作数比较CMP BP,8FH ;存储器操作数与立

50、即数比较第100页/共289页 比较指令对标志位SF、ZF、AF、PF、CF和OF有影响。利用ZF位来判断两个数是否相等,若两个数相等,则ZF=1;否则ZF=0。当两个数A和B均为无符号数时,可以用进位(借位)标志CF来判断数的大小,若AB没有产生借位,即CF=0,则AB;相反,若AB产生借位,即CF=1,则AB。第101页/共289页 当两个数A和B均为带符号数时。(1)A和B同号时,AB不会产生溢出,可以用符号标志位SF来判断数的大小。若(AB)为正数,即SF=0,则AB;相反,若(AB)为负数,即SF=1,则AB。(2)A和B异号时,AB可能会产生溢出,必须同时考虑溢出标志OF的状态。当

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > PPT文档

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁