MASM32统计DW数组中1的数量时EAX取值异常问题
问题产生原因
- 数据读取长度不匹配:你定义的
var1是DW(16位字)类型数组,而代码中使用MOV EAX, [ESI]指令会从ESI指向的地址连续读取32位(4字节)数据存入EAX。数组前两个元素分别是0(0000h)、1(0001h),x86架构采用小端存储模式,拼接读取的结果就是00010000h,和你遇到的异常值完全吻合。 - 内存模型配置错误:MASM32是32位Windows程序开发环境,你使用的
.model small是16位DOS程序的内存模型,会导致地址寻址逻辑存在潜在异常。
修复方案
按如下要求修改代码即可正常运行:
- 替换内存模型声明为32位平坦模型,同时引入依赖的库文件和接口声明,满足
ExitProcess的调用要求 - 读取数组元素时仅读取16位长度,匹配DW类型的存储大小
- 直接判断读取到的值是否为1,简化逻辑减少不必要的跳转
修复后的完整代码如下:
.386 .model flat, stdcall includelib kernel32.lib ExitProcess PROTO, dwExitCode:DWORD .data var1 dw 0,1,1 .code main PROC LEA ESI, var1 MOV EBX, 3 ; 数组元素总数 MOV ECX, 0 ; 统计计数器初始化 L1: CMP EBX, 0 JE L3 MOV AX, [ESI] ; 仅读取16位,匹配DW类型大小 CMP AX, 1 ; 判断是否为目标值1 JNE L2 INC ECX ; 匹配则计数器+1 L2: DEC EBX ADD ESI, 2 ; DW占2字节,指针向后移动2位 JMP L1 L3: INVOKE ExitProcess, 0 main ENDP END main
内容的提问来源于stack exchange,提问作者GoAkshay
相关产品推荐
相关产品推荐

