2015-02-23 77 views
1

我想寫一個printf更換ASM,到目前爲止,有這樣的代碼:垃圾字符串輸出功能

; 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代碼是在同一文件中定義。

那麼爲什麼垃圾被打印後,我的字符串?垃圾每次都是一樣的,如果我完全修改程序集,則會輸出不同的垃圾。

+0

我不認爲你應該在64位上使用int 0x80(http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64)。這使用系統調用而不是int,並使用不同的寄存器。 – 2015-02-23 07:57:58

+0

@DavidWohlferd謝謝你的信息!書籤。我會更新問題 – CoffeeandCode 2015-02-23 08:09:23

+0

嘗試用'cmp byte [rcx],0'替換'cmp cl,0'。 – rkhb 2015-02-23 08:14:17

回答

1

你已經在R8,因此在RSI地址不是一個字符。因此,將休息條件cmp sil, 0更改爲cmp byte [rsi], 0