微机原理与接口技术汇编语言_第1页
微机原理与接口技术汇编语言_第2页
微机原理与接口技术汇编语言_第3页
微机原理与接口技术汇编语言_第4页
微机原理与接口技术汇编语言_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、8086指令系统分为以下6组: 数据传送指令 算术指令 逻辑指令 串处理指令 控制转移指令 处理机控制指令数据传送指令数据传送指令的功能是把数据、地址传送到寄存器或存储器单元中。它分为4类。 通用数据传送指令 累加器专用传送指令MOV 传送 IN 输入PUSH进栈 OUT 输出POP 出栈 XLAT换码XCHG交换 地址传送指令 标志寄存器传送指令LEA 有效地址送寄存器 LAHF标志送AHLDS 指针送寄存器和DS SAHFAH送标志寄存器LES 指针送寄存器和ES PUSHF 标志进栈 POPF标志出栈1 通用数据传送指令MOVdst, src;传送指令(move)执行操作:(dst) (

2、src)功能: 将源操作数(字节或字)传送到目的地址。注意: 目的操作数dst和源操作数src不能同时用存储器寻址方式,这个限制适用于所有指令; 目的操作数dst不能是CS,也不能用立即数方式; 目的操作数dst和源操作数src不允许同时为段寄存器; MOV指令不影响标志位。PUSH src ; 进栈指令(push onto the stack)执行操作: (SP) (SP)2 (SP) (src)POP dst ; 出栈指令(pop from the stack)执行操作: (dst) (SP) (SP) (SP)+2PUSH和POP指令分别将数据存入堆栈或把堆栈中的数据取出。堆栈是以LIF

3、O(后进先出)方式工作的一个存储区,程序中定义的堆栈段就是这样一个LIFO存储区。数据存入堆栈单元或从堆栈单元中取出都由堆栈指针SP指示,而SP总是指向栈顶,所以进栈和出栈指令都会自动修改SP。PUSH指令执行时,SP的内容先减2,然后将数据压入SP所指示的字单元,存储的方法同样是高8位存入高地址字节,低8位存入低地址字节。POP指令执行时,将SP所指示的栈顶地址的内容取出放入目的地址,然后SP增2,指向新的栈顶地址。注意: PUSH和POP指令只能是字操作,因此存取字数据后,SP的修改必须是2或2; PUSH和POP指令不能使用立即数方式; POP指令的dst不允许是CS寄存器; PUSH和

4、POP指令都不影响标志位。 PUSH指令在程序中常用来暂存某些数据,而POP指令又可将这些数据恢复。XCHG opr1, opr2 ; 交换指令(exchange)执行操作:(opr1) (opr2)XCHG指令使两个操作数opr1,和opr2互相交换,其中一个操作数必须在寄存器中,另一个操作数可以在寄存器或存储器中。注意: 不允许使用段寄存器 不影响标志位 例 假设(DS)=1000H, (SS)=4000H, (SP)=100H, (BX)=2100H, (12100)=00A8H, 指出连续执行下列各条指令后,有关寄存器、存储单元以及堆栈的情况。PUSH DSPUSH BXPUSH BX

5、POP DIPOP WORD PTR DI+2POP DS执行结果: (SP)=100H2=0FEH (SP)=0FE2=0FCH (SP)=0FC-2=0FAH (400FEH)=1000H (400FCH)=2100H (400FAH)=00A8H执行结果: (SP)=0FA+2=0FCH (SP)=0FC+2=0FEH (SP)=0FE+2=100H (DI)=00A8H (100AAH)=2100H (DS)=1000H例 已知(AX)=6634H, (BX)=0F24H, (SI)=0012H, (DS)=1200H, (12F36H)=2500H, 写出下列指令执行的结果。 XCH

6、G AH,AL ; 执行前: (AH)=66H, (AL)=34H; 执行后: (AH)=34H, (AL)=66H XCHG AX,BX+SI; 执行前: (AX)=6634H, (12F36H)=2500H; 执行后: (AX)=2500H, (12F36H)=6634HH  2 累加器专用传送指令这组指令只限于使用累加器(ac:AX 或AL)传送信息。IN ac, port; 输入指令(input), port0FFH执行操作:(AL) (port) 传送字节或 (AX) (port+1,port) 传送字IN ac, DX ; 输入指令, DX中的port0FFH执行操作:(

7、AL) (DX) 传送字节或 (AX) (DX)+1,(DX) 传送字OUT port, ac ; 输出指令(output), port0FFH执行操作:(port) (AL) 传送字节或 (port+1,port) (AX) 传送字 OUT DX, ac ; 输出指令(output), DX中的 port0FFH 执行操作:(DX) (AL) 传送字节或 (DX)+1,(DX) (AX) 传送字对8086及其后继机型的微处理机,所有I/O端口与CPU之间的通信都由输入输出指令IN和OUT来完成。IN指令将信息从I/O输入到CPU,OUT指令将信息从CPU输出到I/O端口,因此,IN和OUT指

8、令都要指出I/O端口地址。微处理机分配给外部设备最多有64K个端口,其中前256个端口(0FFH)称为固定端口,可以直接在指令中指定。当端口地址超过8位(256),称为可变端口,它必须先送到DX寄存器,然后再用IN或OUT指令传送信息。CPU与I/O端口传送信息的寄存器只限于累加器ac (AX或AL),传送16位信息用AX,传送8位信息用AL,这取决于外设端口的宽度。注意: 只限于在AL或AX与I/O端口之间传送信息 不影响标志位XLAT ; 换码指令(translate)执行操作: (AL) (DS)×16(BX)+(AL)这条指令根据AL寄存器提供的位移量,将BX指示的字节表格中

9、的代码换存在AL中。该指令还可写为:XLAT opr,opr为字节表格的首地址,因为opr所表示的偏移地址已存入BX寄存器,所以opr在换码指令中可有可无,有则可提高程序的可读性。注意: 所建字节表格的长度不能超过256字节,因为存放位移量的是8位寄存器AL; XLAT指令不影响标志位。  例 IN AL, 61H ; (AL) 端口61H的内容MOV DX, 278H ; (DX) 端口地址278H IN AL, DX ; (AL) 端口278H的内容例 OUT 61H, AL ; 61H端口 (AL)MOV DX, 279H ; (DX) 端口地址279HOUT DX, AX ;

10、 279H端口 (AX)  3 地址传送指令这组指令完成把地址送到指定寄存器的功能。LEA reg, src ; 有效地址送寄存器(load effective address)执行操作:(reg) offset of srcLEA指令把源操作数的有效地址送到指定的寄存器,这个有效地址是由src选定的一种存储器寻址方式确定的。LDS reg, src ; 指针送寄存器和DS(load DS with point)执行操作: (reg) (src)(DS) (src+2)LES reg, src ; 指针送寄存器和ES(load ES with point)执行操作: (reg) (s

11、rc)(ES) (src+2)LDS和LES指令把确定内存单元位置的偏移地址送寄存器,段地址送DS或ES。这个偏移地址和段地址(也称地址指针)是由src指定的两个相继字单元提供的。 注意: 指令中的reg不能是段寄存器; 指令中的src必须使用存储器寻址方式; 该指令不影响标志位。   例假设某数据段定义如下:0000 DATASEGMENT0000 0040 TABLE DW 0040H0002 3000 DW 3000H0004 DATAENDS请指出下列指令的执行结果,并说明它们之间的区别。 MOV BX, TABLE LEA BX, TABLE MOV BX, OF

12、FSET TABLE 答:第条指令执行后,(BX)=0040H,第条指令执行后,(BX)=0000,第条指令执行后,(BX)=0000。比较两条指令,第条MOV指令是用直接寻址方式把变量TABLE的内容送入BX,而LEA指令是把TABLE的地址送入BX。比较两条指令可以看到,LEA和用OFFSET指示符实现的功能是相同的,都是将TABLE的偏移地址0000送BX。既然功能相同,它们之间还有什么区别呢?首先,LEA指令可以使用各种存储器寻址方式,如,LEA BX,DI,LEA BX,TABLEDI,LEA SI,BX+DI等,这些指令都是把计算出来的有效地址送目的寄存器,而OFFSET不能使用这

13、些寻址方式,它只作用于像TABLE这样的简单变量(或标号)。 其次,对简单变量,OFFSET指示符比LEA执行速度快,因为MOV BX, OFFSET TABLE指令在汇编时,由汇编程序计算出了TABLE的偏移地址,并被汇编成立即数传送指令,因此效率很高,而LEA指令是在执行时才计算地址,然后再传送到指定寄存器,因此执行速度相对慢一些。 例 对例3.17的数据定义,下列两条指令的执行结果是什么? LDS BX, TABLE LES BX, TABLE答:LDS指令执行后,(BX)=0040H, (DS)=3000HLES指令执行后,(BX)=0040H, (ES)=3000H4 标志寄存器传送

14、指令这组指令完成和标志位有关的操作。LAHF 标志寄存器的低字节送AH(load AH with flags)SAHF AH送标志寄存器低字节(store AH into flags)PUSHF 标志进栈(push the flags)POPF 标志出栈(pop the flags)注意: LAHF和SAHF指令隐含的操作寄存器是AH和FLAGS LAHF和PUSH不影响标志位,SAHF和POPF则由装入的值来确定标志位的值。LAHF 标志寄存器的低字节送AH(load AH with flags) 执行操作: (AH) (FLAGS)0-7SAHF AH送标志寄存器低字节(store AH

15、into flags) 执行操作: (FLAGS) 0-7 (AH)PUSHF 标志进栈(push the flags) 执行操作: (SP) (SP)2 (SP)+1,(SP) (FLAGS)0-15POPF 标志出栈(pop the flags) 执行操作: (FLAGS) 0-15 (SP)+1,(SP) (SP) (SP)+2算术指令包括加、减、乘、除指令,它包括对二进制数进行的算术运算的指令,以及对十进制数(用BCD码表示)运算进行调整的指令。执行算术指令都会影响条件标志位,条件标志位包括CF、PF、AF、ZF、SF和OF,它们标志算术运算结果的特征。   加法指令 减法指

16、令ADD 加法 SUB 减法ADC 带进位加 DEC 减1INC 加1 NEG 求补 CMP 比较 乘法指令 除法指令MUL 无符号数乘法 DIV 无符号数除法IMUL带符号数乘法IDIV带符号数除法 符号扩展指令 十进制调整指令CBW 字节转换为字 DAA加法的十进制调整CWD 字转换为双字 DAS 减法的十进制调整 AAA 加法的ASCII调整 AAS 减法的ASCII调整 AAM 乘法的ASCII调整 AAD 除法的ASCII调整1 加法指令ADD dst,src 加法指令(addition)执行操作: (dst) (src)(dst)ADC dst,src 带进位加指令(add wit

17、h carry)执行操作: (dst) (src)(dst)CFINC opr 加1指令(increment)执行操作: (opr) (opr)1ADD和ADC指令是双操作数指令,它们的两个操作数不能同时为存储器寻址方式,也就是说,除源操作数为立即数的情况外,源和目的操作数必须有一个是寄存器寻址方式。INC指令是单操作数指令,它可以使用除立即数方式外的任何寻址方式。ADD和ADC指令影响条件标志位(也称条件码),INC指令影响除CF外的其它条件码。条件码中最主要的是SF、ZF、CF和OF,加法运算对这四个条件码的设置方法如下:SF=1 加法结果为负数(符号位为1)SF=0 加法结果为正数(符号

18、位为0)ZF=1 加法结果为零ZF=0 加法结果不为零CF=1 最高有效位向高位有进位CF=0 最高有效位向高位无进位OF=1 两个同符号数相加(正数+正数,或负数加负数),结果符号与其相反OF=0 不同符号数相加时,或同符号数相加,结果符号与其相同计算机在执行运算时,并不区别操作数是带符号数还是无符号数,一律按上述规则设置条件码,因此,程序员要清楚当时处理的是什么类型的数据。例如,当加法运算结果的最高有效位为1时,机器将SF置1。如果参加运算的是两个带符号数,那么和的最高有效位是符号位,SF置1说明结果是一个负数。如果参加运算的是两个无符号数,那么和的最高有效位也是数值位,此时SF置0或置1

19、都失去了表示正负数的意义。对带符号数和无符号数,它们表示结果溢出的条件标志位也是不同的。上述OF位的设置条件显然只符合带符号数的溢出情况,OF=1表示运算结果是错误的。而无符号数溢出(运算结果超出了有限位的表示范围)时,表现为最高有效位产生进位,因此,CF=1是无符号数溢出的标志。另外,在双字长数运算时,低位字相加设置的CF,说明低位字向高位字有无进位的情况。 例 MOV BX,9B8CH ; (BX)=9B8CHADD BX,6478H ; now (BX)=0000H9B8A1001 1011 1000 1010+ 6476 + 0110 0100 0111 0110- -1 0000 1

20、 0000 0000 0000 0000条件码设置: SF=0 最高有效位(D15)为0 ZF=1 结果为0 CF=1 最高有效位向高位有进位 OF=0 不同符号数相加,不产生溢出例 编写执行双精度数(DX,CX)和(BX,AX)相加的指令序列,DX是目的操作数的高位字,BX是源操作数的高位字。指令执行前:(DX,CX)= A248 2AC0H,(BX,AX)= 088A E25BH。 指令序列: ADD CX, AX ;(CX)= 0D1BHADC DX, BX ; now,(DX)=0AAD3H 执行ADD指令:2AC0 0010 1010 1100 0000+ E25B + 1110 0

21、010 0101 1011- -1 0D1B 1 0000 1101 0001 1011条件码设置: SF=0 最高有效位(D15)为0,无符号位意义 F=0结果不为0 CF=1 最高有效位向高位有进位 OF=0 加数最高位分别为0、1,溢出位置0,OF对低位字无溢出意义执行ADC指令: A248 1010 0010 0100 1000 088A 0000 1000 1000 1011 + 1 + 1CF- - AAD3 1010 1010 1101 0011条件码设置: SF=1 最高有效位(D31)为1,对带符号数运算表示结果为负 ZF=0 结果不为0 CF=0 最高有效位向高位无进位 O

22、F=0 结果符号与操作数相同,未产生溢出2 减法指令SUB dst,src 减法指令(subtract)执行操作: (dst) (dst)(src)SBB dst,src 带借位减法指令(subtract with borrow)执行操作: (dst) (dst)(src)CFDEC opr 减1指令(decrement)执行操作: (opr) (opr)1CMP opr1,opr2 比较指令(compare)执行操作: (opr1)(opr2),根据相减结果设置条件码,但不回送结果以上指令除DEC指令不影响CF外,其他都影响条件码。与加法类似,SF和ZF分别表示减法结果的符号以及为零的情况;

23、CF表明无符号数相减结果溢出与否;OF表明带符号数相减结果溢出与否。但在对CF和OF位的设置方法上减法和加法有所不同,下面对此做进一步说明:CF=1 二进制减法运算中最高有效位向高位有借位(被减数减数,不够减的情况)CF=0 二进制减法运算中最高有效位向高位无借位(被减数减数,够减的情况)OF=1 两数符号相反(正数负数,或负数正数),而结果符号与减数相同OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同NEG opr 求补指令(negate)执行操作: (opr) (opr),求补操作即把操作数变为与其符号相反的数:。机器在执行求补指令时,把操作数各位求反后末位加1,因此执行的

24、操作也可表示为:(opr) 0FFFFH(opr)1NEG指令的条件码设置方法为:CF=1 不为0的操作数求补时CF=0 为0的操作数求补时OF=1 当求补运算的操作数为128(字节)或32768(字)时OF=0 当求补运算的操作数不为128(字节)或32768(字)时 例 字长为8位的两数相减,其可表示数的范围为:带符号数128127(80H7FH),无符号数0255(0FFH)。运算结果超出可表示数范围即为溢出,说明结果错误。 43H16H=2DH 0100 0011 0100 0011 条件码设置:CF=0 0001 0110 + 1110 1010 OF=0- - 0010 1101

25、1 0010 1101说明:机器作减法运算时,先将减数求补,然后转化为加法运算,所以实际上机器设置CF的方法是:最高有效位不产生进位时,CF=1;最高有效位产生进位时,CF=0。这和做减法时有借位CF=1,无借位CF=0是一致的。本例参加运算的数无论是看作带符号数还是无符号数,运算结果均有效。 0C8H66H=62H 1100 1000 1100 1000 条件码设置:CF=0 0110 0110 + 1001 1010 OF=1- - 0110 0010 1 0110 0010说明:如果是无符号数的运算,被减数够减无借位,所以CF置0,表明结果有效。如果操作数是带符号数,且被减数与减数符号相

26、反,而结果符号与减数符号相同,所以OF置1,表明结果无效。 54H-76H=0DEH0101 0100 0101 0100 条件码设置:CF=1 0111 0110 + 1000 1010 OF=0 - -1101 1110 1101 1110说明:如果是无符号数的运算,本例中被减数减数,减运算向高位有借位(或加运算无进位),则CF置0,表明结果无效。如果是带符号数的运算,同符号数相减,OF置0,结果有效。 4BH0B6H=0DEH0100 1011 0100 1011 条件码设置:CF=1 1011 0110 + 0100 1010 F=1 - -1001 0101 1001 0101说明:

27、如果是无符号数的运算,本例中被减数减数,减运算向高位有借位(或加运算无进位),则CF置0,表明结果无效。如果是带符号数的运算,不同符号数相减,且结果符号与减数符号相同,OF置1,结果也是无效的。例 分析下列程序的执行情况:DATA_A DD 62562FAHDATA_B DD 412963BHRESULT DD ? MOV AX, WORD PTR DATA_A ; (AX)=62FAHSUBAX, WORD PTR DATA_B ; sub 963BH from AXMOVWORD PTR RESULT, AX ; save the resultMOVAX, WORD PTR DATA_A+

28、2 ; (AX)=0625HSBBAX, WORD PTR DATA_B+2 ; sub 0412H with borrowMOVWORD PTR RESULT, AX ; save the result答:SUB指令执行后,(AX)= 62FAH963BH=0CCBFH,CF=1(有借位)。执行SBB指令后,(AX)= 625H412H1=212H,CF=0,OF=0,因此,保存于RESULT的结果数据为0212CCBFH。  3 乘法指令MUL src 无符号数乘法(unsigned multiple)IMULsrc 带符号数乘法(signed multiple)字节操作: (A

29、X) (AL)×(src)字操作: (DX, AX) (AX)×(src)MUL和IMUL指令的区别仅在于操作数是无符号数还是带符号数,它们的共同点是,指令中只给出源操作数src,它可以使用除立即数方式以外的任一种寻址方式。目的操作数是隐含的,它只能是累加器(字运算为AX,字节运算为AL)。隐含的乘积寄存器是AX或DX(高位)和AX(低位)。乘法指令只影响CF和OF,其它条件码位无定义。无定义是指指令执行后,条件码位的状态不确定,因此它们是无用的。MUL指令的条件码设置为:CF OF= 0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX))CF OF= 1 1 乘

30、积的高一半不为0这样的条件码设置可以指出字节相乘的结果是8位(CF=0)还是16位(CF=1),字相乘的结果是16位(CF=0)还是32位(CF=1)。IMUL指令的条件码设置为:CF OF= 0 0 乘积的高一半为低一半的符号扩展CF OF= 1 1 其他情况符号扩展是指做字节乘法时,乘积低8位的最高位为0,高8位也扩展为0,或者低8位的最高位为1,高8位也扩展为1的情况。对两个字相乘,符号扩展是指乘积的低16位的最高位为0,高16位也扩展为0,或者低16位的最高位为1,高16位也扩展为1的情况。 例 无符号数乘法; from the data segmentDATA1 DB 25HDATA

31、2 DB 65HRESULTDW ?; from the code segmentMOV AL,DATA1MOV BL,DATA2MUL BL ; register addressing modeMOV RESULT,AXorMOV AL,DATA1MUL DATA2 ; direct addressing modeMOV RESULT,AXorMOV AL,DATA1MOV SI,OFFSET DATA2MUL BYTE PTR SI ;register indirect addressing modeMOV RESULT,AX本例25H×65H=0E99H,高16位不为0,所以C

32、F=1,OF=1。例DATA3 DW 2378HDATA4 DW 2F79HRESULT1 DW 2 DUP(?) MOV AX, DATA3 ; load first operand into AXIMUL DATA4 ; multiply it by the second operandMOV RESULT1, AX ; store the lower word resultMOV RESULT1+2, DX ; store the higher word result本例2378H×2F79H=0693 CBB8H,即(DX)=0693H,(AX)=0CBB8H。因为高16位不

33、是低16位的符号扩展,所以条件码设置为CF=1,OF=1。4 除法指令DIV src 无符号数除法(unsigned divide)IDIVsrc 带符号数除法(signed divide)字节操作: (AL) (AX) / src 的商(AH) (AX) / src 的余数字操作: (AX) (DX, AX) / src 的商(DX) (DX, AX) / src 的余数 参加运算的除数和被除数是无符号数时,使用DIV指令,其商和余数也均为无符号数。IDIV指令执行的操作与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,而且余数的符号与被除数的符号相同。这两条除法指令的被除数必须

34、存放在AX或DX,AX中,源操作数src作为除数,可用除立即数以外的任一种寻址方式来取得。除法指令对所有条件码均无定义,因此对除法指令产生的错误,如除数为0或商溢出等错误,程序员都不能用条件码进行判断,而是由系统直接转入0型中断来处理。所谓商溢出,是指被除数高一半的绝对值大于除数的绝对值时,商超出了16位的表示范围(字操作)或8位的表示范围(字节操作)。由于使用除法指令的需要,经常要将字节数据扩展为字数据,或者将字数据扩展为双字数据,所以我们先介绍下面的符号扩展指令,然后再对除法指令举例。3.3.2.5 符号扩展指令CBW 字节扩展为字(convert byte to word)执行操作:(A

35、H)= 00H 当(AL)的最高有效位为0时(AH)= FFH 当(AL)的最高有效位为1时CWD 字扩展为双字(convert word to double word)执行操作:(DX)=0000H当(AX)的最高有效位为0时(AH)=FFFFH当(AX)的最高有效位为1时这是两条无操作数指令,进行符号扩展的操作数必须存放在AL寄存器或AX寄存器中。这两条符号扩展指令都不影响条件码。注意:除法指令要求字操作时,被除数必须为32位,除数是16位,商和余数是16位的;字节操作时,被除数必须为16位,除数是8位,得到的商和余数是8位的。 例 假设(AX)= 0BA45H,下列指令分别执行后的结果是

36、什么? CBW ; 执行后,(AH)=00, (AL)=45H, 或 (AX)=0045H CWD ; 执行后,(DX)=0FFFFH, (AX)=0BA45H 例 编写程序,分别实现下列数据的无符号除法和带符号除法。 DATA7 DW 9400H ; numerator DATA8 DW 0060H ; denominator QUOT DW ? ; quotient REMAINDW ? ; remainder ; unsigned divideMOV AX,DATA7 ; AX holds numeratorMOV DX,0 ; (DX,AX)= 0000 9400HDIV DATA8

37、; unsigned divideMOV QUOT,AX ; quotient is in AX,(AX)=018AHMOV REMAIN,DX; remainder is in DX,(DX)=0040H ; signed divideMOV AX,DATA7 ; (AX)=9400HCWD ; (DX,AX)=0FFFF, 9400HIDIVDATA8; signed divideMOV QUOT,AX; quotient is in AX,(AX)=0FEE0HHMOV REMAIN,DX; remainder is in DX,(DX)=03.3.2.6 十进制调整指令80x86微型机

38、提供了一组十进制调整指令,用来处理ASCII码和BCD码表示的数。BCD码:BCD(Binary Coded Decimal)是用二进制编码表示的十进制数(见表3.3),十进制数采用09十个数字,是人们最常用的。在计算机中,同一个数可以用两种BCD格式来表示:压缩的BCD码 非压缩的BCD码压缩的BCD码:压缩的BCD码用4位二进制数表示一个十进制数位,整个十进制数用一串BCD码来表示。例如,十进制数59表示成压缩的BCD码为0101 1001,十进制数1946表示成压缩的BCD码为0001 1001 0100 0110。非压缩的BCD码:非压缩的BCD码用8位二进制数表示一个十进制数位,其中

39、低4位是BCD码,高4位是0。例如,十进制数78表示成压缩的BCD码为0000 0111 0000 1000。 从键盘输入数据时,计算机接收的是ASCII码,要将ASCII码表示的数转换成BCD码是很简单的,只要把ASCII码的高4位清零即可。压缩的BCD码调整指令DAA和DAS指令完成加法和减法的调整功能。DAA 加法的十进制调整(decimal adjust for addition)执行操作:(AL) 把AL中的和调整为压缩的BCD格式DAS 减法的十进制调整(decimal adjust for subtraction)执行操作:(AL) 把AL中的差调整为压缩的BCD格式DAA和DA

40、S指令的调整方法如下:执行加法指令(ADD、ADC)或减法指令(SUB、SBB)后,1如果结果的低4位 (AL)039或AF=1,则(AL)(AL)±06H,且AF置1;2如果结果的高4位 (AL)479或CF=1,则(AL)(AL)±60H,且CF置1。对上述方法,加法调整作+06H和+60H,减法调整作06H和60H。这两个调整的条件,如果满足其一,则±06H或±60H;如果同时满足,则±06H后,再±60H。非压缩的BCD码调整指令AAA 加法的ASCII调整(ASCII adjust for add)执行操作:(AL) 把AL

41、中的和调整为非压缩的BCD格式(AH)(AH)+ 调整产生的进位值AAS 减法的ASCII调整(ASCII adjust for sub)执行操作:(AL) 把AL中的差调整为非压缩的BCD格式(AH)(AH) 调整产生的借位值加法和减法的操作数可以直接使用ASCII码,而不必把高位0011清为0000,AAA和AAS指令就是专门为ASCII码操作数或非压缩BCD码操作数的加减法而设计的。AAA和AAS的调整方法如下:执行加法指令(ADD、ADC)或减法指令(SUB、SBB)后,结果存放在AL寄存器中:(1)如果(AL)03= 09,且AF=0,则(AL)47= 0,AF的值送CF;(2)如果

42、(AL)03=AF,或AF=1,则(AL)(AL)±06H,(AL)47= 0,(AH)(AH)±1,AF的值送CF。AAA和AAS指令除影响AF和CF标志外,其余标志位均无定义。AAM 乘法的ASCII调整(ASCII adjust for mul)执行操作:(AX) 把AX中的积调整为非压缩的BCD格式AAD 除法的ASCII调整(ASCII adjust for div)执行操作:(AX) AX中的被除数(非压缩的BCD格式)转化为二进制数以上两条指令是专为非压缩的BCD码的乘除法而设计的,它们将乘法和除法的结果转换为非压缩的BCD码。注意:AAM和AAD都只对AX寄

43、存器中的数进行调整,它们只影响SF、ZF和PF标志位,其它标志位无定义。AAM的调整方法为:执行乘法指令(MUL)后,调整存放在AL寄存器中的乘积:(AH)(AL)/ 0AH的商(AL)(AL)/ 0AH的余数AAM实际上是将两个一位数的非压缩BCD码相乘后得到的乘积进行二化十的转换,十位数放在AH中,个位数放在AL中,那么AX中就是乘积的非压缩BCD码。注意:如果是两个ASCII码数相乘,要先将它们转换成非压缩BCD码。AAD的调整方法为:执行除法指令之前,对AX中的非压缩BCD码(被除数)执行:(AL)(AH)×10(AL)(AH) 0与其它调整指令不同的是,AAD用在DIV指令

44、之前,即先将AX中的被除数调整成二进制数,并存放在AL中,再用DIV指令作二进制数的除法。AX中的被除数是二位非压缩BCD码,AH中的十位数乘10,再加上AL中的个位数,即转换为二进制数。表3.3 ASCII和BCD码十进制数字ASCII码压缩BCD码非压缩BCD码00011 000000000000 000010011 000100010000 000120011 001000100000 001030011 001100110000 001140011 010001000000 010050011 010101010000 010160011 011001100000 011070011

45、011101110000 011180011 100010000000 100090011 100110010000 1001例 ASCII码转换为BCD码。ASC DB '9562481273' ; ASCII stringORG 0010HUNPACKDB 10 DUP(?); store BCD number MOV CX,10 ; load the counterSUB BX,BX ; clear BXAGAIN:MOV AL,ASCBX; move to AL content of mem BX+ASCAND AL,0FH ; mask the upper nibbl

46、eMOV UNPACKBX,AL ; move to mem BX+UNPACK the ALNC BX ; make the pointer to point at next ASCII numberLOOP AGAIN ; loop until finished上例中的AND指令完成逻辑与操作,AL寄存器的内容和0FH相与,结果使ASCII码的高4位清零,低4位保持不变,于是一个ASCII码数就转换成了BCD码。 例 编写程序,实现BCD数据的加法和减法。 BCD3BCD1BCD2 ; BCD3=27841839=4623 BCD3BCD1BCD2 ; BCD3=27841839=0945编写程序如下:DATA SEGEMENTBCD1 DB 84H,27H ; BCD format of 2784BCD2 DB 39H,18H ; BCD format

温馨提示

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

评论

0/150

提交评论