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
代码是在同一文件中定义。
那么为什么垃圾被打印后,我的字符串?垃圾每次都是一样的,如果我完全修改程序集,则会输出不同的垃圾。
我不认为你应该在64位上使用int 0x80(http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64)。这使用系统调用而不是int,并使用不同的寄存器。 – 2015-02-23 07:57:58
@DavidWohlferd谢谢你的信息!书签。我会更新问题 – CoffeeandCode 2015-02-23 08:09:23
尝试用'cmp byte [rcx],0'替换'cmp cl,0'。 – rkhb 2015-02-23 08:14:17