为什么我的字符串打印函数在我传递的 C 字符串之后打印额外的垃圾/文件内容?

Why does my string-print function print extra garbage / file contents after the C string I pass it?

我决定制作一个函数,将 EAX 寄存器中的字符串打印到控制台,首先显示一条消息,然后再显示一些内容

代码(NASM):

newLine equ 0xa

section .data
    msg db "Hello world!", newLine, 0

section .text
    global _start

_start:
    mov eax, msg
    call printf
    call exit

printf:
    push eax
    push ebx
    push ecx 
    push edx 

    mov ecx, eax
    call lenFind
    mov edx, eax
    mov eax, 4
    mov ebx, 1
    int 0x80

    pop edx
    pop ecx
    pop ebx
    pop eax 
    ret

lenFind:
    push edx
    mov edx, 0
    .find:
        cmp [eax+edx], byte 0
        je .close
        inc edx
        jmp .find
    .close:
        pop edx
        ret

exit:
    mov eax, 1
    mov ebx, 0
    int 80h 

输出:

Hello world!
.shstrtab.text.data
                   �J�  

我知道它可能是什么,但最有可能的问题是我使用的是 32 位寄存器

您的 lenFind 没有 return 任何结果!
长度是在 EDX 寄存器中计算的,但您已从堆栈中恢复了该长度。然而,调用程序似乎期望长度在 EAX 寄存器中:

lenFind:
    push edx
    mov edx, 0
    .find:
        cmp [eax+edx], byte 0
        je .close
        inc edx
        jmp .find
    .close:
        MOV EAX, EDX   <<< Add this line
        pop edx
        ret