我正在MARS上學習MIPS,我對以下代碼感到困惑。因為當我把輸入的字串加載到一個保留空間時,即使沒有終止符,代碼也能正常輸出。為什么會這樣呢? 我以為每個字串都需要一個結束符,以便輸入緩沖區知道何時停止。 有一個是自動填入的還是......?先謝謝你了。 代碼是:
# Filename: mips3.asm
# 作者:我
# 程式從用戶那里讀取一個字串,并且
# 列印這個字串到控制臺.
.data
prompt: .asciiz "請輸入一個字串。"
輸出:.asciiz "
你輸入了字串。"
input: .space 81 # 在資料段中保留81個位元組
inputSize: .word 80 # 將數值存盤為字邊界上的32位字
# 字邊界是輸入緩沖區I/O總線上的一個4位元組的空間。
# 輸入緩沖區的I/O總線。
# 字。
# 一個字是可以在資料總線上一次傳輸的位元數
# 一次在資料總線上傳輸,并存盤在一個暫存器中的位元數
# 在mips中一個字是32位,也就是4個位元組。
# 字總是以連續的位元組存盤。
# 從一個能被4整除的地址開始
.text
# 輸入一個字串。
li $v0, 4
la $a0, prompt
syscall
# 讀取該字串。
li $v0, 8 # 接收兩個引數
la $a0, input # arg1: 輸入緩沖區的地址
lw $a1, inputSize # arg2: 要讀取的最大字符數
syscall
# 輸出文本
li $v0, 4
la $a0, output
syscall
# 列印字串
li $v0, 4
la $a0, 輸入
syscall
# 退出程式
li $v0, 10
syscall
uj5u.com熱心網友回復:
MARS的系統呼叫檔案:
... 服務8 - 遵循UNIX
fgets的語意。 對于指定的長度n,來自用戶的輸入字串不能超過n-1。 如果輸入字串小于這個長度,這個syscall會在末尾添加換行。在任何一種情況下,這個系統呼叫都會用空位元組進行填充。 ...
因此,在你的情況下,任何78位元組或更少的輸入字串都會得到一個換行和一個空的終止符。
換行是一種痛苦,因為我們經常不需要它。
另外,.space 81在程式加載時將是零,所以在第一個系統呼叫后,你將看到零被填充到末尾,但第二個到相同區域的不一定(即如果輸入更短),所以syscall#8的空終止行為是有用的,也是必要的--特別是由于該服務不回傳輸入的長度!
換行是很麻煩的,因為我們經常想要。
另外,請注意,MARS在一個選單項中提供了檔案:
幫助選單MIPS標簽→Syscall子標簽
在幫助選單中還有一些其他有趣的材料/資訊。轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/320392.html
標籤:
