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

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

额外优化说明

  1. 将_strlen中初始的mov bl, [eax]移到循环内部,避免重复代码,同时保证循环逻辑更清晰。
  2. 删除冗余的寄存器清零操作,减少不必要的指令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:54:57