我的代碼有效,但輸出不正確,因為當我輸入名稱時,輸出變成了這個;“你的會員叫什么名字?歡迎來到俱樂部,鮑勃!!!!!!!!!!!!!!!!!!,享受派對。” 與“!!!!!!” 在名稱的末尾。我究竟做錯了什么?
這是我的匯編代碼:
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
uj5u.com熱心網友回復:
的長度Bob!!!!!!!!!!!!!!!!!!是 的長度Welcome to the club, 。這不是巧合。write(2)系統呼叫之后rax包含成功寫入的位元組數。(這可能少于手冊頁描述的所需位元組數。)
就像David C. Rankin 評論的那樣,您需要注意read(2).
成功時,read(2)回傳讀入的位元組數rax。write(2)但是,您正在為介入的系統呼叫覆寫這個值。在某處存盤并呼叫成功讀取的位元組數(例如push/ pop),你就很好了。
PS:您可以write(2)通過重新排列緩沖區來保存一個系統呼叫,以跟隨greet_1. 然后你可以write(2) rax greet1_len一次位元組。但一次一個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424419.html
