我正在尝试在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
在同一个文件中定义。
那么为什么在我的字符串后打印垃圾?每次垃圾都是一样的,如果我修改了程序集,就会输出不同的垃圾。
答案 0 :(得分:1)
您已进入R8
,因此RSI
地址不是字符。因此,将中断条件cmp sil, 0
更改为cmp byte [rsi], 0
。