Как передать входную строку от пользователя в программу MIPS - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь решить проблему, чтобы написать программу на языке ассемблера, чтобы определить, является ли фраза или символы, введенные пользователем, палиндромом.

Я дошел до этого и считаю, что все должно работать, но мне интересно, как я могу реализовать это так, чтобы потребовалось реальное слово для проверки.Когда я запускаю в 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 голосов
/ 08 декабря 2018

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

MARS 4.5 output

ВАЖНО: в этой кодовой логике есть ошибка.Если вы введете палиндромы, длина которых нечетная, это даст неверный результат [например, гражданское право определяется как непалиндром, но на самом деле это так]

...