如何将用户输入的字符串传递给 MIPS 程序
How to pass an input string from user to a MIPS program
我正在尝试解决编写汇编语言程序以检测用户输入的短语或字符是否为
回文。
我已经走到这一步了,我相信一切都应该有效,但我想知道如何实现它,以便它需要一个实际的词来测试。
当我在 MARS 中 运行 时,根本没有输入选项。
.data
string_space: .space 1024
is_palin_msg: .asciiz "The string is a palindrome.\n"
not_palin_msg: .asciiz "The string is not a palindrome.\n"
.text
main:
la $a0, string_space
li $a1, 1024
li $v0, 8
syscall
la $t1, string_space
la $t2, string_space
length_loop:
lb $t3, ($t2)
beqz $t3, end_length_loop
addu $t2, $t2, 1
b length_loop
end_length_loop:
subu $t2, $t2, 2
test_loop:
bge $t1, $t2, is_palin
lb $t3, ($t1)
lb $t4, ($t2)
bne $t3, $t4, not_palin
addu $t1, $t1, 1
subu $t2, $t2, 1
b test_loop
is_palin:
la $a0, is_palin_msg
li $v0, 4
syscall
b exit
not_palin:
la $a0, not_palin_msg
li $v0, 4
syscall
b exit
exit:
li $v0, 10
syscall
我试过了
string_space: .asciiz "Enter your word:\n"
还有
string_space: .asciiz "racecar"
但我还没有完全弄明白。
有什么建议吗?
再见,
所以 - 也将此问题作为模板 here [强烈邀请您在发帖前检查类似问题] - 您需要在代码中引入 .data
部分和 input
string 要求用户输入要检查的字符串
.data
string_space: .space 1024
input: .asciiz "Enter a string: "
is_palin_msg: .asciiz "The string is a palindrome.\n"
not_palin_msg: .asciiz "The string is not a palindrome.\n"
# other strings you may need
然后就可以开始设置推送的逻辑了
.text
main:
li $v0, 4 # system call code for print_str
la $a0, input # address of string to print
syscall # print the input
li $v0, 8 # code for syscall read_string
la $a0, string_space # tell syscall where the buffer is
li $a1, 1024 # tell syscall how big the buffer is
syscall
# double check the buffer content [see the next snippet]
# rest of the code to test
您将开始询问用户一个字符串 [在本例中限制为 1024 bytes/characters]。阅读 this link 的 "System Calls and I/O"
部分,您会发现上面的代码片段中使用了相同的提示 [在页面中搜索 "Print out string (useful for prompts)"
]
同一节中的table将向您解释li $v0, 4
和li $v0, 8
指令的含义。这是另一个 good read。同样的 table 会让你明白在调用打印字符串之前你必须设置一个参数 [$a0
] 而对于读取字符串操作你将需要两个 [$a0
和 $a1
]
在您的代码中,main 从读取字符串操作开始。但请注意 string_space
既用于分配缓冲区的大小,也用于分配从 [.data
部分中读取的位置] 和要求输入单词 [您正在尝试调用 string_space: .asciiz "Enter your word:\n"
].此问题已由上面的代码片段修复
如果遇到问题,请不要忘记仔细检查 string_space
缓冲区的内容:
la $a0, string_space # move buffer into a0
li $v0, 4 # print buffer
syscall
已在 MARS 4.5 中测试并运行的完整代码:
.data
string_space: .space 1024
input: .asciiz "Enter a string: "
is_palin_msg: .asciiz "The string is a palindrome.\n"
not_palin_msg: .asciiz "The string is not a palindrome.\n"
.text
main:
li $v0, 4 # system call code for print_str
la $a0, input # address of string to print
syscall # print the input
la $a0, string_space
li $a1, 1024
li $v0, 8
syscall
#la $a0, string_space # move buffer into a0
#li $v0, 4 # print buffer
#syscall
la $t1, string_space
la $t2, string_space
length_loop:
lb $t3, ($t2)
beqz $t3, end_length_loop
addu $t2, $t2, 1
b length_loop
end_length_loop:
subu $t2, $t2, 2
test_loop:
bge $t1, $t2, is_palin
lb $t3, ($t1)
lb $t4, ($t2)
bne $t3, $t4, not_palin
addu $t1, $t1, 1
subu $t2, $t2, 1
b test_loop
is_palin:
la $a0, is_palin_msg
li $v0, 4
syscall
b exit
not_palin:
la $a0, not_palin_msg
li $v0, 4
syscall
b exit
exit:
li $v0, 10
syscall
重要提示:此代码逻辑存在错误。如果您输入长度为奇数的回文,则会给出错误的结果 [例如civic被检测为非回文但实际上是]
我正在尝试解决编写汇编语言程序以检测用户输入的短语或字符是否为 回文。
我已经走到这一步了,我相信一切都应该有效,但我想知道如何实现它,以便它需要一个实际的词来测试。 当我在 MARS 中 运行 时,根本没有输入选项。
.data
string_space: .space 1024
is_palin_msg: .asciiz "The string is a palindrome.\n"
not_palin_msg: .asciiz "The string is not a palindrome.\n"
.text
main:
la $a0, string_space
li $a1, 1024
li $v0, 8
syscall
la $t1, string_space
la $t2, string_space
length_loop:
lb $t3, ($t2)
beqz $t3, end_length_loop
addu $t2, $t2, 1
b length_loop
end_length_loop:
subu $t2, $t2, 2
test_loop:
bge $t1, $t2, is_palin
lb $t3, ($t1)
lb $t4, ($t2)
bne $t3, $t4, not_palin
addu $t1, $t1, 1
subu $t2, $t2, 1
b test_loop
is_palin:
la $a0, is_palin_msg
li $v0, 4
syscall
b exit
not_palin:
la $a0, not_palin_msg
li $v0, 4
syscall
b exit
exit:
li $v0, 10
syscall
我试过了
string_space: .asciiz "Enter your word:\n"
还有
string_space: .asciiz "racecar"
但我还没有完全弄明白。
有什么建议吗?
再见,
所以 - 也将此问题作为模板 here [强烈邀请您在发帖前检查类似问题] - 您需要在代码中引入 .data
部分和 input
string 要求用户输入要检查的字符串
.data
string_space: .space 1024
input: .asciiz "Enter a string: "
is_palin_msg: .asciiz "The string is a palindrome.\n"
not_palin_msg: .asciiz "The string is not a palindrome.\n"
# other strings you may need
然后就可以开始设置推送的逻辑了
.text
main:
li $v0, 4 # system call code for print_str
la $a0, input # address of string to print
syscall # print the input
li $v0, 8 # code for syscall read_string
la $a0, string_space # tell syscall where the buffer is
li $a1, 1024 # tell syscall how big the buffer is
syscall
# double check the buffer content [see the next snippet]
# rest of the code to test
您将开始询问用户一个字符串 [在本例中限制为 1024 bytes/characters]。阅读 this link 的 "System Calls and I/O"
部分,您会发现上面的代码片段中使用了相同的提示 [在页面中搜索 "Print out string (useful for prompts)"
]
同一节中的table将向您解释li $v0, 4
和li $v0, 8
指令的含义。这是另一个 good read。同样的 table 会让你明白在调用打印字符串之前你必须设置一个参数 [$a0
] 而对于读取字符串操作你将需要两个 [$a0
和 $a1
]
在您的代码中,main 从读取字符串操作开始。但请注意 string_space
既用于分配缓冲区的大小,也用于分配从 [.data
部分中读取的位置] 和要求输入单词 [您正在尝试调用 string_space: .asciiz "Enter your word:\n"
].此问题已由上面的代码片段修复
如果遇到问题,请不要忘记仔细检查 string_space
缓冲区的内容:
la $a0, string_space # move buffer into a0
li $v0, 4 # print buffer
syscall
已在 MARS 4.5 中测试并运行的完整代码:
.data
string_space: .space 1024
input: .asciiz "Enter a string: "
is_palin_msg: .asciiz "The string is a palindrome.\n"
not_palin_msg: .asciiz "The string is not a palindrome.\n"
.text
main:
li $v0, 4 # system call code for print_str
la $a0, input # address of string to print
syscall # print the input
la $a0, string_space
li $a1, 1024
li $v0, 8
syscall
#la $a0, string_space # move buffer into a0
#li $v0, 4 # print buffer
#syscall
la $t1, string_space
la $t2, string_space
length_loop:
lb $t3, ($t2)
beqz $t3, end_length_loop
addu $t2, $t2, 1
b length_loop
end_length_loop:
subu $t2, $t2, 2
test_loop:
bge $t1, $t2, is_palin
lb $t3, ($t1)
lb $t4, ($t2)
bne $t3, $t4, not_palin
addu $t1, $t1, 1
subu $t2, $t2, 1
b test_loop
is_palin:
la $a0, is_palin_msg
li $v0, 4
syscall
b exit
not_palin:
la $a0, not_palin_msg
li $v0, 4
syscall
b exit
exit:
li $v0, 10
syscall
重要提示:此代码逻辑存在错误。如果您输入长度为奇数的回文,则会给出错误的结果 [例如civic被检测为非回文但实际上是]