第11章数码转换.ppt

上传人:本田雅阁 文档编号:2576683 上传时间:2019-04-11 格式:PPT 页数:70 大小:318.51KB
返回 下载 相关 举报
第11章数码转换.ppt_第1页
第1页 / 共70页
第11章数码转换.ppt_第2页
第2页 / 共70页
第11章数码转换.ppt_第3页
第3页 / 共70页
亲,该文档总共70页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第11章数码转换.ppt》由会员分享,可在线阅读,更多相关《第11章数码转换.ppt(70页珍藏版)》请在三一文库上搜索。

1、第11章 数码转换,11.1 ASCII格式 11.2 二十进制码(BCD码) 11.3 ASCII数转换为二进制 11.4 二进制转换成ASCII格式,11.1 ASCII格式,计算机只能进行二进制算术运算,正如我们在第10章所见到的那样。但是,程序处理的大量数据,并不都是采用二进制格式;例如,从键盘输入的数是ASCII格式,类似地,在屏幕上显示的数也是ASCII格式。所以,在计算机应用中,常常需要进行数与代码的转换。,例如,从键盘输入的数(二进制数、十进制数、十六进制数)是以该进制的ASCII数形式表示的,在对这些数据进行运算前,必须将其转换为计算机内部所能处理的二进制数或BCD数的形式。

2、同时,要把已处理过的中间结果或最后结果输送出设备(如显示器、打印机),在此之前必须先把数据转换成ASCII格式才可以输出。图11-1给出了ASCII码表示的二进制、十进制、十六进制与二进制之间的转换。如图11-1所示。,图11-1 ASCII码表示的X进制二进制转换示意图,例如,十进制23用二进制数表示为00010111,用十六进制表示为17。在ASCII码中每个数字占一个字节,23的ASCII码是十六进制的3233。 本章将讨论数与ASCII之间的转换。,因为数据和信息都是以ASCII格式输入的。所以,若由键盘输入字符ASM存入内存,在内存中是以十六进制41 53 4D表示;而十进制数123

3、4在内存的表示方法则是十六进制的31 32 33 34。 下列指令可以对ASCII数直接进行算术运算。,AAA 对于加法的ASCII调整 AAS 对于减法的ASCII调整 AAM 对于乘法的ASCII调整 AAD 对于除法的ASCII调整 这些指令均不需要操作数,调整的对象是AX寄存器。调整的结果是非压缩型的二十进制数,结果仍然在AX内。二十进制数在11.2节有介绍。,11.1.1 ASCII加法 研究下面十进制ASCII数相加的结果(8+4): 十六进制: 38 + 34 和: 6C 十六进制数6C既不是正确的ASCII和,也不是正确的二进制数。然而,若忽略左边的6,将右边的十六进制C加上6

4、,结果为十六进制12,就成为十进制的正确答案。AAA指令就是作此调整。,例如,假设AX中含有十六进制0038,BX中含有十六进制0034,38和34代表两个相加的十进制ASCII数。加法与调整如下: ADD AL,BL ;38加34 AAA ;对ASCII相加的调整 AAA指令检查AL寄存器最右边的十六进制数(4位)。如果此数在A与F之间或AF标志为1,将AL寄存器加上6,AH寄存器加上1,并且设定标志位AF与CF为1。任何情况下,AAA将把AL寄存器最左边的十六进制数6清除为0。,以上指令在AX中的执行结果为: ADD AL,BL ;执行之后AX:006C AAA ;执行之后AX:0102

5、为了恢复十进制ASCII数的表示,只要将AH与AL最左边的十六进制数改为3即可。例如: OR AX,3030H ;结果为3132,对于1个字节的ASCII数相加来说,这样做就可以了。但是,多字节的ASCII数相加就需要一个循环,该循环从低字节到高字节进行处理,并把进位计算在内。例11.1是把两个3字节的十进制ASCII数相加,并产生4字节的和存于ASCTOTAL单元。,源程序清单如下: ; filename:L111.ASM TITLE ASCADD(COM) Add ASCII numbers CODESG SEGMENT PARA CODE ASSUME CS:CODESG,DS:CODE

6、SG,SS:CODESG ORG 100H BEGIN: JMP SHORT MAIN ; ,ASC1 DB 548 ;ASCII项 ASC2 DB 748 ASCTOTAL DB 0000 ; MAIN PROC NEAR CLC ;加ASCII值 LEA SI, ASC1+2 ;初始化ASCII LEA DI, ASC2+2 ;数的地址 LEA BX, ASCTOTAL+3,MOV CX, 03 ;初始化3次循环 A20: MOV AH,00 MOV AL,SI ;ASCII字节装入AL ADC AL,DI ;加(带进位) AAA ;ASCII调整 MOV BX, AL ;存放和 DEC

7、SI DEC DI,DEC BX LOOP A20 ;循环3次 MOV BX, AH ;存进位 RET MAIN ENDP CODESG ENDS END BEGIN,应注意以下几点: (1) 加法需采用ADC指令,因为可能有进位的情况发生。起点的CLC指令将CF标志清0。 (2) 因为AAA指令会将AH加1,所以每次循环均需要用MOV指令清除AH。ADC会计算每次的进位情况。注意,若使用XOR与SUB清除AH时将会改变CF标志位的内容。 (3) ADC用于做加法,因为它能自动地把进位从AL加到AH。,(4) 当循环结束时,程序把AH传送到ASCTOTAL最左边的字节。 (5) 最后结果:AS

8、CTOTAL中的和是01 02 09 06。为了使和再成为ASCII码, 可以将十六进制30与和的每个字节进行或运算,结果是31 32 39 36,即十进制的1296。,因为OR指令要设置进位标志CF,并会改变ADC指令所产生的影响,所以程序一般不用OR指令把高4位变成3。一个解决方法是将标志寄存器内容压入堆栈,保存标志的原来设置,执行OR指令,然后把标志寄存器内容从堆栈中弹出,再恢复标志的原设置。例如:,ADC AL,DI ;带进位加 AAA ;对ASCII进行调整 PUSHF ;保存标志 OR AL,30H ;变成ASCII码 POPF ;恢复标志 MOV BX,AL ;存放和,LAHF指

9、令(LOAD AH with Flags)和SAHF指令(Store AH in Flag Register)可取代PUSHF和POPF两指令。LAHF将标志位SF、ZF、PF、CF送入AH寄存器;SAHF则将AH寄存器的内容存回各标志位中。在本例中是使用AH寄存器来存放算术进位的。,11.1.2 ASCII减法 AAS指令(减法的ASCII调整)的操作非常像AAA。AAS检查AL低4位的十六进制数。如果该数在A到F之间或辅助进位AF为1,则从AL中减去6,从AH中减去1,并且设置辅助进位标志AF和进位标志CF为1。在任何情况下,AAS都要清除AL高4位的十六进制数为0000。,以下两个例子假

10、定ASC1是十六进制38,ASC2是十六进制34,第一个例子是从ASC1中减去ASC2,AAS不需要进行调整,因为右边的十六进制数是小于十六进制A的: AX AF CF MOV AL,ASC1 ;0038 SUB AL,ASC2 ;0004 0 0 AAS ;0004 0 0 OR AL,30H ;0034,第二个例子是从ASC2减去ASC1,由于结果的右边数是十六进制的C,所以AAS 从AL中减去6,从AH中减去1,并设置AF和CF标志为1: AX AF CF MOV AL,ASC2 ;0034 SUB AL,ASC1 ;00FC 1 1 AAS ;FF06 1 1 答案:差是-4,06是-

11、4十的补数;所以,十进制10+(-4)=6。,11.1.3 ASCII 乘法 AAM乘法调整指令用于对AX寄存器中积的结果进行调整。进行ASCII数的乘法之前,首先需要把它们十六进制高4位的3清为0,然后使用乘法指令MUL。例如,ASCII数31 32 33 34转换成非压缩型的十进制数为01 02 03 04。另外,由于每次只是调整一个字节,所以必须用循环重复的方法进行乘法运算。,AAM指令是把AL除以10并把商存放到AH中,把余数存放到AL中(注意,此处与前面所讲的除法指令对结果的处理不一样)。例如,假设AL中内容为十进制ASCII数35,BL中内容为十进制ASCII数39,以下的指令是把

12、AL内容乘以BL内容,并把结果转换成十进制ASCII数:,指令 注释 AX BL ;初始值 0035 39 AND BL,0FH ;把BL转换成09 0035 09 AND AL,0FH ;把AL转换成05 0005 09 MUL BL ;AL乘以BL 002D 09 AAM ;把AX转换成非压缩的BCD 0405 OR AX 3030H ;把AX转换成ASCII 3435,MUL运算在AX中产生002DH(45),AAM把这个值除以0AH,产生的商04在AH中,而余数05在AL中,然后OR指令把非压缩的BCD数转换成ASCII数。 例11.2中的程序是4字节ASCII被乘数与1字节ASCII

13、乘数的相乘,因为AAM只适用于一个字节的处理,所以程序要使用循环从右到左一次处理一个字节。最后乘积是01 08 09 01 05。 如果乘数大于一个字节,那么你还必须提供另外一个循环来处理乘数。若把ASCII数据转换成二进制格式,再相乘可能更为简单。下一节会涉及到这一问题。,例11.2 十进制ASCII 数相乘。 源程序清单如下: ; file name:L112.ASM TITLE ASCMUL (COM) Multiply ASCII numbers CODESG SEGMENT PARA CODE ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H

14、 BEGIN: JMP MAIN ; ,MULTCND DB 3783 ;ASCII项 MULTPLR DB 5 ASCPROD DB 5 DUP (0) ; MAIN PROC NEAR MOV CX,04 ;初始化4次循环 LEA SI,MULTCND+3 LEA DI,ASCPROD+4 AND MULTPLR,0FH ;清除ASCII 3,A20: MOV AL,SI ;装入ASCII字符 AND AL,0FH ;清除ASCII 3 MUL MULTPLR ;乘 AAM ;ASCII调整 ADD AL,DI ;加到 AAA ;所存放的 MOV DI,AL ;乘积上 DEC DI MOV

15、 DI,AH ;存放乘积的进位,DEC SI LOOP A20 ;循环4次 RET MAIN ENDP CODESG ENDS END BEGIN,11.1.4 ASCII除法 AAD指令在除法之前提供对于十进制ASCII被除数的调整。首先要从ASCII字节中清除最左边的3,以产生非压缩型十进制。AAD允许将两个字节的被除数放在AX中。除数可以是单字节的01到09。 假定AX是十进制ASCII数,为32 38,CL是除数的ASCII数,为37。以下各指令实现调整与除法:,指令 注释 AX CL ;初始值 32 38 37 AND CL, 0FH ;转换成非压缩的BCD 32 38 07 AND

16、 AX, 0F0FH ;转换成非压缩的BCD 02 08 AAD ;转换成二进制 00 1C DIV CL ;除以7 00 04,AAD指令是使AH乘以10(十六进制0A),把乘积20(十六进制14)加到AL上,并且清除AH ,结果是十六进制001C,即十进制的28。 例11.3中的程序用于实现1字节的除数去除4字节被除数。程序从左到右处理被除数,LODSB从DIVDND中取一个字节到AL中,余数存于AH寄存器中,商是00 09 02 04,而在AH中的余数是02。 如果除数大于一个字节,那么你还必须提供另一个循环来处理除数。(还有更好的办法,见后面的ASCII数转换成二进制一节。),例11.

17、3 十进制ASCII数除法。 源程序清单如下: ; filename:L113.ASM TITLE ASCDIV (COM) Divide ASCII numbers CODESG SEGMENT PARA CODE ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP SHORT MAIN,; DIVDND DB 3698 ;ASCII项 DIVSOR DB 4 QUOTNT DB 4 DUP (0) ; MAIN PROC NEAR MOV CX, 04 ;初始化4次循环 SUB AH, AH ;清除被除数的左边字节,AND DI

18、VSOR,0FH ;清除ASCII 3的除数 LEA SI, DIVDND LEA DI, QUOTNT A20: LODSB AND AL,0FH ;清除ASCII 3 AAD ;除法调整 DIV DIVSOR ;除,STOSB ;存商 LOOP A20 ;循环4次 RET MAIN ENDP CODESG ENDS END BEGIN,11.2 二十进制码(BCD码),BCD码实际上是十进制数的二进制编码,即BCD(Binary Coded Decimal)码,就是用4位二进制数来表示1位十进制数。十进制数与BCD码对照表如表11-1所示。,表11-1 十进制数与BCD码对照表,在80X8

19、6系统中,允许使用两种BCD码:非压缩型BCD码和压缩型BCD码。 1. 非压缩型BCD码 非压缩型BCD码,以8位二进制数表示1位十进制数,是以低4位表示十进制数,而高4位为0000。例如,十进制8902的非压缩型BCD码可表示为: 二进制表示: 0000 1000 0000 1001 0000 0000 0000 0010 十六进制表示: 08 09 00 02,2. 压缩型BCD码 压缩型BCD码以4位二进制数表示1位十进制数。例如,十进制数8902的压缩型BCD码为: 二进制表示: 1000 1001 0000 0010 十六进制表示: 89 02 表11-2是十进制数0294三种码的

20、表示形式。,表11-2 0294的 ASCII码、非压缩型BCD码、压缩型BCD码,3. 压缩型BCD数的转换与运算 可以对BCD数进行加、减法运算,相应地有两条调整指令: DAA ;加法的十进制调整 DAS ;减法的十进制调整 这些调整指令一次只能处理一个字节。DAA调整AL中的两个压缩型的BCD数相加的结果,而DAS调整它们相减的结果。(再次提醒:你必须每次一个字节一个字节地处理压缩型的BCD数。),在AL中的BCD数的和是由两个4位二进制数组成的,即两位十六进制数。如果右边数的值超过9或AF标志被设定为1,那么DAA向AL加6并把AF设定为1。如果现在AL中的值超过99 或CF被设定为1

21、,那么DAA向AL加60并把CF设定为1,否则,清除AF和CF。,例11.4中的程序是BCD数加法的例子。子程序B10CONV把ASCII数(ASC1和ASC2)分别转换成压缩型的BCD数(BCD1和BCD2)。可以从右到左进行处理,也可以从左到右进行处理。另外,处理字比处理字节更容易,这是因为需要用两个ASCII字节去产生一个压缩型的BCD字节。但是,使用字操作时要求ASCII数据栏的字节数为偶数个。 例11.4中的程序用3次循环把压缩型的BCD数加到BCDSUM数据栏中,最后的和是压缩型的BCD数00 12 72 63,它是可以用DEBUG来追踪的。把BCD数的和转换成ASCII数并显示它

22、是一个有用的练习。,例11.4 BCD数转换与相加。 源程序清单如下: ; file name:L114.ASM TITLE BCDADD (COM) Convert ASCII nos to BCD and add CODESG SEGMENT PARA CODE ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP SHORT MAIN,; ASC1 DB 057836 ;ASCII数据项 ASC2 DB 069427 BCD1 DB 000 ;BCD数项 BCD2 DB 000 BCDSUM DB 4 DUP(0) ; ,MAI

23、N PROC NEAR LEA SI, ASC1+4 ;初始化ASCII LEA DI, BCD1+2 ;和BCD值 CALL B10CONV ;调用转换程序 LEA SI, ASC2+4 ;初始化ASCII LEA DI, BCD2+2 CALL B10CONV,CALL C10ADD RET MAIN ENDP ; Convert ASCII to BCD ; B10CONV PROC MOV CL ,04 ;移位次数 MOV DX, 03,B20: MOV AX,SI ;取ASCII数 XCHG AH ,AL ;移出 SHL AL, CL SHL AX, CL ;ASCII 3 MOV

24、DI,AH ;存BCD数 DEC SI DEC SI DEC DI,DEC DX JNZ B20 ;循环3次 RET B10CONV ENDP ; Add BCD numbers ; C10ADD PROC XOR AH,AH LEA SI,BCD1+2 LEA DI,BCD2+2,LEA BX,BCDSUM+3 ;地址 MOV CX,03 ;3字节长度 CLC C20: MOV AL, SI ;取BCD1 ADC AL, DI ;加BCD2 DAA ;十进制调整 MOV BX, AL ;存入BCDSUM,DEC SI DEC DI DEC BX LOOP C20 ;循环3次 RET C10A

25、DD ENDP CODESG ENDS END BEGIN,11.3 ASCII数转换为二进制,以ASCII数或BCD数完成的算术运算只适合于较短字段的数。对于大多数算术运算来说,把这样的数转换成二进制,然后再运算将更为实用。实际上,从ASCII数直接转换成二进制比从ASCII数转换到BCD数再转成二进制要更加容易。 从ASCII数转换成二进制算法的基础是:ASCII数是以10为基数的,而计算机执行的算术运算是以2为基数的。转换程序见例11.5。,例11.5 ASCII数与二进制数之间的转换。 源程序清单如下: ; file name:L115.ASM TITLE EXCONV (COM) C

26、onversion of ASCII & binary formats CODESG SEGMENT PARA CODE ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H BEGIN: JMP MAIN,ASCVAL DB 1234 ;ASCII数 BINVAL DW 0 MULT10 DW 1 ; MAIN PROC NEAR CALL B10ASBI CALL C10BIAS RET,MAIN ENDP ; Convert ASCII TO binary ; B10ASBI PROC MOV CX, 10 LEA SI,ASCVAL1 MOV BX

27、,ASCLEN,B20: MOV AL,SI+BX AND AX,000FH MUL MULT10 ADD BINVAL,AX MOV AX,MULT10 MUL CX MOV MULT10,AX DEC BX,JNZ B20 RET B10ASBI ENDP ; Convert binary to ASCII ; C10BIAS PROC MOV CX,0010 LEA SI,ASCVAL+3 MOV AX,BINVAL,C20: CMP AX,0010 JB C30 XOR DX,DX DIV CX OR DL,30H MOV SI,DL DEC SI JMP C20,C30: OR AL

28、,30H MOV SI,AL RET C10BIAS ENDP CODESG ENDS END BEGIN,例11.5的算法如下: (1) 从ASCII数最右边的字节开始,由右到左进行处理。 (2) 去掉ASCII字节左边的3,形成一个压缩的BCD数。 (3) 从右向左,第一个BCD数乘以1,第二个数乘以10,第三个数乘以100,依次类推,并计算乘积的总和。例如:,十进制 41= 4 310= 30 2100= 200 11000= 1000 和: 1234,十六进制 401= 4 30A= 1E 264= C8 13E8= 3E8 04D2,核对一下,十六进制的和04D2是否等于十进制的12

29、34。 在例11.5中,B10ASBI将ASCII数转换成二进制。此例假定ASCII数的长度为4,存于ASCLEN单元。设定初值时,ASCII数据的地址为ASCVAL-1,存于SI寄存器中,长度存于BX中。标号B20处的指令将ASCII数送入AL中: MOV AL,SI+BX,利用ASCVAL-1的地址加上BX寄存器的内容,也就是ASCVAL+3(ASCVAL最初的最右边的位)。每经过一次循环,BX递减1,指向左边的一个字节。因为使用BX 来控制循环而不是使用CX,所以不可以用LOOP指令。每次循环体用MULT10乘以10而产生1、10、100等数据。 下一节中的程序是这一节的逆过程,即把二进制转换成十进制ASCII数。,11.4 二进制转换成ASCII格式,为了打印或显示二进制算术运算的结果,首先必须把它转换成ASCII格式,该转换是 09之间,然后再把它再转换成ASCII数。例如,将十六进制04D2转换成十进制格式:,商 余数 0A 4D2 7B 4 0A 7B C 3 0A C 1 2,由于商是1,小于除数0A,所以运算结束。余数和最后的商一起形成BCD数结果:1234。然后再与ASCII的3合并成为31 32 33 34,最后存入内存,就可以用显示程序显示。,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1