它怎么知道什么时候字符串结束没有结束符?(下面的代码)



我在火星上学习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 -遵循UNIXfgets的语义。对于指定长度的n,用户输入的字符串不能超过n-1。如果输入字符串小于该值,则此系统调用将换行符添加到end。在任何一种情况下,这个系统调用都以空字节填充。

因此,在您的情况下,任何78字节或更少的输入字符串都将获得换行符和空终止符。


换行符是一种痛苦,因为我们经常不需要它。

另一个注意,.space 81在程序加载时将为零,因此在第一次系统调用之后,您将看到零填充到末尾,但第二次到相同区域将不一定(即,如果输入更短),因此syscall#8的null终止行为是有用的,并且是必要的-特别是因为服务不返回输入的长度!


另外,请注意MARS在菜单项中有可用的文档:

帮助菜单"MIPS"选项卡→"系统调用"子选项卡

在帮助菜单中也有一些其他有趣的材料/信息。

相关内容

  • 没有找到相关文章

最新更新