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
相关产品推荐
相关产品推荐

