如何将输入字符串从用户传递到MIPS程序

时间:2018-12-08 02:04:01

标签: mips palindrome mars

我正在尝试编写汇编语言程序来检测用户输入的短语或字符是否为 回文。

到目前为止,我相信一切都可以正常工作,但是我想知道如何实现此功能,从而需要一个实际的词来进行测试。 当我在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"

但是我还不太能够得到它。

有什么提示吗?

1 个答案:

答案 0 :(得分:0)

Ciao

所以-还将这个问题here用作模板[强烈建议您在发布前检查类似的问题]-您需要在代码中引入.data部分,其中包含input要求用户输入要检查的字符串的字符串

.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个字节/字符]。阅读this link"System Calls and I/O"部分,您会发现[在页面内搜索"Print out string (useful for prompts)"上方的代码段中使用了相同的提示

同一部分中的表格将向您说明li $v0, 4li $v0, 8指令的含义。这是另一个good read。该表将使您理解,在调用打印字符串之前,您必须设置一个参数[$a0],而对于读取字符串操作,则需要两个[$a0$a1] < / p>

在您的代码中,主体从读取字符串操作开始。但是请注意,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

MARS 4.5 output

重要提示:此代码逻辑有一个错误。如果您输入的回文长度为奇数,将给出错误的结果[例如公民被检测为非回文症,但实际上是]