码制转换十二进制数ascii码之间的互相转换b

上传人:xiao****1972 文档编号:74492038 上传时间:2019-01-28 格式:PPT 页数:31 大小:384.31KB
返回 下载 相关 举报
码制转换十二进制数ascii码之间的互相转换b_第1页
第1页 / 共31页
码制转换十二进制数ascii码之间的互相转换b_第2页
第2页 / 共31页
码制转换十二进制数ascii码之间的互相转换b_第3页
第3页 / 共31页
码制转换十二进制数ascii码之间的互相转换b_第4页
第4页 / 共31页
码制转换十二进制数ascii码之间的互相转换b_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《码制转换十二进制数ascii码之间的互相转换b》由会员分享,可在线阅读,更多相关《码制转换十二进制数ascii码之间的互相转换b(31页珍藏版)》请在金锄头文库上搜索。

1、1,1.码制转换 十、二进制数、ASCII码之间的互相转换。 BCD数2进制数 算法:Dn-1*10n-1+D0*100 = (Dn-1*10+ Dn-2)*10+)*10+ D0 = (0*10+Dn-1)*10+ Dn-2)*10+)*10+ D0 即: 新的中间结果 = 中间结果*10+本位数字 (中间结果初值为0),4.5 常见程序设计举例,2,程序1:将65535的非压缩BCD数转换成2进制数。程序如下。 ;数据段定义 mydata SEGMENT decnum DB 5, 3, 0, 1, 9 ;BCD数 53019 binnum DW ? mydata ENDS,3,prog S

2、EGMENT ASSUME CS:prog,DS:mydata begin: MOV AX, mydata MOV DS, AX MOV SI, OFFSET decnum MOV CX, 5 ;5位BCD数 MOV BX, 10 XOR AX, AX ;中间结果初始值为0 Next: MUL BX ;中间结果*10+本位数字 ADD AL, SI ADC AH, 0 INC SI ;指向下位BCD数 LOOP next MOV binnum, AX ;保存结果 MOV AH, 4CH INT 21H prog ENDS END begin,4,程序2:把255的非压缩BCD数转换成2进制数

3、decnum DB 1,5,9 ;BCD数159 binnum DB ? MOV AX,decnum XCHG AH, AL ;百位在AH, 十位在AL AAD ;百位数*10 + 十位数 MOV AH, AL ;中间结果送AH MOV AL, decnum+2 AAD ;中间结果*10 + 个位数 MOV binnum, AL ,5,例:从键盘输入两个整数,并求其和。 因键入为整数,故要进行如下转换: ASCIIBCD二进制数 ASCIIBCD码很简单,高4位清零即可得到非压缩的BCD码。 BCD二进制数在本例中采用用以下方法: (0+千位数)*10+百位数)*10)+十位数)*10+个位数

4、,ASCII码二进制数(用于输入),第一次中间结果,第二次中间结果,第三次中间结果,最终结果,6,开始,两个数分别转换 成二进制数,键入两个数,相加,结束,返回DOS,如有溢出则提示,开始,取第一个ASCII码,是负号吗?,数字符个数1,指针1,指针定位,字符个数1,= 0?,取数字,与中间结果 相加,再乘以10,指向下一个数字字符,加个位数,是负数 则求补,存结果,结束,N,Y,Y,N,转换子程序,7,程序如下: DATA SEGMENT STR1 DB 10,?,10 DUP(?) ;第1个数的输入缓冲区 STR2 DB 10,?,10 DUP(?) ;第2个数的输入缓冲区 NUM DW

5、?,? ;存转换后的二进制数 SUM DW 0 ;存和 OVER DB Overflow!,13,10,$ DATA ENDS ; CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR,8,START: MOV AX,DATA MOV DS,AX MOV AH,0AH LEA DX,STR1 INT 21H ;输入第一个数字串(设为26) MOV AH,0AH LEA DX,STR2 INT 21H ;输入第二个数字串(设为33) LEA BX,STR1 ;串1的首地址送BX LEA DI,NUM ;存二进制首地址送DI CALL CHANGE ;

6、将串1 ASCII码二进制 LEA BX,STR2 ;串2的首地址送BX,9,LEA DI,NUM+2 ;指向 CALL CHANGE ;将串2 ASCII码二进制 MOV AX,NUM ;(AX)=NUM=001AH ADD AX,NUM+2 ;两数相加,(AX)=003BH MOV SUM,AX ;存和 JNO NEXT ;无溢出,转NEXT LEA DX,OVER MOV AH,9 INT 21H ;显示Overflow! NEXT: MOV AH,4CH INT 21H ;返回DOS MAIN ENDP,10,CHANGE PROC MOV CL,BX+1 ;实际字符数送CL MOV

7、AL,BX+2 ;第一个字符送AL MOV CH,AL ;暂存在CH CMP AL,- ;第一个字符是负号吗? JNZ NEXT1 ;不是,转NEXT1 DEC CL ;字符数减1 INC BX NEXT1: ADD BX,2 ;指向第一个数字字符 MOV AX,0 ;清零AX,存二进制数 LP1: DEC CL JZ NEXT2 ;若(CL)=0,转NEXT2 MOV DL,BX ;取字符 AND DL,0FH ;转换成BCD码 ADD AL,DL ;加到中间结果上 ADC AH,0,11,MOV DX,10 MUL DX ;*10 INC BX ;指向下一个字符 JMP SHORT LP1

8、 NEXT2: MOV DL,BX ;取个位数 AND DL,0FH ;个位ASCII未组合BCD ADD AX,DX ;加个位数,(AX)=001AH CMP CH,- ;是-? JNZ NEXT3 ;该数非负,转NEXT3 NEG AX ;若为负,求补 NEXT3: MOV DI,AX ;存二进制结果 RET CHANGE ENDP ; CODE ENDS END START,12,02,0A,32,36,0D,02,0A,33,33,0D,00,1A,21,00,3B,00,STR1,STR2,NUM,SUM,10个,10个,O,OVER,?,?,04,0A,31,32,34,STR1,

9、若键入 1234,33,0D,1,2,3,4,设键入第1个数为26, 第2个数为33,则在内存各变量分配如下:,13,本例题重点掌握: 如何从键盘输入一个字符串 ASCII未组合BCD二进制 有符号数的运算,对负数和溢出如何处理 思考题: 若键入第一个数26,第二个数为-4,填写各变量结果。,14,方法1 计算二进制数中所包含的1000的个数、100的个数、10的个数和1的个数。 方法2 除10取余。 下面举例介绍第一种方法。流程图如下:,二进制数BCD,15,Y,N,二进制数AX 令(DL)0,(AX)-1000,0?,(DL)+1,(AX)+1000(AX),DL存至缓冲区,令(DL)0,

10、Y,N,(AX)-10,0?,(DL)+1,(AX)+10(AX),存DL,存AL,返回DOS,求100的个数,结构同上,A,16,汇编程序如下: DATA SEGMENT BNUM DB 270FH DNUM DB 4 DUP(?) ;存放BCD码的缓冲区 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA BINBCD PROC FAR BEGIN: MOV AX,DATA MOV DS,AX MOV AX,BNUM ;取二进制数 LEA BX,DNUM ;BCD码缓冲区首地址送BX,17,;计算百位的个数 MOV DL,0 ;千位的个数计数器 AG

11、AIN1: SUB AX,1000 ;(AX)-1000 JC NEXT1 ;若0,则退出循环 INC DL ;(DL)+1 JMP AGAIN1 NEXT1: ADD AX,1000 ;(AX)(AX)+1000 MOV BX,DL ;存千位的个数 ;计算百位的个数 MOV DL,0 ;百位的个数计数器 AGAIN2: SUB AX,100 ;(AX)-100 JC NEXT2 INC DL JMP AGAIN2 NEXT2: ADD AX,100 MOV BX+1,DL ;存百位的个数,18,MOV DL,0 ;十位的个数计数器 AGAIN3: SUB AX,10 ;(AX)-10 JC

12、NEXT3 INC DL JMP AGAIN3 NEXT3: ADD AX,10 MOV BX+2,DL ;存十位的个数 MOV BX+3,AL ;存个位的个数 MOV AH,4CH INT 21H BINBCD ENDP ; CODE ENDS END BEGIN,19,BCDASCII 前面举例介绍过,略。 二进制串转换为ASCII码 一个二进制位串若要送显示或打印, 需把串中每一位(0或1)化为ASCII码。 思路:先将目标串全部预置为30H,再把每个二进制位逐位左移至CF,然后判CF=0? 若是,取下一位;若不是,将31H送此单元。 流程图如下:,20,初始化,用0填满串,取要转换的数

13、,左移1位,存入1,结束,CF=1?,转换完?,调整指针,N,N,21,汇编程序如下: DATA SEGMENT NUM DW 6F78H STRING DB 16 DUP(?) DATA ENDS ; CODE SEGMENT ASSUME CS:CODE,DS:DATA BINCA PROC FAR BEGIN: MOV AX,DATA MOV DS,AX MOV ES,AX CLD LEA DI,STRING MOV CX,16 ;串的长度,22,MOV AL,30H REP STOSB ;串中全部填充为0 MOV CX,16 LEA DI,STRING MOV AL,1 MOV BX,

14、NUM ;(BX)=6F78H AGAIN: RCL BX,1 ;含进位位循环左移 JNC NEXT ;若为0,转 MOV DI,AL ;若为1,对应位送入1 NEXT: INC DI LOOP AGAIN,23,MOV AH,4CH INT 21H BINCA ENDP CODE ENDS END BEGIN,24,2.子程序的参数传递 编写子程序时,很重要的一个工作是如何把参数传给子程序,这个过程叫参数传送。 传送方法有: 把参数放在CPU内部寄存器中 把参数放在变量中 把参数放在地址表中 利用堆栈传送参数,25,下面举例介绍第4种方法,它通常在主程序中把参数或参数地址保存在堆栈中,而在子程序中将参数从堆栈取出来。 例:把一个用十六进制表示的字ASCII码,然 后送到屏幕上显示。 汇编程序如下: DATA SEGMENT NUM DW 25AFH ;要显示的数 STRING DB 4 DUP(?),13,10,$ DATA ENDS,26,STACK SEGMENT DB 100 DUP(?) TOP EQU $ STACK ENDS ; CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN: MOV AX,DATA MOV

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号