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

MASM64汇编数组循环计数程序运行崩溃问题求助

MASM64 代码崩溃问题排查及修复

核心错误点

  • 数组遍历逻辑完全错误:你定义的mas是dq(8字节)类型数组,将首地址赋值给rcx后每次仅add rcx,1根本无法正确定位到下一个元素;同时你混淆了数组地址和元素计数,拿内存地址和数组长度3做比较的判断逻辑完全不成立。
  • 除法指令使用错误:64位div指令的被除数是rdx:rax组成的128位值,你全程没有把数组元素加载到rax中,每次都是用初始赋值的3做除法,完全没有实现统计数组元素的需求。
  • 循环终止条件不可达:你把判断循环结束的代码放在了jz yes和jnz no之后,这两个跳转已经覆盖了所有分支,终止代码永远不会执行,程序进入死循环直接崩溃。
  • 缓冲区溢出与调用约定不符合:你定义的buf1只有24字节,完全不足以容纳输出的字符串;同时x64调用Windows API前需要预留32字节影子空间,你没有做对应栈操作,调用API时也会触发崩溃。

修正后的完整代码

include \masm64\include64\masm64rt.inc
.data        
mas dq 2,5,8
m dq 2
res dq 0
title1 db "Решение уравнения. masm64",0
txt1 db "Уравнение с массивом",10,
"Количесвто чисел, которые делятся на %d без остатка:%d",10,10,
"Автор:Тарадай Святослав",0                              
buf1 db 256 dup(0)  ; 扩大缓冲区避免溢出                                        
.code                             
entry_point proc
sub rsp, 32 ; 预留x64调用需要的影子空间
mov r8, 0  ; r8做遍历索引
mov rbx, 0 ; rbx存符合条件的计数
main:
cmp r8, lengthof mas ; 判断是否遍历完所有元素
je done
; 加载当前数组元素到rax
mov rax, mas[r8*8]
xor rdx, rdx
div m
cmp rdx, 0
jz yes
inc r8
jmp main
yes:
inc rbx
inc r8
jmp main
done:
mov res,rbx
invoke wsprintf, ADDR buf1, ADDR txt1, m, res
invoke MessageBox, 0, ADDR buf1, ADDR title1, MB_ICONINFORMATION 
add rsp, 32 ; 恢复栈
invoke ExitProcess,0
entry_point endp         
end                

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:54:03