6 3.3指令系统传送、算术运算指令2.ppt_第1页
6 3.3指令系统传送、算术运算指令2.ppt_第2页
6 3.3指令系统传送、算术运算指令2.ppt_第3页
6 3.3指令系统传送、算术运算指令2.ppt_第4页
6 3.3指令系统传送、算术运算指令2.ppt_第5页
已阅读5页,还剩112页未读 继续免费阅读

下载本文档

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

文档简介

1、8086的指令系统,2,教学重点,第3章是本课程的一个关键内容,是程序设计的基础 基础是熟悉寄存器组 难点是各种寻址方式 重点是掌握8086常用指令的功能及应用,3,什么是指令系统,计算机的指令系统就是指该计算机能够执行的全部指令的集合 每种计算机都有它支持的指令集合 16位8086指令系统是INTEL 80X86系列微处理器指令系统的基础,4,学习指令的注意事项,指令的功能该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式 指令支持的寻址方式该指令中的操作数可以采用何种寻址方式 指令对标志的影响该指令执行后是否对各个标志位有影响,以及如何影响 其他方面该指令其他需要特别

2、注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等,5,汇编语言指令格式,由4部分组成: 标号:指令助记符 目的操作数,源操作数;注释,标号表示该指令在主存中的逻辑地址,每个指令助记符就代表一种指令,目的和源操作数表示参与操作的对象,注释是对该指令或程序段功能的说明,6,指令操作数的表达(1),r8任意一个8位通用寄存器 AH AL BH BL CH CL DH DL r16任意一个16位通用寄存器 AX BX CX DX SI DI BP SP reg代表R8或r16 Sreg段寄存器 CS/DS/ES/SS,一定要熟悉噢!,7,指令操作数的表达(2),m8一个8位存储器

3、操作数单元(所有主存寻址方式) m16一个16位存储器操作数单元(所有主存寻址方式) mem代表m8或m16,一定要熟悉噢!,8,指令操作数的表达(3),i8一个8位立即数 i16一个16位立即数 imm代表i8或i16 dest目的操作数 src源操作数,一定要熟悉噢!,9,8086指令系统概述,INTEL 8086指令系统共有117条基本指令,可分成7个功能组 数据传送(DATA TRANSFER)类指令 算术运算(ARITHMETIC)类指令 位操作类指令 串操作(STRINCG MANIPULATION)类指令 控制转移(CONTROL TRANSFER)类指令 处理器控制(PROCE

4、SSOR CONTROL)类指令 逻辑运算指令,教学提示,全面而准确地理解每条指令的功能和应用,是编写汇编语言程序的关键,逐个展开指令,11,1.数据传送类指令,数据传送是计算机中最基本、最重要的一种操作 传送指令也是最常使用的一类指令 传送指令把数据从一个位置传送到另一个位置 除标志寄存器传送指令外,均不影响标志位 重点掌握 MOV XCHG XLAT PUSH POP LEA,12,3.1 通用数据传送指令,提供方便灵活的通用传送操作 有3条指令 MOV XCHG XLAT,MOV,XCHG,XLAT,13,1.传送指令MOV(move),把一个字节或字的操作数从源地址传送至目的地址,MO

5、V reg/mem,imm ;立即数送寄存器或主存,MOV,MOV reg/mem/Sreg,reg ;寄存器送(段)寄存器或主存,MOV reg/Sreg,mem ;主存送(段)寄存器,MOV Reg/mem,Sreg ;段寄存器送寄存器或主存,例1:立即数传送,MOV AL,4;AL4,字节传送 MOV CX,0FFH;CX00FFH,字传送 MOV SI,200H;SI0200H,字传送 MOV BYTE PTR SI,0AH ;BYTE PTR 说明是字节操作 MOV WORD PTR SI+2,0BH ;WORD PTR 说明是字操作,注意立即数是字节量还是字量 明确指令是字节操作还

6、是字操作,MOV,例2:寄存器传送,MOV AX,BX;AXBX,字传送 MOV AH,AL;AHAL,字节传送 MOV DS,AX;DSAX,字传送 MOV SI,AL;SIAL,字节传送,MOV,例3:存储器传送,MOV AL,BX MOV DX,BP;DXSS:BP MOV ES,SI;ESDS:SI,不存在存储器向存储器的传送指令,MOV,例2.5:段寄存器传送,MOV SI,DS MOV AX,ES;AXES MOV DS,AX;DSAXES,对段寄存器的操作有一些限制,MOV,18,MOV指令传送功能,MOV也并非任意传送,立即数,段寄存器 DS ES SS,通用寄存器 AX BX

7、 CX DX BP SP SI DI,存 储 器,(1)IP和CS不能出现 (2)存储器之间不能传送 (3)段寄存器之间不能传送 (4)立即数和段寄存器之间 不能传送,3、MOV的 “4不能”,19,非法传送种种,两个操作数的类型不一致 例如源操作数是字节,而目的操作数是字;或相反 两个操作数不能都是存储器 传送指令很灵活,但主存之间的直接传送却不允许 段寄存器的操作有一些限制 段寄存器属专用寄存器,对他们的操作能力有限,示例,示例,示例,20,两个操作数的类型要一致,绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否则为非法指令 MOV AL,050AH ;非法指令:0

8、50AH为字,而AL为字节 寄存器有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型 对于存储器单元与立即数同时作为操作数的情况,必须显式指明;ByTE PTR指示字节类型,WORD PTR指示字类型,21,两个操作数不能都是存储器,8086指令系统不允许两个操作数都是存储单元(除串操作指令),要实现这种传送,可通过寄存器间接实现 MOV AX,BUFFER1 ;AXBUFFER1(将BUFFER1内容送AX) MOV BUFFER2,AX ;BUFFER2AX ;这里BUFFER1和BUFFER2是两个字变量 ;实际表示直接寻址方式,22,要小心段寄存器的操作,不允许立即数

9、传送给段寄存器 MOV DS,100H ;非法指令:立即数不能传送段寄存器 不允许直接改变CS值 MOV CS,SI;不允许使用的指令 不允许段寄存器之间的直接数据传送 MOV DS,ES ;非法指令:不允许段寄存器间传送,23,2.交换指令XCHG(EXCHANCGE),把两个地方的数据进行互换,寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据 不能在存储器与存储器之间对换数据,XCHG,XCHG reg,reg/mem ;reg reg/mem,例题2,例题1,例1:寄存器间交换,MOV AX,1234H;AX=1234H MOV BX,5678H;BX=5678H XCHG AX,

10、BX ;AX=5678H,BX=1234H XCHG AH,AL;AX=7856H,XCHG,例2:寄存器与存储器交换,XCHG AX,2000H;字交换 ;等同于 XCHG 2000H,AX XCHG AL,2000H ;字节交换 ;等同于 XCHG 2000H,AL,XCHG,26,执行XLAT时,会执行“(BX)+(AL)=EA”,EA为某一元素的代码存放地址,然后将(EA)放入AL中。 该指令对标志位没有影响。,3.查表(代码)转换指令XLAT(TRANSLATE),指令的操作数都是隐含的,事先在BX中存放某一内存表格的首地址;在AL中为表中某一元素项与表格首地址之间的偏移量。,XLA

11、T,XLAT;ALDS:BX+AL,例题3,该指令也是累加器专用传送指令。,例3:代码转换,MOV BX,100H MOV AL,03H XLAT,换码指令没有显式的操作数,但使用了BX和AL;因为换码指令使用了隐含寻址方式采用默认操作数,XLAT,28,4. 地址传送指令,地址传送指令将存储器单元的逻辑地址送至指定的寄存器 有效地址传送指令 LEA 指针传送指令 LDS和LES 注意不是获取存储器单元的内容,29,有效地址传送指令LEA(LOAD EA),将存储器操作数的有效地址传送至指定的16位寄存器中,例题6,LEA r16,mem ;r16mem的有效地址EA,LEA,30,例6:获取

12、有效地址,MOV BX,0400H MOV SI,3CH LEA BX,BX+SI+0F62H ;BX0400H003CH0F62H139EH,获得主存单元的有效地址;不是物理地址,也不是该单元的内容 可以实现计算功能,LEA,31,指针传送指令,LDS r16,mem ;r16mem, ;DSmem+2 LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器,LES r16,mem ;r16mem, ;ESmem+2 LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器,例题7,32,例7:地址指针传送,MOV WORD PTR 3060H,0100

13、H MOV WORD PTR 3062H,1450H LES DI,3060H;ES=1450H,DI=0100H LDS SI,3060H;DS=1450H,SI=0100H,mem指定主存的连续4个字节作为逻辑地址(32位的地址指针),送入DS:r16或ES:r16,属性运算符,5. 堆栈操作指令,堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定 栈顶是地址较小的一端(低端),栈底不变,34,堆栈和队列,堆栈:按照后进先出(LIFO)的原则组织的存储器空间(栈) 队列:按照先

14、进先出(FIFO)的原则组织的存储器空间,35,堆栈的操作,堆栈只有两种基本操作:压栈和出栈,对应两条指令PUSH和POP,PUSH ;压栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部,POP ;出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2,压栈指令PUSH,PUSH AX PUSH 2000H,PUSH r16/m16/SECG ;SPSP2 ;SS:SPr16/m16/SECG,PUSH,出栈指令POP,POP DX POP 2000H,POP r16/m16/SECG ;r16/m16/SECGSS:SP ;SPSP2,POP,38,堆栈的特点,堆栈操作

15、的单位是字,进栈和出栈只对字量 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据 堆栈常用来 临时存放数据 传递参数 保存和恢复寄存器,例题4,例4:现场保护恢复,PUSH AX;进入子程序后 PUSH BX PUSH DS . POP DS;返回主程序前 POP BX POP AX,40,标志寄存器压/出堆栈指令,PUSHF ;SPSP2 ;SS:SPFLAGS PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2,POPF ;FLAGSSS:SP ;SPSP2 POPF指令将栈顶字单元内容送

16、标志寄存器,同时栈顶指针SP加2,例题5,41,标志寄存器堆栈操作指令(PUSHF/POPF),0FFFFFH,000000H,SS: 0000H,SP,堆栈段,64K,FH,FL,指令 PUSHF 执行后:,42,例5:置位单步标志,PUSHF;保存全部标志到堆栈 POP AX;从堆栈中取出全部标志 放到AX中 OR AX,0100H;设置D8=TF=1, ;AX其他位不变 PUSH AX;将AX压入堆栈 POPF;FLAGSAX ;将堆栈内容取到标志寄存器,43,6. 标志寄存器传送指令,标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作 有2对4条指令

17、低8位传送:LAHF和SAHF 16位传送:PUSHF和POPF,标志低字节进出AH指令,LAHF ;AHFLAGS的低字节 LAHF指令将标志寄存器的低字节送寄存器AH SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意,SAHF ;FLAGS的低字节AH SAHF将AH寄存器内容送FLAGS的低字节 用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志,45,标志寄存器传送指令,设置标志指令(LAHF/SAHF),46,7. 输入/输出(I/O)指令,8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口

18、(PORT)即I/O地址 8086用于寻址外设端口的地址线为16条,端口最多为21665536(64K)个,端口号为0000HFFFFH 每个端口用于传送一个字节的外设数据 累加器专用的传送指令之一。,47,I/O端口的寻址方式,8086的端口有64K个,无需分段,设计有两种寻址方式 直接寻址:只用于寻址00HFFH前256个端口,操作数i8表示端口号 DX寄存器间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号 对大于FFH的端口只能采用间接寻址方式,48,IN AL,N IN AX,N IN AL,DX IN AX,DX,OUT N,AL OUT N,AX OUT DX,AL

19、OUT DX,AX,端口 地址 为16 位,端口 地址 为8 位,传送 8位 数据,传送 16位 数据,I/O指令(IN/OUT),49,输入指令IN,将外设数据传送给CPU内的AL/AX,IN AL,i8 ;字节输入:ALI/O端口(i8直接寻址) IN AL,DX ;字节输入:ALI/O端口(DX间接寻址) IN AX,i8 ;字输入:AXI/O端口(i8直接寻址) IN AX,DX ;字输入:AXI/O端口(DX间接寻址),IN,例题8,演示,例2.15:输入字量,;直接寻址,字节量输入 IN AL,21H MOV AH,AL IN AL,20H ;直接寻址,字量输入 IN AX,20H

20、 ;间接寻址,字量输入 MOV DX,20H IN AX,DX,两段功能相同 字量数据传送实际上实现了连续的两个端口地址的字节量传送,IN,51,输出指令OUT,将CPU内的AL/AX数据传送给外设,OUT i8,AL ;字节输出:I/O端口AL(i8直接寻址) OUT DX,AL ;字节输出:I/O端口AL(DX间接寻址) OUT i8,AX ;字输出:I/O端口AX(i8直接寻址) OUT DX,AX ;字输出:I/O端口AX(DX间接寻址),OUT,例题9,演示,例9:输出字节量,;间接寻址,字节量输出 MOV DX,3FCH MOV AL,80H OUT DX,AL,OUT,53,小结

21、,1、基本传送指令(MOV),2、堆栈操作指令(PUSH/POP),3、交换指令(XCHG),54,3、I/O指令(IN/OUT),累加器,8位立 即地址,DX间 接地址,4、LEA指令(IN/OUT),16位 寄存器,16位 存储器,OFFSET,5、地址指针传送指令 (LDS/LES),16位 寄存器,32位 存储器,低字,DS/ES,高字,55,作业,1、设堆栈指针SP的初值为1000H,AX=2000H,BX=3000H,试问: A、执行 PUSH AX 后,SP的值是多少? B、在执行 PUSH BX 以及 POP AX 后,SP、AX和BX的值各为多少? 2、要想完成把3000H送

22、2000H中,用指令: MOV 2000H , 3000H 是否正确?若不正确,请用正确的指令实现。 3、试述指令MOV AX,2010H和MOV AX,DS:2010H的区别。,56,4、指出下列指令语法是否正确,若不正确,请说明原因。 (1)MOV DS,0100H (2)MOV BP,AL (2)XCHG AH,AL (4)OUT 310H,AL (5)MOV BX,BX (6)MOV AX,SI+DI (7)MOV SS:BX+SI+100H,BX 5、若SP2000H,AX3355H,BX4466H,试指出下列指令,或程序段执行后写出有关寄存器的内容。 (1)PUSH AX;执行后

23、AX?SP? (2) PUSH AX PUSH BX POP DX;执行后 AX?DX?SP?,have a rest,58,2. 算术运算指令,学习任务,重点注意,1、掌握算术运算类指令的用法 2、熟悉指令执行后对标志位的影响,1、带符号数的算术运算 2、十进制调整指令的使用,59,2.算术运算类指令,四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算,60,算术运算类指令涉及两种类型数据: 无符号数和有符号数。对加减法指令,无符号和有符号数可采用同一套指令,但应注意: 参加的操作数必须都是无符号数或都是有符号数。 需使用不同的标志位来检查无符号数和有符号数

24、的运算结果是否溢出。,61,两个8位数相加时有4种情况:,无符号数和有符号数均不溢出 二进制相加 无符号数加 有符号数加 0000 1000 8 +8 +0001 1110 + 30 + (+30) 0010 0110 38 +38 结果38 CF=0 OF=0,62, 无符号数溢出 0000 1000 8 +8 +1111 1101 +253 +(-3) 10000 0101 261 +5 结果5 CF=1 OF=0 有符号数溢出 0000 1000 8 +8 +0111 1101 +125 +(+125) 1000 0101 133 +133 结果-123 CF=0 OF=1 (补码表示)

25、,63, 无符号数和有符号数均溢出 1000 1000 136 -120 +1111 0111 +247 +(-9) 10111 1111 383 -129 结果127 CF=1 OF=1 上面四种情况说明,CF标志可用来表示无符号数的溢出,OF标志可用来表示有符号数的溢出。 有符号数的溢出是一种出错状态,在运算过程中应当避免。,64,(一)加法指令,不考虑进位加法指令ADD op1,op2 考虑进位加法指令 ADC op1,op2 增量指令 INC op 交换加法指令 XADD op1,op2,65,不考虑进位加法指令ADD,ADD指令将源与目的操作数相加,结果送到目的操作数, ADD指令按

26、状态标志的定义相应设置,ADD,ADD reg,imm/reg/mem ;regregimm/reg/mem ADD mem,imm/reg;memmemimm/reg,例题1,ADD OPRD1,OPRD2;OPRD1OPRD1+OPRD2 ;对标志位产生影响,66,加法指令(ADD),NF,OF,DF,IF,TF,SF,ZF,AF,PF,CF,D15,D14,D13,D12,D11,D10,D9,D8,D7,D6,D5,D4,D3,D2,D1,D0,例2:设AL=3AH,则执行 ADD AL , 7CH 后, AL=?各标志位如何?,AL=3AH00111010 7CH01111100 A

27、L=B6H 10110110 PF=0、ZF=0、AF=1、OF=1、SF=1、CF=0,ADD,67,带进位加法指令ADC,ADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数 ADC指令按状态标志的定义相应设置 ADC指令主要与ADD配合,实现多字节加法运算,ADC,ADC reg,imm/reg/mem ;regregimm/reg/memCF ADC mem,imm/reg ;memmemimm/regCF,例题3,68,加法指令(ADC),例:设两个四字节数,分别放在自FIRST和SECOND开始的存储区中,每个数占四个存储单元,如图所示,试利用加法指令求出它们的和

28、。,MOV AX , FIRST ADD AX , SECOND MOV THIRD , AX MOV AX , FIRST+2 ADC AX , SECOND+2 MOV THIRD+2 , AX,FIRST,FIRST+2,SECOND,SECOND+2,THIRD,例3:双字加法,69,增量指令INC,INC,INC reg/mem ;reg/memreg/mem1,INC BX INC BYTE PTR BX,INC OPRD ; 完成对指定的操作数OPRD加1,然后返回此操作数。此指令主要用于在循环程序中修改地址指针和循环次数等。 这条指令执行的结果影响标志位AF、OF、PF、SF和

29、ZF,而对进位标志CF没有影响。(特别注意!),70,交换加法指令XADD,XADD OP1,OP2 reg, reg mem,reg 首先将OP1与OP2两数交换;然后完成OP1+OP2,其结果存入OP1中. 结果会影响OF,SF,ZF,PF,CF 如:XADD AX,CX;,71,(二)减法指令,不考虑借位的减法指令SUB OP1,OP2 考虑借位的减法指令 SBB OP1,OP2 减量指令 DEC OPRD 求补指令 NEG OPRD 比较指令 CMP OP1,OP2,72,不考虑借位的减法指令SUB(SUBTRACT),SUB,例题4,SUB OPRD1,OPRD2 ; 功能:OPRD

30、1OPRD1-OPRD2 完成两个操作数相减,也即从OPRD1中减去OPRD2,结果放在OPRD1中。 例如: SUB CX,BX SUB BP,CL,SUB reg,imm/reg/mem ;regregimm/reg/mem SUB mem,imm/reg ;memmemimm/reg,例4:减法运算,MOV AL,0FBH;AL=0FBH SUB AL,07H;AL=0F4H,CF0 MOV WORD PTR 200H,4652H ;200H=4652H MOV BX,1FEH;BX=1FEH SUB AL,BL;AL=0F6H SUB WORD PTR BX+2,0F0F0H ;200

31、H=5562H,CF1,SUB,74,带借位减法指令SBB,SBB,例题5,SBB OPRD1,OPRD2 ; 功能:OPRD1OPRD1-OPRD2-CF 这条指令与SUB类似,只是在两个操作数相减时,还要减去借位标志CF的现行值本指令对标志位AF、CF、OF、PF、SF和ZF都有影响。 同ADC指令一样,本指令主要用于多字节操作数相减。,SBB reg,imm/reg/mem ;regregimm/reg/memCF SBB mem,imm/reg ;memmemimm/regCF,例5:双字减法,SBB,例5:设两个四字节数,分别放在自FIRST和SECOND开始的存储区中,每个数占四个

32、存储单元,如图所示,试利用减法指令求出它们的差。,MOV AX , FIRST SUB AX , SECOND MOV THIRD , AX MOV AX , FIRST+2 SBB AX , SECOND+2 MOV THIRD+2 , AX,FIRST,FIRST+2,SECOND,SECOND+2,THIRD,76,减量指令DEC(DECREMENT),DEC,DEC CX DEC WORD PTR SI,DEC OPRD ; 功能:OPRDOPRD-1 对指令的操作数减1,然后送回此操作数, 在相减时,把操作数作为一个无符号二进制数来对待。指令执行的结果,影响标志AF、OF、PF、SF

33、和ZF但对CF标志不影响(即保持此指令以前的值)。 例如: DEC SI DEC CL,INC指令和DEC指令都是单操作数指令 主要用于对计数器和地址指针的调整,DEC reg/mem ;reg/memreg/mem1,特别留意哦!,77,NEG OPRD 功能: (Negate)变补 对操作数变补,连符号位一起逐位取反加1运算,即0-OPRD,(一般称此运算为变补运算,有的书上称为求补运算)再把结果送回操作数。 例如: NEG AL NEG MULRE (AL00111100)则变补后为11000100 即000000000011110011000100 若在字节操作时对-128(80h),

34、或在字操作时对-32768(8000h)变补,则操作数没变化,但标志OF置位1。 此指令影响标志AF、CF、OF、PF、SF和ZF。此指令的结果一般总是使标志CF=1。除非在操作数为零时,才使CF=0。,变补指令NEG,NEG,NEG reg/mem ;reg/mem0reg/mem,例题6,例6:变补运算,MOV AX,0FF64H NEG AL ;AX=FF9CH,OF=0、SF=1、ZF=0、PF=1、CF=1 SUB AL,9DH ;AX=FFFFH,OF=0、SF=1、ZF=0、PF=1、CF=1 NEG AX ;AX=0001H,OF=0、SF=0、ZF=0、PF=0、CF=1 D

35、EC AL ;AX=0000H,OF=0、SF=0、ZF=1、PF=1、CF=1 NEG AX ;AX=0000H,OF=0、SF=0、ZF=1、PF=1、CF=0,NEG,CMP OPRD1,OPRD2 ; 功能: 比较指令完成两个操作数相减,使结果反映在标志位上,但并不送回结果(即不带回送的减法)。 例如: CMP AL,100 CMP DX,DI CMP CX,COUHTBP CMP COUNTSI,AX 注:比较指令主要用于比较两个数之间的关系。在比较指令之后,根据ZF标志即可判断两者是否相等。 相等的比较: 若两者相等,相减以后结果为零,ZF标志为1,否则为0。 若两者不相等,则可在

36、比较指令之后利用其它标志位的状态来确定两者的大小。 大小的比较: 如果是两个无符号数(如CMPAX,BX)进行比较,则可以根据CF标志的状态判断两数大小。若结果没有产生借位(CF=0),显然AXBX;若产生了借位(即CF1),则AXBX。,比较指令CMP(COMPARE),CMP reg,imm/reg/mem ;regimm/reg/mem CMP mem,imm/reg;memimm/reg,例题7,CMP,80,根据标志位来判断比较的结果,1)根据ZF判断两个数是否相等。若ZF=1,则两数相等。 2)若两个数不相等,则分两种情况考虑: 比较的是两个无符号数 若CF=0,则destsrc;

37、 若CF=1,则destsrc。 比较的是两个有符号数 若OFSF=0,则destsrc; 若OFSF=1,则destsrc。,例7:比较AL与100,CMP AL,100;AL-100 JB BELOW ;AL100,跳转到BELOW执行 . BELOW:.,执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等,CMP,(三) 乘法指令,MUL r8/m8 ;无符号字节乘法 ;AXALr8/m8 MUL r16/m16 ;无符号字乘法 ;DX.AXAXr16/m16,IMUL r8/m8 ;有符号字节乘法 ;AXALr8/m8 IMUL r16/m16 ;有符号字乘法 ;DX.AXA

38、Xr16/m16,例题8,83,乘法指令的功能,乘法指令分无符号和有符号乘法指令 乘法指令的源操作数显式给出,隐含使用另一个操作数AX和DX 字节量相乘:AL与r8/m8相乘,得到16位的结果,存入AX 字量相乘:AX与r16/m16相乘,得到32位的结果,其高字存入DX,低字存入AX 乘法指令利用OF和CF判断乘积的高一半是否具有有效数值,84,乘法指令对标志的影响,乘法指令如下影响OF和CF标志: MUL指令若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1 IMUL指令若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1 乘法指令对其他状态标志没有定义,对标

39、志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是0还是1) 对标志没有影响:指令执行不改变标志状态,例8(1):乘法运算,MOV AL,0B4H;AL=B4H=180 MOV BL,11H;BL=11H=17 MUL BL;AX=OBF4H=3060 ;OF=CF=1,AX高8位不为0 MOV AL,0B4H;AL=B4H=76 MOV BL,11H;BL=11H=17 IMUL BL;AX=FAF4H=1292 ;OF=CF=1,AX高8位含有效数字,86,例8(2):求 0A7H*85H=? MOV AL,0A7H MOV BL,85H MUL BL,结果:AX=56C3

40、H 由于AH不为零,所以CF=1、OF=1,87,例8(3):设AX=04E8H,BX=0088H,DS=2000H,存储单元20088H中的字内容为4E20H,问执行指令: IMUL WORD PTR BX 后,DX=?,AX=?,CF=?,OF=?,结果:DX=017FH , AX=4D00H 由于DX不为零,所以CF=1、OF=1,(四)除法指令,DIV r8/m8;无符号字节除法: ALAXr8/m8的商,AHAXr8/m8的余数 DIV r16/m16;无符号字除法: ;AXDX.AXr16/m16的商,DXDX.AXr16/m16的余数,IDIV r8/m8;有符号字节除法: AL

41、AXr8/m8的商,AHAXr8/m8的余数 IDIV r16/m16;有符号字除法: ;AXDX.AXr16/m16的商,DXDX.AXr16/m16的余数,例题9,89,除法指令的功能,除法指令分无符号和有符号除法指令 除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数 字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH 字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX 除法指令对标志没有定义 除法指令会产生结果溢出,90,除法错中断,当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便

42、产生溢出,8086CPU中就产生编号为0的内部中断除法错中断 对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,则发生除法溢出 对IDIV指令,除数为0,或者在字节除时商不在-128127范围内,或者在字除时商不在-3276832767范围内,则发生除法溢出,例9:除法运算,MOV AX,0400H;AX=400H=1024 MOV BL,0B4H;BL=B4H=180 DIV BL;商AL05H5 ;余数AH7CH124 MOV AX,0400H;AX=400H=1024 MOV BL,0B4H;BL=B4H=76 IDIV BL;商ALF3H13 ;余数AH24H

43、36,符号扩展指令,CBW;AL的符号扩展至AH ;如AL的最高有效位是0,则AH00 ;AL的最高有效位为1,则AHFFH。AL不变,CWD;AX的符号扩展至DX ;如AX的最高有效位是0,则DX00 ;AX的最高有效位为1,则DXFFFFH。AX不变,什么是符号扩展 符号扩展指令常用于获得倍长的数据,不影响标志位,例题10,例题11,93,符号扩展的概念,符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数)。符号扩展不改变数据大小 对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成为0064H(仍表示数据1

44、00) 对于数据FF00H(表示有符号数256),其最高位D15为1,符号扩展后高16位都是1,成为FFFFFF00H(仍表示有符号数256),例10:符号扩展,MOV AL,80H;AL=80H CBW;AX=FF80H ADD AL,255;AL=7FH CBW;AX=007FH,例11:AXBX,CWD;DX.AXAX IDIV BX;AXDX.AXBX,利用符号扩展指令得到除法指令所需要的倍长于除数的被除数 对无符号数除法应该采用直接使高8位或高16位清0的方法,获得倍长的被除数,96,例12.在内存的数据段中,前两个字节是一个16位带符号的被除数,第二、三字节是一个16位带符号的除数

45、,接下来的两个字节存放商,再接下来的两个字节存放余数。则能实现除法运算的程序如下:,LEA BX,BUFFER MOV AX,BX CWD IDIV 2BX MOV 4BX,AX MOV 6BX,DX,BUFFER,BUFFER+2,BUFFER+4,BUFFER+6,数据段DS,(五)十进制调整指令,压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即0099,非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进制位09,高4位任意,通常默认为0,十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果

46、分成压缩BCD码和非压缩BCD码调整,98,BCD码(BINARY CODED DECIMAL),二进制编码的十进制数:一位十进制数用4位二进制编码来表示 8086支持压缩BCD码和非压缩BCD码的调整运算 真值864 二进制编码08H40H 压缩BCD码08H64H 非压缩BCD码0008H0604H,压缩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指令前,应先

47、执行以AL为目的操作数的加法或减法指令 DAA和DAS指令对OF标志无定义,按结果影响其他标志,例如CF反映压缩BCD码相加或减的进位或借位状态,例题12A,例题12B,例题13,100,压缩BCD码的调整指令DAA,调整过程: 两数相加,高4位与低4位的和均在09之间,则无需修正或加00H修正; 若两数相加后,低4位的和大于9或低4位向高4位有进位(AF=1);但高4位相加的和在09之间,则DAA指令对中间结果进行加06H修正; 若两数相加后,高4位的和大于9或向更高位有进位(CF=1);而低4位的和在09之间,则DAA指令对中间结果进行加60H修正; 若两数相加后,低4位、高4位的和均大于

48、9或有进位位(AF=1,CF=1);或高4位等于9,而低四位有加6修正情况(大于9或有进位AF=1),则DAA指令对中间结果进行加66H修正。,例12A:压缩BCD加法,MOV AL,68H ;AL=68H,压缩BCD码表示真值68 MOV BL,28H ;BL=28H,压缩BCD码表示真值28 ADD AL,BL ;二进制加法:AL=68H+28H=90H DAA;十进制调整:AL=96H ;实现压缩BCD码加法:682896,例12B:压缩BCD减法,MOV AL,68H ;AL=68H,压缩BCD码表示真值68 MOV BL,28H ;BL=28H,压缩BCD码表示真值28 SUB AL

49、,BL ;二进制减法:AL=68H-28H=40H DAS;十进制调整:AL=40H ;实现压缩BCD码减法:68-2840,例13:压缩BCD减法,MOV AX,1234H MOV BX,4612H SUB AL,BL DAS;34-1222,CF0 XCHG AL,AH SBB AL,BH DAS;12-4666,CF=1 XCHG AL,AH;1 123446126622,非压缩BCD码加、减调整指令,(ADD AL,i8/r8/m8) (ADC AL,i8/r8/m8) AAA ;AL将AL的加和调整为非压缩BCD码 ;AHAH调整的进位,(SUB AL,i8/r8/m8) (SBB

50、AL,i8/r8/m8) AAS ;AL将AL的减差调整为非压缩BCD码 ;AHAH调整的借位,使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令 AAA和AAS指令在调整中产生了进位或借位,则AH要加上进位或减去借位,同时CF=AF=1,否则CF=AF=0;它们对其他标志无定义,例题14A,例题14B,105,AAA指令的调整操作,当两个非压缩BCD数按ADD(ADC)相加后,存入AL为其相加后的中间结果。 若AL中低4位大于9或AF=1,则对中间结果进行加06H修正,同时使AH加1,并使AF=1及CF=1,再使AL中高4位清0,保留低4位,即成为非压缩的BCD码。 AAA指令执行后,除对AF、CF标志位有影响外,其他4个标志位为不确定状态,无意义。,例14A:非压缩BCD加,MOV AX,0608H ;AX=060

温馨提示

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

最新文档

评论

0/150

提交评论