字符串输出函数中的垃圾
Garbage in string output function
我正在尝试用 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
在同一文件中定义。
那么为什么在我的字符串后打印垃圾?垃圾每次都是一样的,如果我修改程序集,输出不同的垃圾。
您在 R8
中得到了地址,因此在 RSI
中得到了地址而不是字符。所以把中断条件cmp sil, 0
改成cmp byte [rsi], 0
.
我正在尝试用 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
在同一文件中定义。
那么为什么在我的字符串后打印垃圾?垃圾每次都是一样的,如果我修改程序集,输出不同的垃圾。
您在 R8
中得到了地址,因此在 RSI
中得到了地址而不是字符。所以把中断条件cmp sil, 0
改成cmp byte [rsi], 0
.