我试图解决一个问题,编写汇编语言程序,以检测是否一个短语或字符输入的用户是回文。
我已经做到了这一点,我相信一切都应该工作,但我想知道我如何才能实现这一点,使它需要一个实际的单词来测试。
.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"
但我还没完全弄明白。
有什么建议吗?
1条答案
按热度按时间xggvc2p61#
所以--也把这个问题here作为模板[强烈建议您在发布之前检查类似的问题] --您需要在代码中引入一个
.data
部分,其中包含一个input
字符串,要求用户输入要检查的字符串然后你就可以开始设置逻辑把他们推出去
您将开始询问用户一个字符串[在本例中限制为1024个字节/字符]。阅读this link的
"System Calls and I/O"
部分,您将发现上面的片段中使用了相同的提示[在页面中搜索"Print out string (useful for prompts)"
]。同一节中的表将解释
li $v0, 4
和li $v0, 8
指令的含义。这是另一个good read。同一个表将使您了解,在调用打印字符串之前,您必须设置一个参数[$a0
],而对于读取字符串操作,您将需要两个参数[$a0
和$a1
]在你的代码中,main以一个读字符串操作开始。但是请注意,
string_space
既被用来分配缓冲区的大小,从那里读取[在.data
部分],也被用来要求输入单词[你正在尝试调用string_space: .asciiz "Enter your word:\n"
]。这个问题已经被上面的代码片段修复了如果出现问题,不要忘记仔细检查
string_space
缓冲区的内容:完整代码已测试并在MARS 4.5中运行:
重要提示:此代码逻辑有一个错误。如果输入长度为奇数的回文,则会给予错误结果[例如,civic被检测为非回文,但实际上它是]