微型计算机原理及应用:第3章8086指令系统_第1页
微型计算机原理及应用:第3章8086指令系统_第2页
微型计算机原理及应用:第3章8086指令系统_第3页
微型计算机原理及应用:第3章8086指令系统_第4页
微型计算机原理及应用:第3章8086指令系统_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

1、1第3章 8086指令系统21概述Intel 8086指令系统共有117条基本指令,按照指令功能,可分位6类指令: 数据传送类指令。 算术运算指令。 逻辑移位指令。 串操作指令。 控制转移指令。 处理机控制类指令。3.4 通用指令38086的算术运算指令包括二进制运算指令(加法、减法、乘法和除法指令)和BCD码十进制调整指令。算术运算指令用来执行算术运算,它们中有的是双操作数指令,有的是单操作数指令。双操作数指令是两个操作数中,除了源操作数为立即数的情况外,必需有个操作数在寄存器中。单操作数指令不允许使用立即数方式。 算术指令分为加法指令,减法指令,乘法指令,除法指令和十进制调整指令。 3.4

2、.2 算术运算指令标志寄存器图示溢出标志位OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0 方向标志DF位用来决定在“数据串操作”指令执行时的步进方向;DF=1表示由高字节向低字节方向进行称为递减方式 中断允许标志IF位用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断请求,以及CPU内部产生的中断请求;IF=1表示开中断 状态控制标志TF位用来控制CPU是正常(TF=0)执行,还是单步(TF=1)执行符号标志SF用来反映运算结果的

3、符号位,它与运算结果的最高位相同。对于有符号数就反映运算结果的正负号。运算结果为正数时,SF的值为0 零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1 在运算过程中,如果发生低4位向高4位的进位或借位时,辅助进位标志AF的值将被置为1奇偶标志PF用于标志运算结果的低8位中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1 。只判断AL进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,此时其值为1 53.4.2 算术运算指令算术运算指令涉及两种类型数据,即无符号数和有符号数对加法指令和减法指令而言,无符号和有符号数可采用同一套指令

4、,其先决条件有两个:一是参加的操作数必须同为无符号数或同为有符号数二是要采用不同标志位来检查无符号数和有符号数的运算结果是否溢出而乘除运算指令则需要区分无符号数和有符号数6两个8位数相加时的4种情况无符号数和有符号数均不溢出二进制相加 无符号数加有符号数加 0000 1000 8 +8+0001 1110 +30 +(+30) 0010 0110 38 +38 结果+38 CF=0 OF=0运算结果对无符号数还是对有符号数,其真值都是正确的7 无符号数溢出,有符号数无溢出 0000 1000 8 +8+1111 1101 +253 +(-3)10000 0101 261 +5 结果5 CF=1

5、OF=0 有符号数溢出,无符号数无溢出 0000 1000 8 +8+0111 1101 +125 +(+125) 1000 0101 133 +133 结果-123 CF=0 OF=1对有符号数,其运算结果的真值是正确的;对无符号数进行加CF修正后也是正确的对有符号数有溢出,其运算结果是错误的;对无符号数其运算结果的真值是正确的8 无符号数和有符号数均溢出 1000 1000 136 -120 +1111 0111 +247 +(-9) 10111 1111 383 -129 结果127 CF=1 OF=1对有符号数有溢出,其运算结果是错误;对无符号数进行加CF修正后是正确的上面四种情况清楚

6、地说明,CF标志可用来表示无符号数的溢出,OF标志可用来表示有符号数的溢出;除此之外,两种运算可以使用一套方法无符号数的溢出可以通过CF位进行修正有符号数的溢出是错误,在运算过程中应避免9加法指令包括:ADD(add)加法ADC(add with carry)带进位加法INC(increment)加1指令格式及操作如下:ADD加法指令指令格式:ADD DST, SRC 执行的操作:(DST)(SRC)+(DST)目的操作数:8/16/32位的寄存器/存储器源操作数:与目的操作数同类型的寄存器/存储器/立即数指令功能:将源操作数与目的操作数相加,结果存放于目的操作数。要求源操作数和目的操作数同时

7、为带符号的数或无符号数,且长度相等。1. 加法指令10下面的指令无法确定操作数的类型,汇编时将报告错误: ADDSI, 5;两个操作数都没有明确类型如果目的操作数是DS:SI指向的字节存储单元,可以修改如下: ADDBYTE PTR SI, 5; PTR-数据类型属性运算符,将存储器中的数据指定类;型,本例中将数据指定为字节数据说明:加法指令执行后,状态标志CF, OF, ZF, SF, PF, AF按照运算结 果被刷新;操作数可以是8位/16位/32位,源操作数与目的操作数应该有相 同的类型,不能同时为内存操作数。11ADC带进位加法指令指令格式:ADC DST, SRC执行的操作: (DS

8、T)(SRC)+(DST)+CF目的操作数:8/16/32位的寄存器/存储器源操作数:与目的操作数同类型的寄存器/存储器/立即数指令功能:将源操作数与目的操作数以及进位标志位CF的值相加,并将结果存放于目的操作数。 (1)加法指令12主要用于由于数据较大(多字节),需要多次运算的加法运算中。例:有两个4字节的无符号数相加: 2D568F8CH+3C9E489BH=? 设 被加数存放在BUF1开始的存储区内 加数存放在BUF2开始的存储区内 要求和放回BUF1存储区假设CPU进行8位的加法运算,为此将进行4次加法运算ADC指令的使用价值1314程序段: MOV CX,4 ;置循环次数 MOV S

9、I,0 ;置SI初值为零 CLC ;清进位标志CFAGAIN:MOV AL,BUF2 SI ADC BUF1SI,AL INC SI DEC CX JNZ AGAIN INT 20H15 INC加1指令指令格式: INC OPR执行的操作: (OPR)(OPR)+1指令功能:将指定操作数内容加1。 注意:这三条指令运算结果将影响状态标志位,但是INC指令不影响标志CF。【例】 INC AL ;AL的内容加1后,送回AL INC CX ;CX的内容加1后,送回CX INCBYTE PTRBX+4 ; PTR-数据类型属性运算符,将存储器中的数据指定类;型,本例中将数据指定为字节数据1. 加法指令

10、16【例】 ADD AX,0CFA8H若执行指令前,(AX)=5623H,则执行指令后,(AX)=25CBH,且CF=1,OF=0,SF=0,ZF=0,AF=0,PF=1。【例】 若执行指令前,(AX)=5A3BH,(DX)=809EH,(BX)=0BA7FH,(CX)=09ADH,分析执行下列指令的结果。ADD AX,BXADC DX,CX 执行第一条指令后,(AX)=14BAH,CF=1,OF=0,SF=0,ZF=0,AF=1,PF=0; 执行第二条指令后,(DX)=8A4CH,CF=0,OF=0,SF=1,ZF=0,AF=1,PF=1。 17例X=33445566778899AAH, Y

11、=123456789ABCDEF0H, 计算Z=X+Y(对应的数据段已经定义,变量X,Y,Z用DQ定义)MOVEAX, DWORD PTR X;取X的低32位,送入EAXADDEAX, DWORD PTR Y;X,Y的低32位相加 ;(EAX)=778899AAH+9ABCDEF0H=1245789AH, CF=1MOVDWORD PTR Z, EAX;低32位的和送Z的低32位MOVEAX, DWORD PTR X+4;取X的高32位,送入EAXADCEAX, DWORD PTR Y+4 ;X, Y的高32位及低位进位相加 ;(EAX)=33445566H+12345678H+CF=4578

12、ABDFH, CF=0MOVDWORD PTR Z+4, EAX;高32位的和送Z的高32位18 例 A,B,C均为8位无符号数,求它们的和,送入SUM 三个8b无符号数的和可能超过255,将它们的和保留为16b。MOVAL, A;取第一个数MOVAH, 0;高8位清零,第一个数“零扩展”为16位MOVDL, B;取第二个数MOVDH, 0;把第二个数“零扩展”为16位ADDAX, DX;加第二个数MOVDL, C;取第三个数,高8位已经为0ADDAX, DX;加第三个数MOVSUM, AX;保存三个数的和19这个问题的另一种方法:MOVAL, A;取第一个数MOVAH, 0;高8位清零,准备

13、存放和的高8位ADDAL, B;加第二个数ADCAH, 0;如果有进位,存入AHADDAL, C;加第三个数ADCAH, 0;如果有进位,加入AHMOVSUM, AX;保存三个数的和20这个问题的第三种方法:.386MOVZXAX, A;取第一个数,扩展0传送MOVZXBX, B;取第二个数ADDAX, BX;加第二个数MOVZXBX, C;取第三个数ADDAX, BX;加第三个数 MOVSUM, AX;保存三个数的和21例 P,Q,R均为8位有符号数,求它们的和,送入TOTAL 将三个8b有符号数的和保留为16b。MOVAL, P;取第一个数CBW;扩展为16位MOVDX, AX;第一个数转

14、存入DXMOVAL, Q;取第二个数CBW;扩展为16位ADDDX, AX;加第二个数MOVAL, R;取第三个数CBW;扩展为16位ADDDX, AX;加第三个数MOVTOTAL, DX;保存三个数的和22本题另一种方法.386 MOVSXAX, P;取第一个数 MOVSXBX, Q;取第二个数 ADDAX, BX;P,Q相加 MOVSXBX, R;取第三个数,扩展符号传送 ADDAX, BX;与第三个数相加 MOVTOTAL, AX;保存三个数的和238086/8088共有7条减法指令,只介绍5条减法指令包括:SUB(subtract)减法SBB(subtract with borrow)

15、带借位减法、DEC(decrement)减1NEG(negate)求补CMP(compare)比较。指令格式及操作如下:2. 减法指令24SUB 减法指令指令格式为:SUB DST,SRC执行的操作:(DST)(SRC)-(DST)指令功能:将目的操作数减去源操作数,结果存放于目的操作数。目的操作数:8/16/32位的寄存器/存储器源操作数:与目的操作数同类型的寄存器/存储器/立即数对标志位的影响、对操作数的要求与ADD指令相同。【例】 SUB AX,BX若执行指令前,(AX)=9543H,(BX)=28A7H则执行指令后,(AX)=6C9CH,(BX)=28A7H, CF=0,OF=1,SF

16、=0,ZF=0,AF=1,PF=1。2. 减法指令25SBB 带借位减法指令指令格式为:SBB DST,SRC执行的操作:(DST)(SRC)-(DST)-CF指令功能:将目的操作数减去源操作数,再减去借位CF的值,结果存放于目的操作数。目的操作数:8/16/32位的寄存器/存储器源操作数:与目的操作数同类型的寄存器/存储器/立即数说明:该指令对标志位的影响、对操作数的要求与ADD指令相同;主要用于对一个数据分段相减时高位的减法运算26【例】现有两个双精度数00127546H和00109428H,其中被减数00127546H存放在DX,AX寄存器,DX中存放高位字;减数00109428H存放在

17、CX,BX寄存器,CX中存放高位字。执行双精度减法指令为:SUB AX,BXSBB DX,CX则第一条执行指令后,(AX)=E11EH,(BX)=9428H,CF=1,OF=1,SF=1,ZF=0,AF=1,PF=1(正数减去负数,和为负数,产生溢出,在多精度运算中,不是最后结果);第二条执行指令后,(DX)=0001H,(CX)=0010H,CF=0,OF=0,SF=0,ZF=0,AF=0,PF=0(正数减去正数,和为正数,不产生溢出,在多精度运算中,这是最后结果)。27DEC 减1指令指令格式为:DEC OPR执行的操作:(OPR)(OPR)-1指令功能:对指定操作数减1。DEC指令不影响

18、进位标志。目的操作数:8/16/32位的寄存器/存储器 【例】 DEC CX ;CX的内容减1后,送回CX DEC DWORD PTR DI ;DS: DIDS: DI1,32位运算说明:减量指令执行后,CPU的状态标志OF, ZF, SF, PF, AF按照 运算结果被刷新,但是CF标志不受影响;减量指令常常用来修改计数器和存储器指针的值;28NEG求补指令指令格式为:NEG OPR执行的操作:(OPR)0 -(OPR)指令功能:对指定操作数求补运算 (由于有符号数均使用补码表示,所以该指令的操作等效于: 目的操作数目的操作数求补) 。亦即把操作数按位求反后末位加1,因而执行的操作也可表示为

19、:(OPR)0FFFFH -(OPR)+1。目的操作数:8/16/32位的寄存器/存储器【例】 NEG DX 若执行指令前(DX)=9A80H,则执行指令后(DX)=6580H,CF=1,OF=0,SF=0,ZF=0,AF=0,PF=0。29CMP比较指令指令格式为:CMP OPR1,OPR2执行的操作:(OPR1)-(OPR2)指令功能:将目的操作数减去源操作数,结果不予保存。只是根据结果的状态设置状态标志位,设置状态标志位与SUB指令含义相同。 【例】 CMP AL,0 ;AL和0比较 JGE next ;若AL=0则转到next位置执行30若两个所比较的数相等,则ZF=1,否则ZF=0;

20、这样就可以: 根据ZF就可判断两个数是否相等根据标志位判断操作数的比较结果31两数不相等若两个数不相等,分两种情况考虑: 比较的是两个无符号数 若CF=0,则被减数大,因大数减小数无须借位 若CF=1,则被减数小32 比较的是两个有符号数 若两个数都是正数或负数时,相减不溢出(即OF=0),可用SF来判断,若SF=0,表示被减数大,SF=1则被减数小 若比较的数中有一个为正,另一个为负,此时有可能出现溢出,不能单看SF状态,还需考虑OF的状态,判别条件: OF=0时,若SF=0被减数大;若SF=1减数大 OF=1时,若SF=1被减数大;若SF=0减数大 33故对有符号数进行比较时,也可归纳为:

21、OFSF=0时(或SF=OF),被减数大OFSF=1时(或 SFOF),减数大34比较的是两个有符号数例比较54与24的大小 解: 54-24=54+(-24) -24补=11101000,54补=00110110 00110110 + 11101000 100011110 OF=0,SF=0,则被减数减数,即54 24 例:比较120与-74的大小 解:120-(-74)=124+74 01111000 01001010 011000010 OF=1,SF=1,则被减数减数,即120 -7435比较的是两个有符号数例比较24与54的大小 解:24-54=24+(-54) 00011000 2

22、4的补码 +11001010 -54的补码 11100010 OF=0,SF=1,则被减数减数,即24 54例:比较-24与120的大小 解:-24-120=-24补+ -120补 11101000 -24补 + 10001000 -120补 101110000 OF=1,SF=0,则被减数减数,即-24 BL,则交换BBB: CMP AL,CL ;AL和CL比较 JNG CCC ;若ALCL,则转 XCHG AL,CL;若ALCL,则交换CCC: INT 20H ;返回DOS383. 十进制数运算1 . 压缩BCD数运算2 . 非压缩BCD数运算BCD码是一种用二进制编码的十进制数,又称为二

23、十进制数。8086/8088中BCD码分为两种形式:一种是用四位二进制数表示一位十进制数,称为压缩的BCD码;另一种是用八位二进制数表示一位十进制数,称为非压缩的BCD码,它的低四位是BCD码,高四位没有意义。由于BCD码是四位二进制编码,四位二进制数共有16个编码,BCD码只用其中的10个,其余没用的编码称为无效码。BCD码运算结果进入或跳过无效码区时,都会出现错误。为了得到正确结果,必须进行调整。8086/8088针对压缩BCD码和非压缩BCD码,分别设有两组十进制调整指令,其调整方法略有不同。39 每一个4位组中,如果本组数字相加的和不超过9,结果正确。 如果本组的和有进位(超过15),

24、或者虽然没有进位,但是 出现了非法的组合(本组和小于16,大于9),得到的结果是 错误的。用二进制加法指令将两个压缩BCD数相加:1 . 压缩BCD数运算40对相加后的结果作调整:在80X86微处理器上,上述调整由“十进制调整指令”实现。 如果4位组的和有进位, 或者出现了非法组合, 将本组数字加6调整41格式:DAA功能:对AL中的加法结果进行BCD运算调整例:89+57MOVAL, 89H ;BCD数89装入AL,使用16进制数格式ADDAL, 57H ;按照二进制格式相加,(AL)= 0E0H,AF=1DAA ;进行BCD加法调整,(AL)= 46H,CF=1说明:调整之前先进行二进制加

25、法,和必须在AL中。(1)DAA(Decimal Adjust after Addition)十进制加法调整42if (AL低4位9 或 AF=1)thenAL=AL+06H ;AF=1 ;endifif (AL高4位9 或 CF=1)thenAL=AL+60H ;CF=1 ;endifDAA调整算法:43格式:DAS功能:对AL中的减法结果进行BCD运算调整例:8357MOVAL, 83H ;BCD数83装入AL,使用16进制数格式SUBAL, 57H ;按照二进制格式相减,(AL)=2CH, AF=1DAS ;进行BCD减法调整,(AL)=26H, CF=0说明:调整之前先进行二进制减法,

26、差在AL中。 (2)DAS(Decimal Adjust after Subtraction)十进制减法调整44if (AL低4位9 或 AF=1)then AL=AL06H ;AF=1 ;endifif (AL高4位9 或 CF=1)thenAL=AL60H ;CF=1 ; endifDAS调整算法:45两个数的加法要分4次进行。 最低2位数的加法(78+66)用ADD指令相加,DAA指令调整。 其余三次加法用ADC指令相加,DAA指令调整。上面的4次运算可以用循环实现。运算前通过指令“ADD AL, 0”把CF清零,4次加法统一使用ADC指令实现。DATASEGMENTADD1234567

27、8HBDD33445566HXDD?DATAENDS例 用BCD数进行运算:12345678+3344556646DD(define doubleword)DD伪指令用来定义双字,对其后的每个数据分配4个字节(2个字)。该伪指令同样将数据转换为十六进制,并根据低地址存储低字节,高地址存储高字节的规则来存放数据。如下例DATA15的存储情况是:00A8:0F2H,00A9H:57H,00AAH:2AH,00ABH:5CH。用DD存入地址时,第一个字为偏移地址,第二个字为段地址。DQ(define quadword)DQ伪指令用来定义4字,即64位字长的数据,DQ之后的每个数据占用8个字节(4个字

28、)。47ORG00A0H ; 指定起始地址DATA13DD 1023 ; 十进制数DATA14DD 10001001011001011100B ; 二进制数DATA15DD 5C2A57F2H ; 十六进制数DATA16DD 23H,34789H,65533 ; 各种数据48CODESEGMENTASSUME DS: DATA, CS: CODESTART:MOVAX, DATAMOVDS, AXMOVDI, 0;设置指针初值MOVCX, 4;循环次数ADDAL, 0;CF清零NEXT:MOV AL, BYTE PTR ADI;取出A的两位BCD数ADCAL, BYTE PTR BDI;与B的

29、对应两位进行加法DAA;BCD数加法调整MOVBYTE PTR XDI,AL;保存结果INC DI;修改指针LOOPNEXT;计数和循环控制MOVAX, 4C00HINT21HCODEENDSENDSTART 49 程序运行后,(X)=45791244H,结果正确。 如果把“INC DI”指令改为“ADD DI, 1”,运行后 (X)= 45781144H,结果错误。 用TD单步执行程序,发现78H+66H和56H+55H均产生了进位 (CF=1),执行“ADD DI, 1”指令后,CF均被清零,低位的 进位没有传递到高位,导致了错误的发生。 “INC DI”指令不影响CF,程序能够正常运行,

30、这一点在设计指令系统时已经作了充分的考虑。 从本例可以看到,使用CF传递进位时,要细心地选择所使用 的指令。汇编语言程序员,应该十分注意标志位的状态。 50(1) AAA(ASCII Adjust after Addition)非压缩十进制加法调整格式:AAA功能:对AL中的加法结果进行非压缩BCD数运算调整例:9+8 MOV AL, 9 ;非压缩BCD数9装入AL,使用ASCII格式 ADD AL, 8 ;按照二进制格式相加,(AL)= 71H,AF = 1 AAA ;非压缩BCD加法调整,(AL)= 07H,CF = 1说明:调整之前先进行二进制加法,和必须在AL中;低4位的进位用两种方式同时表达:CF=1,AH=AH+1。2 . 非压缩BCD数运算51if (AL低4位9 或 AF=1)thenAL=AL+06H ;AH=AH+1;AF=1 ;CF=1;else AF=0 ;CF=0 ;endifAL=AL AND 0FH;AL高4位清零AAA调整算法

温馨提示

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

评论

0/150

提交评论