MASM32中二进制转十进制代码求助:程序无法正常运行
MASM32二进制转十进制代码问题排查与修复
核心问题分析
- 保留字误用:
dec是MASM的内置指令(寄存器递减操作),不能用作变量名,会导致编译或运行时的语法/逻辑错误。 - 输入解析错误:
sval(input("..."))会将输入的二进制字符串当作十进制数值解析,比如输入101会被转成十进制的101,而非二进制对应的5,完全偏离需求。 - 长度计算错误:
strlen(str$(var1))是将解析后的十进制数值转回字符串再取长度,和原二进制输入的长度无关,若输入带前导零的二进制串(如0101),这里得到的长度会和实际输入长度不符。 - 位运算逻辑错误:基于错误的
var1数值进行位运算,计算出的结果完全不符合二进制转十进制的规则。
修复后的代码
include \masm32\include\masm32rt.inc .code start: call main exit main proc LOCAL input_buf:BYTE[256] ; 存储输入的二进制字符串 LOCAL dec_val:DWORD ; 存储转换后的十进制值,避免用保留字dec LOCAL len:DWORD LOCAL idx:DWORD ; 获取用户输入的二进制字符串 invoke inputaddr, chr$("Enter Binary Number: "), addr input_buf, sizeof input_buf mov len, strlen(addr input_buf) mov dec_val, 0 mov idx, 0 lbl0: cmp idx, len jge lbl1 ; 索引超过长度时退出循环 ; 取出当前字符并转为数值0或1 mov al, byte ptr [input_buf + idx] sub al, '0' jnz @is_one ; 当前位是0,结果乘以2 shl dec_val, 1 jmp @next @is_one: ; 当前位是1,结果乘以2再加1 shl dec_val, 1 inc dec_val @next: inc idx jmp lbl0 lbl1: print chr$(13,10) print chr$("Decimal Equivalent: ") print str$(dec_val) print chr$(13,10) ret main endp end start
修复说明
- 改用
inputaddr获取原始输入字符串,直接处理二进制字符,避免sval的错误解析。 - 替换保留字
dec为dec_val作为结果变量,避免语法冲突。 - 逐字符解析二进制字符串:每一位转成0/1后,通过左移(等价于乘以2)加当前位数值的方式计算十进制值,符合二进制转十进制的数学逻辑。
- 直接使用输入字符串的原始长度循环,确保每一位都被正确处理。
内容的提问来源于stack exchange,提问作者Quang Lệ Nhật
相关产品推荐
相关产品推荐

