字符串输出函数中的垃圾

Garbage in string output function

我正在尝试用 asm 编写一个 printf 替换,到目前为止有这个代码:

; string is loaded into r8
print_string:
    push rax
    push rbx
    push rsi
    push rdx

    ; load string pointer into ecx
    mov rsi, r8

    ; loop over every char
    print_string_loop0:
        cmp sil, 0 ; stop when encounter null character
        je print_string_return
        mov rax, 1 ; syscall (sys_write)
        mov rdi, 1 ; file descriptor for write (stdout = 1)
        mov rdx, 1 ; bytes to write (1 character)
        syscall
        inc rsi
        jmp print_string_loop0:

    print_string_return:
        pop rdx
        pop rsi
        pop rbx
        pop rax

这有效,但我总是在打印的字符串后得到一些垃圾。

这是使用 print_string

的代码
global _start

section .text

_start:
    mov r8, string
    call print_string

    mov rax, 60 ; syscall (sys_exit)
    mov rdi, 0  ; exit code
    syscall

.section data

string:
    db "Hell! Oh, World.", 10, 0 ; string, newline, null

print_string在同一文件中定义。

那么为什么在我的字符串后打印垃圾?垃圾每次都是一样的,如果我修改程序集,输出不同的垃圾。

您在 R8 中得到了地址,因此在 RSI 中得到了地址而不是字符。所以把中断条件cmp sil, 0改成cmp byte [rsi], 0.