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