Ciao,
поэтому - принимая также в качестве шаблона этот вопрос здесь [вам настоятельно рекомендуется проверить подобные вопросы перед публикацией] - вам необходимо ввести в свой код a .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 байтами / символами].Прочитав "System Calls and I/O"
раздел этой ссылки , вы найдете ту же подсказку, которая использовалась во фрагменте выше [search "Print out string (useful for prompts)"
на странице]
Таблица в этом же разделе объяснит вамсмысл инструкций li $v0, 4
и li $v0, 8
.Это еще одно хорошее чтение .Из этой же таблицы вы поймете, что перед вызовом строки для печати вы должны задать один аргумент [$a0
], а для операции чтения строки вам понадобятся два [$a0
и $a1
]
InВаш код 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
ВАЖНО: в этой кодовой логике есть ошибка.Если вы введете палиндромы, длина которых нечетная, это даст неверный результат [например, гражданское право определяется как непалиндром, но на самом деле это так]