字符串输出函数中的垃圾

时间:2015-02-23 07:42:06

标签: linux assembly nasm

我正在尝试在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在同一个文件中定义。

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

1 个答案:

答案 0 :(得分:1)

您已进入R8,因此RSI地址不是字符。因此,将中断条件cmp sil, 0更改为cmp byte [rsi], 0