开始 转换子程序 开始 取第一个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