我希望我的汇编代码接受用户输入并将其与其他文本一起输出,但输出不正确

I want my Assembly Code to takes user input and outputs it along with other text but the output isn't correct

我的代码有效,但输出不正确,因为当我输入名称时,输出变成这样; “你的会员名字是什么?欢迎来到俱乐部,Bob!!!!!!!!!!!!!!!!!!, 享受派对。”与“!!!!!!”在名称的末尾。我做错了什么?

这是我的汇编代码:

section .data
prompt:       db      "What is your member name? "
prompt_len:   equ     $-prompt
greet1:        db      "Welcome to the club, "
greet1_len:    equ     $-greet1
greet2:        db      ", enjoy the party."
greet2_len:    equ     $-greet2

inputbuffer_len:   equ    256
inputbuffer:       times inputbuffer_len  db '!'

STDIN:        equ     0
STDOUT:       equ     1
SYS_READ:     equ     0
SYS_WRITE:    equ     1
SYS_EXIT:     equ     60

section .text

global _start
 _start:
    mov     rdx,    prompt_len      ;output prompt          
    mov     rax,    SYS_WRITE
    mov     rdi,    STDOUT
    mov     rsi,    prompt    
    syscall
    
    mov     rax,    SYS_READ ;user input here
    mov     rdi,    STDIN
    mov     rsi,    inputbuffer
    mov     rdx,    inputbuffer_len
    syscall
    
    mov     rdx,    greet1_len        ; output "Welcome to the club, "        
    mov     rax,    SYS_WRITE
    mov     rdi,    STDOUT
    mov     rsi,    greet1    
    syscall
    mov     rdx,    rax            ;output user's inputted name
    mov     rax,    SYS_WRITE
    mov     rdi,    STDOUT
    mov     rsi,    inputbuffer    
    syscall
    
    mov     rdx,    greet2_len         ; output ", enjoy the party."         
    mov     rax,    SYS_WRITE
    mov     rdi,    STDOUT
    mov     rsi,    greet2    
    syscall

    mov     rax,    SYS_EXIT
    mov     rdi,    0
    syscall

Bob!!!!!!!!!!!!!!!!!!的长度是Welcome to the club, 的长度。 这并非巧合。 在 write(2) 系统调用之后 rax 包含成功写入的字节数。 (这可能少于手册页描述的所需字节数。)

喜欢你需要注意read(2)的return值。 成功时read(2) returns rax 中读取的字节数。 但是,您正在为中间的 write(2) 系统调用覆盖此值。 在某处存储并调用成功读取的字节数(例如 push/pop),就可以了。

PS: 您可以通过重新安排 greet_1 之后的缓冲区来节省一个 write(2) 系统调用。 然后你可以一次 write(2) rax + greet1_len 字节。 但是一次一个问题。