我希望我的汇编代码接受用户输入并将其与其他文本一起输出,但输出不正确
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
字节。
但是一次一个问题。
我的代码有效,但输出不正确,因为当我输入名称时,输出变成这样; “你的会员名字是什么?欢迎来到俱乐部,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
字节。
但是一次一个问题。