C ++ to MIPS — небольшая проблема с операторами if

Программа на C ++:

 int main()
{
char string[256];
int i=0;
char *result = NULL;  // NULL pointer

// Obtain string from user
scanf("%255s", string);

// Search string for letter t.
// Result is pointer to first t (if it exists)
// or NULL pointer if it does not exist
while(string[i] != '\0')
{
if(string[i] == 't')
{
result = &string[i];
break; // exit from while loop early
}
i++;
}

if(result != NULL)
printf("Matching character is %c\n", *result);
else
printf("No match found\n");
}

Код MIPS, который у меня есть:

    .globl main

.text

# main
main:

li $v0,4                # Load value 4
la $a0, msg0            # Load array
syscall

li $v0,8                # Load value 8
la $a0,string           # Load array
syscall                 # Syscall

li $v0,4                # Load immediate value 4
la $a0, string          # Load array
syscall                 # Syscall

la $t0, string          # array
la $t1, result          # array
lb $t2, result          # array

while:
lb $t3, 0($t0)
beq $t3, $0, if2        # if !=0
beq $t3, 't', if        # If = "t"addi $t0, $t0,1         # i++

j while                 # Jump to While

if:
sw $t3, result          # Save result to memory
li $v0,4                # Load value 4
la $a0, found           # Load array
syscall                 # Syscall
j exit

j if2                   # Jump to if2

if2:

li $v0,4                # Load value 4
la $a0, notfound        # Load array
syscall                 # Syscall
j exit

exit:

li $v0, 10
syscall # Exit

.data
msg0: .asciiz "Enter Word: "string: .byte 0:256
i: .word 0
result: .word 0
found: .asciiz "Found!"notfound: .asciiz "Not Found"

Код MIPS, который я написал, кажется, работает, но я думаю, что он не соответствует структуре кода C ++, описанной выше. Я также думаю, что что-то напутал с утверждениями if, но не могу понять, что и как исправить. Любое предложение, как я могу улучшить это?

Спасибо

0

Решение

Как сказал @ user2229152, вы удалили последнюю проверку (if(result != NULL)) и перенес отпечатки на свой if а также if2 блоки.

Таким образом, ваш ассемблерный код по существу соответствует этому:

while(string[i] != '\0')
{
if(string[i] != 't')
{
i++;
} else
{
result = &string[i];
printf("Found!");
goto exit;
}
}

printf("Not found");

exit:
0

Другие решения

Я думаю, что код MIPS следует за кодом C довольно близко. Основное отличие состоит в том, что он практически встроил тест в конце функции в ветку для оптимизации ветки. В то время как петли имеют тенденцию выглядеть неинтуитивно в сборке. Они обычно компилируются во что-то похожее на:

if(test) {
do {
body;
} while(test);
}
1

По вопросам рекламы [email protected]