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

32位x86汇编统计二进制中1的个数运行结果异常求助

现有代码的核心错误

  • 逻辑偏差:你要统计的是单个数2的二进制位中1的个数,不是遍历数组元素是否非0,完全不需要修改ESI地址偏移,也不需要初始化循环次数为4。
  • 位检测逻辑缺失:你没有逐位判断每一位的值,直接判断整个数是否非0,第一次判断EAX=2非0就给计数加1,后续循环访问的是var1之外的未知内存,结果完全不可控。
  • 位数计算错误:你定义的var1是dw类型(16位无符号数),需要遍历16位来检测每一位的取值,不是你认为的4位二进制。
  • 内存模型错误:32位汇编需要使用flat内存模型,你写的small是16位DOS程序的内存模型,32位环境下运行会出错。

修正后的代码

.386  ; 声明使用32位处理器指令集
.model flat, stdcall  
ExitProcess PROTO, dwExitCode:DWORD  
.data  
var1 dw 2  ; 待检测的数,二进制为 00000000 00000010,1的个数为1
.code  
main PROC  
    MOV AX, var1    ; 把要检测的数加载到AX寄存器
    MOV ECX, 0      ; 初始化1的计数为0
    MOV EBX, 16     ; dw类型是16位,需要循环检测16次
L1:
    TEST AX, 1      ; 检测当前最低位是否为1
    JZ L2           ; 最低位为0则跳过计数
    INC ECX         ; 最低位为1,计数加1
L2:
    SHR AX, 1       ; 逻辑右移1位,把下一位移动到最低位
    DEC EBX         ; 剩余检测位数减1
    JNZ L1          ; 未完成所有位检测就继续循环
    ; 此时ECX寄存器存储的就是二进制中1的个数,可加断点查看值
    
    INVOKE ExitProcess,0  
main ENDP  
END main

内容的提问来源于stack exchange,提问作者GoAkshay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:18:03