Я не знаю, как проверить, если строка симметрична c или не в мипах - PullRequest
0 голосов
/ 12 апреля 2020

Я новичок в StackOverFlow, у меня проблемы, и мне нужна ваша помощь. Я студент, и мне нужно написать программу MIPS, которая проверяет, является ли одна строка symmteri c. * sample matrix c строк: ana, asddsa, fillif и т. д.

Это моя первая строка кода, в которой я читаю строку в массив, но я застрял в части симметрии c.

.data

array: .space 50 # char a[50];
.text

readText:

    li $v0,8 # input
    la $a0,array # loadiraj memorija vo adresata
    li $a1,20 #obezbedi memorija za string
    move $t0,$a0 #zachuvaj string vo $t0
    syscall

symmetry:

Пожалуйста, дайте мне мнение, как мне начать с симметрии. Спасибо

1 Ответ

0 голосов
/ 13 апреля 2020

Ссылки на массивы выполняются с помощью арифметического указателя c. Сначала мы должны узнать расположение переменных string1 и i. Давайте предположим, что string1 в $a0 и i в $t0. Нам нужно будет добавить эти две переменные вместе. Всякий раз, когда мы выполняем арифметическую операцию c, мы должны отправлять результат куда-нибудь, и здесь идея состоит в том, чтобы отправить результат в новый еще неиспользованный регистр, скажем $t1. ($a0 и $t0 в этом сценарии было бы плохим местом для отправки результата, поскольку эти регистры содержат значения, которые нам понадобятся позже в текущей или следующей итерации l oop.)

add $t1, $a0, $t0

Следующая разыменование этого временного указателя с использованием lbu:

lbu $t2, 0($t1)

, снова нацеленного на неиспользуемый регистр.

Версия C с использованием трехадресный код будет выглядеть так:

char *p;
char ch;

p = string1 + i;
char ch = *p;

Сравнение выполняется либо с помощью инструкции beq, либо bne, в обоих из которых для сравнения используются два регистра (соответственно, для равенства или неравенства) и цель ветвления в виде метки.

Мы используем условные ветки, чтобы пропустить вперед if-then. Идея состоит в том, чтобы рассуждать, когда пропустить часть then, а когда пропустить, противоположно условию if, как мы записали бы его в C. В сборке: пропустите это, если это, тогда как в C: сделайте это, если это. Таким образом, при сборке проверяется противоположное условие, чтобы пропустить потом часть.

...