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

使用MASM交换数组元素时触发SIGSEGV段错误求助

MASM程序段错误(SIGSEGV)的原因与修复

你的代码里数组交换逻辑是正确的——A是dw(2字节字类型)数组,第2个元素偏移[ebx+2]、第3个元素偏移[ebx+4],用ax和dx完成交换的操作没有问题。

触发段错误的根源是_start结尾的ret指令:_start是程序的入口点,没有上层调用者,执行ret时会尝试从栈顶弹出一个地址并跳转,但此时栈顶的内容并非有效的代码地址,因此触发非法内存访问。

修复方案

替换ret为合法的程序退出指令,32位Windows平台标准的退出方式是调用ExitProcess函数:

.386
.MODEL flat, stdcall
includelib kernel32.lib
ExitProcess proto, dwExitCode:dword

.CODE
_start:
    mov ebx, offset A
    mov ax, [ebx+2]
    mov dx, [ebx+4]
    mov [ebx+2], dx
    mov [ebx+4], ax
    invoke ExitProcess, 0  ; 传递退出码0,正常结束程序
.DATA
    A dw 1, 33, 1, 1, 1
end _start

需要注意:

  • 在.MODEL后指定stdcall调用约定,匹配ExitProcess的调用规则
  • 通过includelib引入kernel32.lib,链接时才能找到ExitProcess函数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:25:30