微机原理第3章-指令系统.ppt

上传人:牧羊曲112 文档编号:6284484 上传时间:2023-10-13 格式:PPT 页数:239 大小:2.28MB
返回 下载 相关 举报
微机原理第3章-指令系统.ppt_第1页
第1页 / 共239页
微机原理第3章-指令系统.ppt_第2页
第2页 / 共239页
微机原理第3章-指令系统.ppt_第3页
第3页 / 共239页
微机原理第3章-指令系统.ppt_第4页
第4页 / 共239页
微机原理第3章-指令系统.ppt_第5页
第5页 / 共239页
点击查看更多>>
资源描述

《微机原理第3章-指令系统.ppt》由会员分享,可在线阅读,更多相关《微机原理第3章-指令系统.ppt(239页珍藏版)》请在三一办公上搜索。

1、及,秦红磊 金天,微机原理,接口技术,第三章 微处理器指令系统(Instruction Set),第一节:指令的基本格式第二节:8086的寻址方式第三节:8086的指令系统第四节:其它微处理器的指令扩展第五节:中断指令和DOS系统功能调用,指令系统是计算机硬件和软件之间的桥梁,是汇编语言设计的基础。,操作码 操作数,汇编指令:,操作码:指令操作类型;操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。例:MOV AX,CX;将CX的内容送入AX中。,微机算机处理器的指令由几十种或上百种组成,每种指令由两个字段(Field)构成:,第一节 指令的基

2、本格式,第二节 8086的寻址方式,8086的寻址方式是指寻得操作数来源得方式,有以下几种:1.立即数寻址(Immediate Addressing)2.寄存器寻址(Register Addressing)3.直接寻址(Direct Addressing)4.间接寻址(Indirect Addressing),存储器寻址,由指令字节给出的信息求出操作数的地址称为有效地址EA(Efficient)寻找(得到)操作数有效地址的方法称为操作 数的寻址方法 寻找(得到)操作数有效地址和存取操作数的过程称为指令的寻址操作,指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中。立即数有8位和

3、16位。例:MOV AL,05H;源操作数为立即寻址 指令执行后,AL=05H,8位数据05H存入AL寄存器。例:MOV AX,3064H;源操作数为立即寻址 指令执行后,AX=3064H,16位数据3064H存入AX寄 存器。,1.立即数寻址(Immediate Addressing),立即数寻址、寄存器寻址的操作数,不用在取完指令后再到内存中取数。寻址方式。其它寻址方式 操作数存放在内存中,取完指令后,还需到内存取数,指令中给出的是该操作数的地址,包括段地址和偏移地址。,CPU 总线 内存,寄存器寻址方式的操作数是寄存器的值,指令中直接使用寄存器名,包括8位或16位通用寄存器和段寄存器。可

4、使用的16位寄存器:AX、BX、CX、DX、SI、DI、SP、BP;其中:AX、BX、CX、DX可分成两8位使用。例:MOV AX,CX;(AX)(CX)INC CX;(CX)(CX)1,2.寄存器寻址(Register Addressing),直接寻址方式的操作数的形式为:Variable或Variable在直接寻址方式中,操作数的偏移地址(有效地址EA)直接用指令加以指定(有直接地址值和标号两种形式)。它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。段地址隐含的由DS 指定,也可以ES指定,但需在指令中指明

5、。最后存储器地址为:DS:偏移地址 或 ES:偏移地址。例:MOV AX,ES:2000H 将ES:2000H单元内容送入AX。例:MOV AX,LABLE 或 MOV AX,LABEL 将标号为LABLE(存放操作数单元的符号地址),即 DS:LABLE中的内容送入AX。,3.直接寻址(Direct Addressing),例:MOV AX,1000 H 若(DS)=2000H 内存操作数的物理地址为:PA=(DS)10H+EA=2000H 10H+1000H=21000H 执行后(AX)=3040H,思考:指令 MOV AX,1000H 与MOV AX,1000H有什么不同?,4.间接寻址

6、(Indirect Addressing),按给出偏移地址方式的不同,分为以下5种:寄存器间接寻址 MOV AL,BX 寄存器相对寻址 MOV AL,BX+10H 基址加变址寄存器 MOV AL,BX+SI 相对基址加变址寄存器 MOV AL,BX+SI+10H,(1)寄存器间接寻址 寄存器间接寻址方式的操作数形式为:reg 操作数的有效地址包含在基址寄存器BX,基址指针BP或一 个变址寄存器(SI或DI)中。寄存器间接寻址要用方括号括起来,以便与寄存器操作数相区别。例:MOV AX,BX;将由BX决定的存储单元的内容送到AX寄存器。,0000,0001,0002,0003,CC,AA,TAB

7、:,AH AL,AA BB,数据段,0002,BX,BB,使用BX、SI、DI的寄存器寻址,默认段寄存器为DS,例:MOV AX,DI 若(DS)=3000H(DI)=2000H 则内存操作数的物理地址为:PA=(DS)10H+(DI)=32000H 执行后(AX)=(32000H)=400BH,思考:指令 MOV AX,DI 与MOV AX,DI有什么不同?,用 SI、DI、BX、BP作为间接寻址允许段跨越 指令中可以指定段跨越前缀来取得其他段中的数据。例:MOV ES:DI,AX MOV DX,DS:BP这种寻址方法可以用于表格处理。,(2)寄存器相对寻址方式 操作数在存储器内,指令中寄存

8、器内容与指令指定的位移量(DISP)之和作为操作数所在单元的有效地址。(BX)DISP8(SI)(DI)(BP)DISP16,有效地址=,段寄存器为DS,段寄存器为SS,+,物理地址=(DS)*16+(BX)+DISP8(SI)、(DI)、DISP16类同。物理地址=(SS)*16+(BP)+DISP16,操作数 有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量(displacement)之和。可 用的寄存器有 BX、DI、SI、BP,与寄存器间接寻址相同 如:MOV AL,BX+10H MOV AH,DI+20H MOV DL,30H SI MOV DH,40H BP,例

9、:MOV AX,BX+30H 若(DS)=2000H(BX)=1000H 则内存操作数的物理地址为:PA=(DS)10H+(BX)+30H=21030H 指令执行后:(AX)=(21030H)=8976H,(3)基址变址寻址方式:操作数在存储器中,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)内容之和作为操作数所在存储单元的有效地址。,(BX)(SI)(BP)(DI),EA=,+,PA=(DS)*16+(BX)+(SI)或(DI)PA=(SS)*16+(BP)+(SI)或(DI)例:MOV AX,BX+DI 或 MOV AX,BXDI DS:(BX)+(DI)字存储单元内容送AX。例

10、:MOV AX,BP+SI 或 MOV AX,BPSI SS:(BP)+(SI)字存储单元内容送AX。,默认段寄存器由基址寄存器决定,允许段跨越。基址寄存器为BX,默认段寄存器为DS(SI)PA=(DS)10H+(BX)+(DI)基址寄存器为BP,默认段寄存器为SS(SI)PA=(SS)10H+(BP)+(DI),使用BX的基址加变址寻址,默认段寄存器为DS,例:MOV AX,BX+SI 若(DS)=4000H(BX)=2000H(SI)=100H 则内存操作数的物理地址为:PA=(DS)10H+(BX)+(SI)=42100H 指令执行后(AX)=(42100H)=2345H,(4)相对基址

11、变址寻址方式 操作数在存储器内,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)的内容之和再加上位移量(8位或16位),得到操作数所在单元的有效地址。(BX)(SI)DISP8(BP)(DI)DISP16,有效地址=,+,+,例:MOV AX,BX+SI+10H 若(DS)=4000H(BX)=3000H(SI)=200H 则内存操作数的物理地址为:PA=(DS)10H+(BX)+(SI)+10H=43210H 指令执行后(AX)=(43210H)=8877H,第三节 8086的指令系统,8086的指令系统包含133条基本指令,这些指令功能可以分为6类:1.数据传送指令(Data tr

12、ansfer)2.算术运算指令(Arithmetic)3.逻辑指令与移位指令(Logic&Shift)4.控制转移指令(Control transfer)5.处理机控制指令(Processor Control)6.串操作指令(String manipulation),一.数据传送指令 数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储单元中。,寄存器,存储器,I/O端口,按传送内容,可分为四类:,1。通用数据传送 MOV,PUSH,POP,XCHG2.累加器专用传送 IN,OUT,XLAT 3.地址传送 LEA,LDS,LES4.标志传送 PUSHF,PO

13、PF,LAHF,SAHF,特点:1.除POPF、SAHF外,其他传送指令对标志位均无影响 2.唯一允许以段寄存器做操作数的指令 且只有MOV、PUSH、POP这三条允许,1.通用传送指令 MOV、PUSH、POP、XCHG,(1)MOV传送指令 格式 MOV dst,src 执行(dst)(src),例:reg/mem/segreg reg 通用寄存器/存储器/段寄存器通用寄存器 MOV AL,BL MOV BX,AL MOV DS,AX reg/segreg mem 通用寄存器/段寄存器 存储器 MOV AL,BX MOV DS,BX+SI reg/mem segreg 通用寄存器/存储器

14、段寄存器 MOV BX,CS MOV BX,DS reg/mem data 通用寄存器/存储器 立即数 MOV Al,9 MOV BX,OFFSET buffer MOV BYTE PTR value,0 MOV WORD PTR BX,1,MOV指令特点及注意事项:双操作数指令(注意双操作指令的特点)可进行字节或字传送 不允许存储器传送到存储器MOV BX,value MOV DI,SI MOV AX,value MOV BX,AXMOV AL,SI MOV DI,AL,MOV指令应用例:实现将AREA1开始的100个数据传送到AREA2开始的单元。,AREA1:,AREA2:,100个数据

15、,分析题意:可以用200条MOV指令来完成100个数据传送,指令操作重复,每个数据传送后的地址是变化的。可以利用循环,但每循环一次要修改地址(源地址和目的地址),必须把地址放在寄存器当中,用寄存器间接寻址来寻找操作数.,得到如下程序:MOV SI,OFFSET AREA1 MOV DI,OFFSET AREA2 MOV CX,100AGAIN:MOV AL,SIMOV DI,AL INC SI;修改地址指针 INC DI;修改地址指针 DEC CX;修改个数 JNZ AGAIN,(2)PUSH(Push word onto stack)POP(Pop word off stack)这是两条堆栈

16、操作指令。1)先介绍一下什么是堆栈,为什么需要堆栈 堆栈是按照先进后出原则组织的一段内存区域。通常用于存放一些重要数据,如:程序的地址、或是需要恢复的数据。为方便数据的存放和恢复,设置专门的指针,指向堆栈中要操作的单元。段值由 SS 给出,偏移地址由 SP 给出 SS 堆栈段寄存器(stack segment)SP 堆栈指针寄存器(stack point),SS:SP,特点:下推式的(规定堆栈设置在堆栈段内)改变SP的内容,随着推入堆栈内容增加,SP的值减少。先进后出工作原则(Last In First Out 简称LIFO)堆栈在内存中的情况:,堆栈在内存中的情况:可以用一条立即数传送指令给

17、SP赋值,确定SP在SS段中的初始位置。例:设:(SS)=9000H,堆栈段为64KB MOV SP,0E200H;(SP)=0E200H则:整个堆栈段的物理地址范围为:90000H9FFFFH 栈顶的物理地址为:9E200H堆栈在内存中的情况如右图所示:,堆栈在内存中的情况,2)堆栈操作指令(堆栈操作指令有两条):入栈指令格式:PUSH src;(SP)(SP)-2(SP)+1,(SP)(src)把一个字从源操作数(src)由SP指向堆栈顶部。出栈指令格式:POP dest;(dest)(SP)+1,(SP)(SP)(SP)+2把现行SP所指向堆栈顶部的一个字 指定的目的操作数(dest),

18、同时进行修改堆栈指针的操作。,SS:SP,SS:SP,(dst),PUSH 入栈操作格式 PUSH src 执行(SP)(SP)-2(SS:SP)(src),特点:单操作数指令 操作数为16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:CS,DS,ES,SSmem:字类型,例:PUSH AX,不变 减2 变不变,特点:单操作数指令操作数为16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:DS,ES,SS,不允许是CSmem:字类型,POP出

19、栈操作,SS:SP,SS:SP,(dst),格式 POP dst 执行(dst)(SS:SP)(SP)(SP)+2,例:POP BX,不变 加2 变 变,堆栈使用的场合 用堆栈保存恢复信息 子程序的调用、返回以及中断调用、返回 用堆栈传送数据(程序设计中介绍),主程序 子程序:子程序:在一个实际程序中,有些操作要执行多次,把要重 复执行(subroutine)操作编为子程序。也常把一些常用的操作标准化、通用化的子程序。主程序(Main program)往往要调用子程序 或处理中断,暂停主程序,执行子程序或中断服务程序。,调用子程序时需保留内容:调用子程序:将CALL下条指令地址即IP值保留下来

20、(8088中码段寄存器CS和指令指针IP),才能保证子程序执行完后准确返回主程序继续执行。执行子程序时,通常用到内部寄存器,执行结果会影响标志位,必须在调用子程序之前将现状保护起来。子程序嵌套或子程序递归(自调自)保留许多信息,而且保证正确返回(且后进先出)。后保留先取出原则(即LIFO-LAST In First out)。,注意:SP堆栈指针,始终指向栈顶。SP初值用MOV SP,data来设定。下边详细说明一下堆栈用途:,存放CPU寄存器或存储器中暂时不使用的数据,使用数据时将其弹出:PUSH AX;将(AX)入栈,(AX),(AX),使用数据时将其弹出:POP BX,调用子程序(或过程

21、)或发生中断时要保护断点的地址,子程序或中断返回时恢复断点。,子程序嵌套,断点地址压入和弹出情况,自学堆栈应用:比较下边两个程序运行结果?,例:用BP的基址指令 代替POP指令MOV BP,SPPUSH AXPUSH BXPUSH CXMOV CX,BP-6 MOV BX,BP-4MOV AX,BP-2ADD SP,6,例:压入堆栈的内容与弹出内容顺序相反PUSH AXPUSH BXPUSH CXPOP CXPOP BX POP AX,(3)XCHG交换指令 格式 XCHG oprd1,oprd2 执行(oprd1)(oprd2),reg regreg memmem reg,可实现,例 XCH

22、G AX,BX 字操作 执行前(AX)=1122H(BX)=3344H 执行后(AX)=3344H(BX)=1122H 例 XCHG AH,BL 字节操作 执行前(AX)=1122H(BX)=3344H 执行后(AX)=4422H(BX)=3311H,XCHG oprd1,oprd2 注意事项:双操作数指令可进行字或字节操作,不影响标志位。不允许对立即数、段寄存器做操作数 XCHG AX,4 XCHG BX,DS 存储器之间不能交换,两个操作数中必须有一个在寄存器中;XCHG BX,DI(错),(1)输入输出指令(Input and Output)输入输出指令共两种:IN(Input byte

23、 or word)OUT(Output byte or word)输入指令用于CPU从外设端口接受数据,输出指令用于CPU向外设端口发送数据。无论接受还是发送数据,必须通过累加器AX(字)或AL(字节),又称累加器专用传送指令。输入、输出指令不影响标志位。,2.累加器专用传送指令,每个外设要占几个端口:数据口,状态口和控制口。,由图可见:信息交换要通过端口:在IBMPC机里,可以配接许多外部设备,每个外设与CPU之间交换数据,状态信息和控制命令,每一种信息交换都要通过一个端口来进行。端口数:外部设备最多有65536个I/O端口。A0A15译码形成。端口号:端口号(即外设端口地址)为0000HF

24、FFFH。PC机端口数:仅使用A0A9译码形成I/O口地址,即1024H个口地址PC机端口号:0000H03FFH 其中:A9=1,表示扩充槽上的口地址。,长格式:端口号中前256个端口(0FFH),可以直接写在指令中,端口号代替指令中的PORT,机器指令用二字节表示,第二字节就是端口号。短格式:当端口号256时,只能使用短格式,必须先把端口号放到DX寄存器中。不需要用任何段寄存器来修改它的值。,1)IN(Input byte or word)输入指令格式:IN acc,port;(acc)(port)具体形式有四种:长格式:IN AL,data8;端口地址8位,输入一个字节 IN AX,da

25、ta8;端口地址8位,输入一个字短格式:IN AL,DX;端口地址16位,输入一个字节 IN AX,DX;端口地址16位,输入一个字 必须通过累加器AX(字)或AL(字节)输入数据。,2)OUT(Output byte or word)输出指令格式:OUT port,acc;(port)(acc)具体形式有四种:长格式:OUT data8,AL;端口地址8位,输出一个字节 OUT data8,AX;端口地址8位,输出一个字短格式:OUT DX,AL;端口地址16位,输出一个字节 OUT DX,AX;端口地址16位,输出一个字 必须通过累加器AX(字)或AL(字节)输出数据。,例1:实现(29H

26、)(28H)(DATA_WORD)长格式:IN AX,28H MOV DATA_WORD,AX例2:从端口3FCH 送一个字到AX寄存器短格式:MOV DX,3FCH IN AX,DX;(AL)(3FCH),(AH)(3FDH)例3:实现将(AL)(05H)长格式:OUT 5,AL;(05H)(AL),(2)XLAT(Translate)字节转换指令(换码指令):该指令不影响标志位。格式:XLAT str_table;(AL)(BX)+(AL)或 XLAT str_table表格符号地址(首地址),只是为了提高可读性而设置,汇编时仍用BX。,XLAT指令使用方法:先建立一个字节表格;表格首偏移

27、地址存入BX;需要转换代码的序号(相对与表格首地址位移量)存入AL;(表中第一个元素的序号为0)执行XLAT指令后,表中指定序号的元素存于AL中。(AL)为转换的代码。,XLAT指令应用:若把字符的扫描码转换成ASCII码;或数字09转换成7段数码所需要的相应代码(字形码)等 就要用XLAT指令。例:内存的数据段中有一张十六进制数字的ASCII码表。首地址为:Hex_table,欲查出表中第10个元素(A),执行指令序列:MOV BX,OFFSET Hex_tableMOV AL,0AH XLAT Hex_table假设:(DS)=F000H,Hex_table=0040H(AL)=0AH执行

28、XLAT以后:(AL)=41H=(F004AH),即“A”的ASCII码。,16进制数的ASCII码表,3.目的地址传送指令(Address-object transfer)8086/8088 提供三条:地址指针写入指定寄存器或寄存器对指令。(1)LEA(Load Effective Address)(2)LDS(Load pointer using DS)(3)LES(Load pointer using ES),(1)LEA有效地址传送格式 LEA reg,mem执行(reg)mem的EA 即 寄存器 存储器操作数的偏移地址,执行后(BX)=1000H,注意:OFFSET是汇编程序提供的一

29、个操作符,不是CPU的指令.,LEA BX,buffer,例 buffer是一个符号地址表示的内存操作数(变量)。,.12h34h56h.,buffer,内存,等价于 MOV BX,OFFSET buffer,(2)LDS(Load pointer using DS)格式:LDS reg16,mem32;(reg16)(EA)(DS)(EA)+2)功能:把源操作数指定的4个相继字节送指令指定的寄存器 及DS寄存器中。前两个单元内容(16位偏移量)装入指定通用寄存器,后两个单元内容(段地址)装入到DS段寄存器。用于写远地址指针。,例:假设:(DS)=C 000H指令:LDS SI,0010H执行

30、指令后:(SI)=0180H(DS)=2000H,(3)LES(Load pointer using ES)格式:LES reg16,mem32;(reg16)(EA)(ES)(EA)+2)功能:把源操作数指定的4个相继字节送指令指定的寄存器及ES寄存器中。前两个单元内容(16位偏移量)装入指定通用寄存器,后两个单元内容(段地址)装入到ES段寄存器。此指令常常指定DI寄存器。用于写远地址指针。,例:假设:(DS)=B 000H(BX)=080AH指令:LES DI,BX执行指令后:(DI)=05A2H(ES)=4000H,4.标志传送指令(Flag register transfer)采用了隐

31、含寄存器(AH、Flags)操作数方式。8088有四条标志传送操作指令:(1)LAHF(Load AH from flags)(2)SAHF(Store AH into flags)(3)PUSH F(Push flags onto stack)(4)POP F(Pop flags off stack),(1)LAHF(Load AH from flags),格式:LAHF;(AH)(PSW的低字节)功能:标志寄存器低八位(AH)。,LAHF指令操作图示意,(2)SAHF(Store AH into flags)格式:SAHF;(PSW的低字节)(AH)功能:(AH)送标志寄存器低八位。,注意

32、:(1)标志位的影响LAHF、PUSHF不影响标志位,SAHF、POPF由装入的值确定标志位的值,即影响标志位。(2)PUSH F、POPF用于保护调用过程前(PSW),过程返回后恢复。例:PUSHAXPUSH CXPUSH FCALL TRANS,POPFPOP CXPOP AX,二.算术运算指令,指令分类:,特点:带符号数用补码表示 如 MOV AX,-1 等价于 MOV AX,0FFFFh 对加、减运算,不区分无符号数、带符号数 对乘、除运算,区分无符号数、带符号数 可进行字节或字操作 影响状态标志 十进制运算方法:当数据用组合(压缩)或分离(非压缩)BCD码表示时,为使运算的结果仍为B

33、CD码表示,需对结果进行调整。十进制运算=二进制运算+十进制调整,BCD码(Binary Coded Decimal)用二进制编码表示十进制数。常用8421 BCD码,与十进制数码对应关系:,例 48的BCD码为(0100 1000)BCD,根据在内存的存放形式,分组合BCD码和分离 BCD码 组合BCD码(又称压缩BCD码)(Packed BCD format)用4位二进制数表示一个十进制数位,一字节存放2个BCD码。整个十进制数形式为一个顺序的4位为一组的数串。例:9502d 的压缩BCD码应表示为:9 5 0 2分离BCD码(又称非压缩BCD码)(Unpacked BCD format)

34、用8位为一组表示一个十进制数位,一字节存放1个BCD码。8位中的低4位表示8421的BCD码,而高4位没有意义。例:9502d的非压缩BCD码则表示为:9 5 0 2,ASCII码是一种分离BCD码数字的ASCII的高4位0011无意义;低4位是以8421码形式表示的十进制数位。符合分离BCD码高4位无意义的规定。2的ASCII码:高4位0011无意义,当数据用组合或分离BCD码表示时,为使运算的结果仍为BCD码表示,需对结果进行调整。十进制运算=二进制运算+十进制调整,例(0000 1000)压缩BCD+(0000 1001)压缩BCD=(0001 0111)压缩BCD,1.加法运算指令,A

35、DD、ADC为双操作数指令 INC为单操作数指令 除INC指令不影响CF外,其余指令6个状态标志均据结果置位,ADC带进位加法,实现字以上运算(进位是上条指令运算的进位),例1 加法指令:编程完成 CFA1H+62A0H,MOV DX,0CFA1HADD DX,62A0H,执行后:(DX)=3241H CF=1,OF=0,SF=0,ZF=0(注意:CF和OF的判断方法),OF=1,8位带符号数相加,和超出范围(128127),16位带符号数相加,和超出范围(-32768+32767);加法:两个正数相加,结果为负;或两个负数相加,结果为正。(两个异号数相加不可能溢出)减法:两个异号数相减,结果

36、与减数相同。(两个同号数相减不可能溢出)运算结果错误。CF=1,8位无符号数相加,和超过255,16位无符号数相加,和超过65535。运算结果准确其他条件标志(SF,AF,PF,ZF)根据定义设定。,三组指令执行后的结果均为:(AL)=0FDH,CF=0,OF=0,SF=1,ZF=0,第一章中的例题,对加、减运算,CPU计算时不区分无符号数、带符号数,例2 加1指令:INC AL 执行前(AL)=FFH,执行后:(AL)=00H CF=不变,OF=0,ZF=1,SF=0,注意:INC value是内存单元内容加1,而非地址加1,INC value或写成:INC value,注意若编程如下,MO

37、V CX,4MOV AL,0 exit:ADD AL,buffer INC buffer DEC CXJNZ exit,不能实现,为什么?,.MOV CX,4 LEA BX,buffer MOV AL,0exit:ADD AL,BX INC BX DEC CX JNZ exit,实现的是(1A)+(1B)+(1C)+(1D)指令INC buffer 将buffer指向的内容加1,而不是地址buffer加1,例5 带进位加:两双字相加 0002F365H+0005 E024 H=?,MOV AX,0F365H ADD AX,0E024H MOV BX,0002H ADC BX,0005H,执行完

38、、:(AX)=D389H CF=1,OF=0,SF=1,ZF=0 执行完、:(BX)=0008H CF=0,OF=0,SF=0,ZF=0,分析:8086/8088只能按字节或字相加。位数在字以上的操作数,先加低位,再加高位,加高位时加入从低位产生的进位。,用途举例计算两个多字节数相加 3B74AC60F8H+20D59E36C1H=?两个多字节数存放在:DATA1,DATA2的开始单元。,流程图,多字节数内存存放,程序:MOV CX,5MOV SI,0;清SICLC;清CFLOOPER:MOV AL,DATA2SIADC DATA1SI,ALINC SI;(SI)+1(SI)DEC CX;(C

39、X)-1(CX)JNZ LOOPER;(CX)0转HLT;停机,以8位二进制数为例分析一下数的溢出与进位情况:下面分4种情况加以讨论:(1)带符号数和无符号数都不溢出(2)无符号数溢出(3)带符号数溢出(4)带符号数和无符号数都溢出,(1)带符号数和无符号数都不溢出,。,(2)无符号数溢出,二进制数,看作无符号数,看作带符号数,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,1,+,0,0,0,0,0,0,1,0,7,251,+,258,+7,-5,+,+2,相,加,标志,CF=1,OF=0,CF=1,OF=0,溢出,无符号数溢出,溢出,结果应为2,错,不溢出,异号数相加,不可能有

40、溢出,CF=1,(3)带符号数溢出,(4)带符号数和无符号数都溢出,结论:(1)带符号数相加溢出 根据OF=1?,判断带符号数产生溢出?OF=1,同符号数相加,结果符号与其相反,产生溢出;OF=0,同符号数相加,结果符号与其相同,不产生溢出;异号数相加,不可能溢出。(2)无符号数相加溢出根据CF=1?,判断无符号数产生溢出?CF=1,无符号数相加产生溢出,但结果并没有错,只是结果放不下。,2.减法运算指令,SUB、SBB、CMP为双操作数,DEC、NEG为单操作数 SBB为带进位减法(进位是上条指令运算的进位)。除DEC不影响CF标志外,其余指令6个状态标志均据结果置位。NEG求补运算,等价于

41、用0减去操作数。其对标志位的影响,由0减去该操作数的过程决定。,例1 减法指令:编程完成 2D04H 3AB0H,执行后:(AX)=0F254H CF=1,OF=0,SF=1,ZF=0,2D04H 0010 1101 0000 0100-3AB0H-0011 1010 1011 0000 1 1 1111 1 1 111 F254H 1111 0010 0101 0100,MOV AX,2D04HSUB AX,3AB0H,借位,也可对(3AB0)取补作加法 0010 1101 0000 0100 1100 0101 0101 0000 1 1 1111 0010 0101 0100减法进位取反

42、CF=1,其它OF=0,SF=1,ZF=0,例2 带借位减法:用指令完成两双字相减运算,MOV AX,7A70H SUB AX,A543H MOV BX,0546H SBB BX,0F001H,例3 减1指令:value 是一个字节变量 OFFSET value=1000H(DS)=2000H,(21000H)=00H DEC value 执行后:(21000H)=0FFH CF=不变,OF=0,ZF=0,SF=1,注意:DEC value 是内存单元内容减1,而非地址减1,例4 求补指令:MOV AH,80H NEG AH,00 H 0000 0000 B-80 H-1000 0000 B

43、1 1 80H 1000 0000B,执行后:(AL)=80H,CF=1,OF=0,ZF=0,SF=1,例5:求绝对值在内存中,从AREA1开始存放100个带符号数。求各数的绝对值存于AREA2的开始单元。,流程图,程序:LEA SI,AREA1LEA DI,AREA2MOV CX,100CHECK:MOV AL,SIADD AL,0;(AL)内容不变,置标志JNS NEXT;SF=0转NEXTNEG AL;负数求补 NEXT:MOV DI,AL;送目标INC SIINC DIDEC CXJNZ CHECKHLT,CMP oprd1,oprd2;(oprd1)-(oprd2),据ZF判断两数是

44、否相等,CMP A,B,ZF=1 两数相等,A=B;ZF=0 两数不等,A B,据ZF和CF判断两无符号数关系,利用CMP执行后的标志值,比较两操作数之间的关系,比较指令CMP,进行两操作数相减操作,但只影响标志值,不影响操作数(减的结果不保存),比较指令:,比较指令常常根据条件(标志)转移,无符号数转移指令如下:,CMP A,B 用ZF、SF 和 OF判断两带符号数关系,OF=0,不溢出情况,SF=0,AB SF=1,A B,结合ZF,得到结论:,逻辑运算:,例 将AX和BX中较大的带符号数,存于AX中 CMP AX,BX;比较 JGE great;大于或等于则跳转 XCHG AX,BX;小

45、于则交换 great:、,比较指令常常根据条件(标志)转移,带符号数转移指令如下:,3.乘法指令,MUL srcIMUL src 单操作数指令 源操作数(乘数)类型决定操作类型 目的操作数(被乘数)隐含。字节乘AL 字乘AX 字节相乘的结果存放在AX中 字相乘的结果存放在DX、AX中 MUL 用于无符号数运算 IMUL 用于带符号数运算,影响CF和OF,对其他条件码无定义(不确定)(1)指令 MUL 字节相乘:AH=0,CF=OF=0,否则 CF=OF=1 字相乘:DX=0,CF=OF=0,否则 CF=OF=1 即:积的高一半为0(字节乘(AH)=0,字乘(DX)=0),则CF=0,OF=0;

46、否则CF=1,OF=1。对其它条件码不确定(无定义)。状态不定。,(2)指令IMUL 字节相乘:AH=0或AH=FFH,CF=OF=0,否则 CF=OF=1 字相乘:DX=0或DX=FFFFH,CF=OF=0,否则 CF=OF=1 即:积的高一半为低一半的符号扩展,则 CF=0,OF=0;积的高一半部分不是低一半部分符号的扩展(包括结果的有效数字,不光是符号部分),则 CF=1,OF=1。积的高一半为低一半的符号扩展的含义:乘积为正,则(AH)=00H或(DX)=0000H乘积为负,则(AH)=FFH或(DX)=FFFFH,问题思考:乘法中为什么要用MUL,IMUL 指令?例:,结论:带符号数

47、相乘,必须使用IMUL指令无符号数相乘,必须使用MUL指令否则,出错。,例(AL)=0B4H,(BL)=11H,指令中源操作数为字节类型,故是字节操作,MUL BL,IMUL BL,看作无符号数(AL)=180D(BL)=17D 18017=3060D=0BF4H,执行MUL BL后:(AX)=0BF4H CF=OF=?,看作带符号数(AL)=-76D(BL)=17D(-76)17=-1292D=0FAF4H,执行IMUL BL后:(AX)=0FAF4HCF=OF=?,例(AX)=0FFFFH,(BX)=0FFFFH,指令中源操作数为字类型,故是字操作,4.除法指令,单操作数指令 源操作数(除

48、数)类型 决定指令操作类型 目的操作数(被除数)隐含 字节操作在AX中;字操作在DX,AX中 除的结果,字节操作在AX中;字操作在DX,AX中 除法指令对所有条件码位均无定义 下列情况自动转入 0 中断处理:(1)除数为0(2)字节操作,商的范围超出字节范围 字操作时,商的范围超出字范围,除法指令举例例(AX)=0501H,(BL)=0C6H(1)DIV BL(2)IDIV BL 看作无符号数 看作带符号数(AL)=1281D(AL)=1281D(BL)=198D(BL)=-58D 1281/198 1281/(-58)商=6D 商=-22D=0EAH 余数=93D=5DH 余数=5D 执行D

49、IV BL后:执行IDIV BL后:(AX)=5D06H(AX)=05EAH,5.符号扩展指令,无操作数格式 操作数隐含字节操作,源在AL,目的在AX字 操 作,源在AX,目的在DX,AX 对条件码无影响 符号扩展指令应对带符号数操作 扩展后,表示的数值大小不变,只是位数发生变化 8位扩展到16位,16位扩展到32位 应用场合:除法指令中,使被除数满足要求。字节操作,被除数为16位.字操作,被除数为32位.加减运算中,使两操作数类型一致如:字与字节相加、减时 如:双字与字之间的相加、减时,符号扩展指令举例例 CBW 执行前(AL)=01H,(AH)=0FFH 执行后(AL)=01H,(AH)=

50、00H例 CWD 执行前(AX)=0FF00H,(DX)=0011H 执行后(AX)=0FF00H,(DX)=0FFFFH例(AL)=0FFH,将其内容扩展至(AX)中 看作无符号数为255,若用MOV AH,0H(AX)=00FFH=255D 若用CBW(AX)=0FFFFH=65535原数 故,对无符号数的扩展不能用符号扩展指令 对无符号数的扩展,直接给高位赋 0。,6、调整指令前面提到的所有算术运算指令都是二进制的运算指令,但人们常用的是十进制。当用计算机进行计算时:必须先把十进制 二进制数,计算结果 十进制数输出。为便于十进制运算,计算机提供了一组十进制调整指令,这组指令在二进制基础上

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号