4.5常见程序设计举例 1.码制转换 十、二进制数、ASCⅠI码之间的互相转换 ①BcD数→2进制数 算法:Dn101+…+D0+10 (.(Dn110+Dn2)*10+.)10+Do =(..(010+Dn1)*10+Dn2)*10+.)*10+D 即:新的中间结果=中间结果*10+本位数字 (中间结果初值为0)
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 常见程序设计举例
程序1:将≤65535的并压缩BCD数转换成2进 制数。程序如下 ;数据殿定义 mydata SEGMENT decnum DB 5, 3, 0, 1, 9 BCD #3 53019 binnum DW mydata ENDS
2 程序1:将≤65535的非压缩BCD数转换成2进 制数。程序如下。 ;数据段定义 mydata SEGMENT decnum DB 5, 3, 0, 1, 9 ;BCD数 53019 binnum DW ? mydata ENDS
prog SEGMENT ASSUME CS. prog, DS. mydata begin: MOv Ax, mydata MOV DS.AX MOV S OFFSET decnum MOV CX. 5 5位BCD数 MOV BX 10 XOR AXAX ;中间结果初始值为0 Next MUL BX ;中间同结果*10+本位数字 ADD AL, [SI ADC AH0 INC S 指向下位BCD数 LOoP next Mov binnum. X ;(存结果 MOV AH 4CH INT 21H prog ENDS ENd begin
3 prog SEGMENT 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
程序2:把255的非压缩BCD数转换成2进制数 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
4 程序2:把≤255的非压缩BCD数转换成2进制数 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 ……
② ASCII码→二进制数(用于输入) 例:从键盘输入两个整数,并求其和。 因键入为整数,故要进行如下转换: ASCII→BCD→二进制数 ASCII→BCD码很简单,高4位清零即可得到非压 缩的BCD码。 BCD→二进制数在本例中采用用以下方法: (((0+千位数)*10+百位数)*10)+十位数)*10+个位数 第一次中间结果 第二次中间结果 第三次中间结果 最终结果
5 例:从键盘输入两个整数,并求其和。 因键入为整数,故要进行如下转换: ASCII→BCD→二进制数 ASCII→BCD码很简单,高4位清零即可得到非压 缩的BCD码。 BCD→二进制数在本例中采用用以下方法: ((((0+千位数)*10+百位数)*10)+十位数)*10+个位数 ②ASCII码→二进制数(用于输入) 第一次中间结果 第二次中间结果 第三次中间结果 最终结果
开始 转换子程序 开始 取第一个ASC码」 是负号吗 键入两个数 Y 匚数字符个数=1,指针+1 两个数分别转换 成二进制数 指针定位 字符个数-1 相加 0? 加个位数 如有溢出则提示 取数字,与中间结果 是负数 返回DOS 相加,再乘以10 则求补 指向下一个数字字符 存结果 结束 结束)
6 开始 两个数分别转换 成二进制数 键入两个数 相加 结束 返回DOS 如有溢出则提示 开始 取第一个ASCII码 是负号吗? 数字符个数-1,指针+1 指针定位 字符个数-1 = 0? 取数字,与中间结果 相加,再乘以10 指向下一个数字字符 加个位数 是负数 则求补 存结果 结束 N Y Y N 转换子程序
程序如下: DATA SEGMENT STRI DB10,?,10DUP(?);第1个数的输入缓冲区 STR2 DB10,?,10DUP(?);第2个数的输入缓冲区 NUM DW?,? 存转换后的二进制数 SUM DW O ;存和 OVER DB Overflow!,13, 10, 'S DATA ENDS CODE SEGMENT ASSUME CS: CODE. DS: DATA PROC FAR
7 程序如下: DATA SEGMENT STR1 DB 10,?,10 DUP(?) ;第1个数的输入缓冲区 STR2 DB 10,?,10 DUP(?) ;第2个数的输入缓冲区 NUM DW ?,? ;存转换后的二进制数 SUM DW 0 ;存和 OVER DB ‘Overflow!’ ,13,10, ’$’ DATA ENDS ; CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR
START: MOV AX DATA Mov DS. AX MOV AH. OAH LEA DX STRI INT 21H 输入第一个数字串(设为26) MOV AH. OAH LEA DX STR2 INT 21H 输入第二个数字串(设为33) LEA BX STR1 串1的首地址送BX LEA DI NUM 存二进制首地址送DI CALL CHANGE;将串1ASCI码→二进制 LEA BX STR2 串2的首地址送BX
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 ;将串1 ASCII码→二进制 LEA BX,STR2 ;串2的首地址送BX
LEA DI,NUM+2;指向 CALL CHANGE ;将串2ASCI码→二进制 MOV AX. NUM (AX=LNUM=001AH ADD AX. NUM+2 两数相加,(AX)=003BH MOV SUM. AX ;存和 JNO NEXT 无溢出,转NEXT LEA DX. OVER Mov aH. 9 INT 21H ;显示’0 verflow! NEXT: MOV AH. 4CH INT 21H 返回DOS MAIN ENDP
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
CHANGE PROC MOV CL,[BX+1];实际字符数送CL MOV AL,[BX+2];第一个字符送AL MOV CH AL ;暂存在CH CMP AL 第一个字符是负号吗? JNZ NEXTI 不是,转NEXT1 DEC CL ;字符数减1 INC BX NEXTI: ADD BX. 2 指向第一个数字字符 MOV AX. O 清零AX,存二进制数 LPI DEC CL JZ NEXT2 若(CL)=0,转NEXT2 MOV DL, BX 取字符 AND DL, OFH 转换成BCD码 ADD AL DL ;加到中间结果上 ADC AH.O
10 CHANGE PROC MOV CL,[BX+1] ;实际字符数送CL MOV 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