You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

修复说明

  1. 改用inputaddr获取原始输入字符串,直接处理二进制字符,避免sval的错误解析。
  2. 替换保留字dec为dec_val作为结果变量,避免语法冲突。
  3. 逐字符解析二进制字符串:每一位转成0/1后,通过左移(等价于乘以2)加当前位数值的方式计算十进制值,符合二进制转十进制的数学逻辑。
  4. 直接使用输入字符串的原始长度循环,确保每一位都被正确处理。

内容的提问来源于stack exchange,提问作者Quang Lệ Nhật

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:35:28