请求修改x86 16位汇编ASCBIN2函数:ASCII数组转二进制并求和
问题解决:ASCII转二进制并求和的汇编函数修改
核心问题分析
原代码的ASCBIN和ASCBIN2存在以下问题:
- 缺少外层循环处理5个数字,仅执行一次转换
- 硬编码
CX=2,只能处理固定2位数字,无法适配1-3位的输入 - 未将转换后的二进制数累加到
SUMA,无法完成求和需求
修改后的完整函数代码
替换原有的ASCBIN和ASCBIN2函数为以下代码:
ASCBIN: MOV CX, 5 ; 循环处理5个数字 LEA SI, VECTOR ; SI指向当前数字的起始地址 ASCBIN_LOOP: PUSH CX ; 保存外层循环计数器 MOV CX, 3 ; 每个数字占3字节空间 MOV WORD PTR [NUMAR], 0 ; 清零当前数字的二进制存储变量 ASCBIN2: MOV AL, [SI] CMP AL, 20H ; 判断当前字节是否为空格(无效位) JE SKIP_DIGIT ; 是空格则跳过,不处理 ; 计算 NUMAR = NUMAR * 10 + 当前数字的二进制值 MOV AX, [NUMAR] MOV BX, 10 MUL BX ; AX = 现有值 *10 MOV DL, AL AND DL, 0FH ; ASCII转二进制(取低4位) MOV DH, 0 ADD AX, DX ; 加上当前数字 MOV [NUMAR], AX SKIP_DIGIT: INC SI ; 移动到下一个字节 LOOP ASCBIN2 ; 处理完当前数字的3个字节 ; 将转换后的数字累加到总和SUMA MOV AX, [NUMAR] ADD [SUMA], AX POP CX ; 恢复外层循环计数器 LOOP ASCBIN_LOOP ; 处理下一个数字 RET
关键修改说明
- 多数字循环处理:通过外层
ASCBIN_LOOP循环5次,逐个处理VECTOR中的5个数字 - 自动适配位数:遍历每个数字的3个字节,遇到空格(
20H)直接跳过,仅处理有效ASCII数字,适配1-3位的输入 - 求和逻辑补充:每个数字转换完成后,将
NUMAR的值累加到SUMA,完成求和需求 - 变量初始化:每次处理新数字前清零
NUMAR,避免上一次转换的残留值影响结果
内容的提问来源于stack exchange,提问作者ioana
相关产品推荐
相关产品推荐

