2015-02-23 78 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