Замените указанный c символ строки, используя mips - PullRequest
0 голосов
/ 17 марта 2020

Я пытался заменить указанный c символ строки, используя mips. Программа похожа на то, как пользователь должен ввести строку, которая ограничена 40 символами, и программа должна спросить пользователя, хотят ли они заменить какой-либо символ строки или нет. В моем коде я смог напечатать только один символ, вот мой код:

.data
prompt0: .asciiz " Please Enter any String :"
prompt:.asciiz "\n Your current string is: "
prompt1:.asciiz "\n Do you want to make any changes to the string? (y/n): " 
prompt2: .asciiz "\n Please Enter the Character that you want to Search for :"
prompt3: .asciiz "\n Please Enter the New Character :  "
prompt4: .asciiz "\n Your Final string is: "
 yes: .asciiz "y"
 No :.asciiz "n"
 Buffer: .space 40
.text
 li $v0, 4
 la $a0, prompt0
 syscall 

 li $v0,8        # take in input
 la $a0, Buffer      # load byte space into address
 li $a1, 40          # allot the byte space for string
 move $t0,$a0        # save string to t0
 syscall

li $v0,4
la $a0,prompt        # load and print "you wrote" string
syscall

la $a0, Buffer       # reload byte space to primary address
move $a0,$t0         # primary address = t0 address (load pointer)
li $v0,4         # print string
syscall



Loop:
    # Ask if user want to chnge rthe string or not
li $v0, 4     # syscall 4 (print_str)
la $a0, prompt1  # argument: string
syscall

     # GET INPUT FROM USER
li   $v0, 8   # get input
la   $a0, Buffer    # load byte space into address
li   $a1, 2         # allot the byte space for string
 move $t0,$a0        # save string to t0
syscall
#EDIT
lb $t1, yes  
lb $t0, 0($t0)   

#END EDIT

bne $t0, $t1, Exit

#IF YES, PRINT MESSAGE
li $v0,4
la $a0,prompt2
syscall


li $v0, 8   #get input
la $a0, Buffer  #load byte space into address
li $a1, 2      # allot the byte space for string
sw $t0,($a0)    #save string to t0
syscall

li $v0,4
la $a0,prompt3
syscall

li $v0, 8   #get input
la $a0, Buffer  #load byte space into address
li $a1, 2      # allot the byte space for string
move $t0,$a0    #save string to t0
syscall


la $a0,prompt     #load and print "you wrote" string
li $v0,4
syscall


la $a0, Buffer  #reload byte space to primary address
move $a0,$t0    # primary address = t0 address (load pointer)
li $v0,4        # print string
syscall
j Loop


 Exit:

li $v0,10       #end program
syscall 
     jr $ra     

Вот моя C программа, которую я хочу преобразовать в мипы:

#include <stdio.h>
#include <string.h>

int main()
{
    char str[40], ch, Newch;
    int i;

    printf("\n Please Enter any String :  ");
    gets(str);

    printf("\n Please Enter the Character that you want to Search for :  ");
    scanf("%c", &ch);

    getchar();

    printf("\n Please Enter the New Character :  ");
    scanf("%c", &Newch);

    for(i = 0; i <= strlen(str); i++)
    {
        if(str[i] == ch)  
        {
            str[i] = Newch;
        }
    }

    printf("\n The Final String after Replacing All Occurrences of '%c' with '%c' = %s ", ch, Newch, str);

    return 0;
}

1 Ответ

0 голосов
/ 23 марта 2020

A для l oop переводится в сборку следующим образом:

for ( initializer; condition; increment ) {
    body
}

сначала преобразуйте это в некоторое время l oop в C:

initializer;
while ( condition ) {
    body
    increment
}

затем переведите while в сборку следующим образом:

LoopTop:
    if ( ! condition ) goto ExitTheLoop;
    body
    increment
    goto LoopTop;
ExitTheLoop:

Печатная часть проста, просто напечатайте каждый отдельный компонент, каждый со своим системным вызовом. Ваш оператор print будет разбит на печать константной строки, за которой следует переменный символ, за которым следует константная строка, другой переменный символ, константная строка, ваша переведенная строка и, наконец, один пробел или константная строка, содержащая пробел: 7 отдельных системные вызовы всего.

...