NASM中如何将字符转换为数值 解决loop循环执行次数异常问题
问题解决:NASM汇编ASCII输入字符转数值实现循环次数控制
核心问题确认
你之前的排查方向正确,除此之外还有两个隐藏问题也会导致循环仅执行1次:
- 输入的数字以ASCII码形式存在内存中,未转换为二进制数值直接赋值给ECX作为循环计数
- 原有循环逻辑错误:过程执行完直接跳转到结束逻辑,没有回到loop指令位置持续循环
- 系统调用
int 0x80会修改ECX寄存器值,未提前保存循环计数导致计数被破坏
解决方法
1. ASCII字符转单数字数值
单数字的转换逻辑非常简单,只需要将字符的ASCII值减去字符'0'的ASCII值(0x30)即可得到对应的二进制数值,替换原有_snumb段逻辑:
_snumb: ; 读取输入的单数字字符 mov al, [text+5] ; ASCII转数值 sub al, '0' ; 合法性校验:判断是否为0-9的数字 jb _error cmp al, 9 ja _error ; 清空ECX高位,赋值有效计数 movzx ecx, al
2. 修正循环逻辑
需要调整执行流,确保每次过程执行完回到循环判断位置,同时在系统调用前后保存/恢复ECX的计数值,替换原有_loofpro、_loospro、_fpro、_spro段逻辑:
_loofpro: ; 计数为0直接退出,避免空执行 jecxz _finalize _fpro_loop: ; 保存循环计数,防止系统调用破坏 push ecx mov eax, 4 mov ebx, 1 mov ecx, fproc mov edx, lon1 int 0x80 ; 恢复循环计数 pop ecx loop _fpro_loop jmp _finalize _loospro: jecxz _finalize _spro_loop: push ecx mov eax, 4 mov ebx, 1 mov ecx, sproc mov edx, lon2 int 0x80 pop ecx loop _spro_loop jmp _finalize
3. 多位数字转换扩展(可选)
如果需要支持大于9的次数输入,可以用如下逻辑逐位转换:
- 初始化计数寄存器为0
- 逐位读取数字字符,转换为单数值
- 执行
计数 = 计数 * 10 + 当前位数值,直到读取到非数字字符为止
内容的提问来源于stack exchange,提问作者Alvaro Garcia
相关产品推荐
相关产品推荐

