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

