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

