如何从 MIPS 中用户输入字符串的偶数和奇数索引中检索和打印字符?

问题描述

我是 MIPS 编码的新手(初学者),这是我从手册中发现的一个练习问题。

我已尽力为用户输入的字符串分配堆内存,以便我可以遍历字符串的索引,但我无法弄清楚或进一步处理。

有人可以解释和指导我如何从偶数奇数索引检索打印字符用户在 MIPS 中使用 MARS 输入的字符串?

我在下面发布了原始问题以及我尝试的代码


编写一个 MIPS 程序,提示用户输入一个 16 位的字符串 称为 ~/.bashrc 的字符。然后使用以下代码实现 下面给出循环:

msg

示例输出

用户输入:for(int j = 0; j < 2; j++) { for(int i = 0; i < 8; i++) { print(msg[(i * 2) + j]); } }

输出"Iamhurtverybadly"

这是我到现在为止写的:

"Imuteyalahrvrbdy"

解决方法

让我们为您的程序集编写 C 代码:

for ( int i = 0,j = 0; i < 2; j++ ) {
    if ( j < 8 ) 
        i++;
    i <<= 1;
    int k = i + j;
}
print("Sample Output: \n");
exit();

这行不通,是吗?您只有一个循环(但有两个循环控制变量)。这不遵循原始代码的模型,它有 2 个循环,并且它们是嵌套的,一个完全在另一个中。此外,您通过在循环内加倍来修改 i 变量。


首先,让我们分步复习循环翻译:

for ( int j = 0; j < 2; j++ ) {
    ...                              // body of for loop
}

将for循环改为while循环:

int j = 0;
while ( j < 2 ) {                    // loop top & test
    ...                              // body of loop
    j++;                             // loop control resumes after body
}

将while循环改为汇编的if-goto-label样式:

    int j = 0;
loop1:                               // loop top
    if ( j >= 2 ) goto loop1Done;    // loop test
    ...                              // body of loop
    j++;                             // loop control
    goto loop1;                      // continue looping
loop1Done:                           // loop done,on to next statement after

现在,让我们进行嵌套循环:

for ( int j = 0; j < 2; j++ ) {      // loop1
    for ( int i = 0; i < 8; i++ ) {  // loop2 (also body of loop1)
        print ( msg [ i*2+j ] );     // body of loop2
    }
}
exit();

将 for 循环改为 while 循环:

int j = 0;
while ( j < 2 ) {
                                     // for loop2 initialization
    int i = 0;                       // <<---- note where i=0 is: inside the outer loop
    while ( i < 8 ) {                // while loop2 top & test
        print ( msg [ i*2+j ] );     // body of loop2
        i++;                         // loop2 control
    }
    j++;                             // loop1 control
}
exit();

嵌套的控制结构应该相互独立地翻译。如果一个控制结构在 C 中嵌套在另一个中,那么它应该完全嵌入到另一个在汇编语言中的翻译中。

将while循环改为汇编的if-goto-label样式:

    int j = 0;
loop1:
    if ( j >= 2 ) goto loop1Done;

                                      // inner for loop2 starts here with initialization
    int i = 0;                        // <<---- note where i=0 is: inside the outer loop

loop2:                                // while loop2 starts here
    if ( i >= 8 ) goto loop2Done;
    print ( msg [ i*2+j ] );          // body of loop2
    i++;                              // loop2 resumes
    goto loop2;
loop2Done:                            // end of loop2

    j++;                              // loop1 resumes
    goto loop1;
loop1Done:                            // end of loop1

    exit();

你能在上面看到外循环和内循环是如何完全关联的,就像它们在 C 中一样:内循环 (2) 完全嵌套在外循环 (1) 中。

以上内容可以轻松翻译成汇编语言,因此我将其留给读者作为练习。在执行 i 时不要修改 ji*2+j - 将它们计算到其他未使用的寄存器中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...