NASM汇编代码传参时崩溃,打印首字符串后触发段错误
段错误原因及修复方案
问题根源:栈不平衡
在_printstr函数中,你通过push eax将字符串指针作为参数传递给_strlen,但调用完成后没有清理栈上的这个参数。当_printstr执行ret指令时,栈顶的内容已经不是_start中的返回地址,而是你压入的字符串指针,程序跳转到非法地址,触发段错误。
修复步骤
在_printstr中调用_strlen之后,添加add esp, 4来弹出栈上的参数(因为你压入了4字节的eax),或者用pop eax(效果相同)。
另外,_strlen函数末尾的xor ebx, ebx和xor ecx, ecx属于冗余操作,可以删除,不影响功能。
修复后的完整代码
section .data msg db "Hello World!",0 msg2 db "Good Bye World",0 msg3 db "Hello Universe",0 section .text global _start _strlen: push ebp mov ebp, esp mov eax, [ebp + 8] mov ecx, 0 _loop: mov bl, [eax] cmp bl, 0 je _loopend add eax, 1 add ecx, 1 jmp _loop _loopend: mov eax, ecx pop ebp ret _printstr: push ebp mov ebp, esp mov eax, [ebp+8] push eax call _strlen mov edx, eax add esp, 4 ; 清理栈上的参数 mov eax, 4 mov ebx, 1 mov ecx, [ebp+8] int 80h pop ebp ret _start: push msg call _printstr push msg2 call _printstr push msg3 call _printstr mov ebx, 0 mov eax, 1 int 80h
额外优化说明
- 将
_strlen中初始的mov bl, [eax]移到循环内部,避免重复代码,同时保证循环逻辑更清晰。 - 删除冗余的寄存器清零操作,减少不必要的指令。
内容的提问来源于stack exchange,提问作者Star Dev
相关产品推荐
相关产品推荐

