我在火星上学习MIPS,我对下面的代码感到困惑。因为当我将输入的字符串加载到保留空间时,即使没有结束符,代码也会正常输出。为什么会这样?我认为每个字符串都需要一个结束符,这样输入缓冲区就知道什么时候停止。是自动填写还是…?提前感谢。代码:
# Filename: mips3.asm
# Author: me
# Program to read a string from a user, and
# print that string back to the console.
.data
prompt: .asciiz "Please enter a string: "
output: .asciiz "nYou typed the string: "
input: .space 81 # Reserve 81 bytes in Data segment
inputSize: .word 80 # Store value as 32 bit word on word boundary
# A word boundary is a 4 byte space on the
# input buffer's I/O bus.
# Word:
# A Word is the number of bits that can be transferred
# at one time on the data bus, and stored in a register
# in mips a word is 32 bits, that is, 4 bytes.
# Words are aways stored in consecutive bytes,
# starting with an address that is divisible by 4
.text
# Input a string.
li $v0, 4
la $a0, prompt
syscall
# Read the string.
li $v0, 8 # Takes two arguments
la $a0, input # arg1: Address of input buffer
lw $a1, inputSize # arg2: Maximum number of characters to read
syscall
# Output the text
li $v0, 4
la $a0, output
syscall
# Print string
li $v0, 4
la $a0, input
syscall
# Exit program
li $v0, 10
syscall
系统调用的MARS文档:
…服务8 -遵循UNIX
…fgets
的语义。对于指定长度的n
,用户输入的字符串不能超过n-1
。如果输入字符串小于该值,则此系统调用将换行符添加到end。在任何一种情况下,这个系统调用都以空字节填充。
因此,在您的情况下,任何78字节或更少的输入字符串都将获得换行符和空终止符。
换行符是一种痛苦,因为我们经常不需要它。
另一个注意,.space 81
在程序加载时将为零,因此在第一次系统调用之后,您将看到零填充到末尾,但第二次到相同区域将不一定(即,如果输入更短),因此syscall#8的null终止行为是有用的,并且是必要的-特别是因为服务不返回输入的长度!
另外,请注意MARS在菜单项中有可用的文档:
帮助菜单"MIPS"选项卡→"系统调用"子选项卡
在帮助菜单中也有一些其他有趣的材料/信息。