1、1.码制转换十、二进制数、 ASCII码之间的互相转换。 BCD数 2进制数 算法: Dn-1*10n-1+D0*10 0 = (D n-1*10+ Dn-2)*10+)*10+ D 0= ( 0*10+Dn-1)*10+ Dn-2)*10+)*10+ D 0 即: 新的中间结果 = 中间结果 *10+本位数字(中间结果初值为 0)4.5 常见程序设计举例1程序 1:将 65535的非压缩 BCD数转换成 2进制数。程序如下 :;数据段定义mydata SEGMENTdecnum DB 5, 3, 0, 1, 9 ;BCD数 53019binnum DW ?mydata ENDS2prog S
2、EGMENTASSUME CS:prog, DS:mydatabegin: MOV AX, mydataMOV DS, AX MOV SI, OFFSET decnumMOV CX, 5 ;5位 BCD数 MOV BX, 10XORAX, AX ;中间结果初始值为 0Next: MUL BX ;中间结果 *10+本位数字ADD AL, SIADC AH, 0INC SI ;指向下位 BCD数LOOP nextMOV binnum, AX ;保存结果MOV AH, 4CHINT 21Hprog ENDSEND begin3程序 2:把 255的非压缩 BCD数转换成 2进制数decnum DB
3、1, 5, 9 ;BCD数 159binnum DB ?MOV AX, decnumXCHG AH, AL ;百位在 AH, 十位在 ALAAD ;百位数 *10 + 十位数MOV AH, AL ;中间结果送 AHMOV AL, decnum+2AAD ;中间结果 *10 + 个位数MOV binnum, AL4例:从键盘输入两个整数 ,并求其和。因键入为整数 ,故要进行如下转换:ASCIIBCD 二进制数ASCIIBCD 码很简单 ,高 4位清零即可得到非压缩的 BCD码。BCD 二进制数在本例中采用用以下方法:(0+千位数 )*10+百位数 )*10)+十位数 )*10+个位数 ASCII
4、码 二进制数 (用于输入 ) 第一次中间结果第二次中间结果第三次中间结果最终结果 5开始两个数分别转换成二进制数键入两个数相加结束返回 DOS如有溢出则提示开始取第一个 ASCII码是 负号吗?数字符个数 1,指针 1指针定位字符个数 1= 0?取数字,与中间结果相加,再乘以 10指向下一个数字字符加个位数是负数则求补存结果结束NYYN转换子程序6程序如下:DATA SEGMENTSTR1 DB 10,?,10 DUP(?) ;第 1个数的输入缓冲区 STR2 DB 10,?,10 DUP(?) ;第 2个数的输入缓冲区 NUM DW ?,?;存转换后的二进制数SUM DW 0;存和OVER
5、DB Overflow!,13,10,$DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROCFAR7START: MOV AX,DATAMOV DS,AXMOV AH,0AHLEA DX,STR1INT 21H ;输入第一个数字串 (设为 26)MOV AH,0AHLEA DX,STR2INT 21H ;输入第二个数字串 (设为 33)LEA BX,STR1 ;串 1的首地址送 BXLEA DI,NUM ;存二进制首地址送 DICALLCHANGE ;将串 1 ASCII码 二进制LEABX,STR2 ;串 2的首地址送 BX 8LEADI
6、,NUM+2;指向CALLCHANGE;将串 2 ASCII码 二进制MOV AX,NUM ;(AX)=NUM=001AHADDAX,NUM+2;两数相加,(AX)=003BHMOV SUM,AX;存和JNO NEXT ;无溢出 ,转NEXTLEADX,OVERMOV AH,9INT 21H ;显示 Overflow!NEXT: MOV AH,4CHINT 21H ;返回 DOSMAINENDP9CHANGE PROCMOVCL,BX+1 ;实际字符数送 CLMOVAL,BX+2 ;第一个字符送 ALMOVCH,AL;暂存在CHCMPAL,- ;第一个字符是负号吗 ?JNZNEXT1;不是 ,转 NEXT1DEC CL;字符数减 1INC BXNEXT1: ADD BX,2;指向第一个数字字符MOVAX,0;清零AX,存二进制数LP1: DEC CLJZNEXT2;若(CL)=0,转 NEXT2MOVDL,BX ;取字符ANDDL,0FH;转换成BCD码ADD AL,DL ;加到中间结果上ADC AH,0 10