gpt4 book ai didi

linux - 字符串输出函数中的垃圾

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:38 25 4
gpt4 key购买 nike

我正在尝试用 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

关于linux - 字符串输出函数中的垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28668947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com